男女声识别系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
男女声判别
赵浩(15133105)
电子学院
电子与通信工程2015—2
摘要
本文通过对男性和女性声音语言特征的研究,发现男女声的基音频率存在较大的差异,并利用MATLAB设计并运行了基于基音频率分析的男女声识别系统的算法。
关键词:男女声识别基音频率MATLAB
一.引言
人类基音的范围约为70—350Hz左右,由于生理结构的不同,男性与女性的声音呈现出不同的听觉特征,男声的基音频率大都在100—200Hz之间,而女声则在200—350Hz 之间;在会话中,同一发声者的基音频率变化的统计结果,如图一所示。
女声与男声相比,前者的平均值、标准差都为后者的两倍左右。
不同发音者的基音频率分布如图二所示,在对数轴上男声,女声f分别呈现正态分布,男声的基音频率的平均值和标准差分别为125Hz及20Hz。
女声约为男声的2倍。
鉴于男女声音在基音频率的明显差异,基音频率可作为男女声识别的依据。
二.设计任务和要求
1.要求:通过音频分析,识别出男声与女声。
2.任务:(1)录若干个男声、女声信号。
(2)分析信号的频谱,观察不同性别声音信号的频谱特点。
(3)设计识别算法,判断出男声、女声。
三.方案论证
利用低通滤波器滤除多次谐波及共振峰等高频成分得到近似的基音信号,此法可以用硬件电路构成滤波器实现基音信号的粗略提取,避免了大量算法分析和数据处理,实现起来相当简单。
为了证明这种方法的有效性,用计算机声卡录制了近10名男女同学的单音、词组和句子的WAV文件。
在MATALB上编写程序进行仿真。
四.方案实现
1.将男女声信号通过400Hz低通滤波后的仿真波形进行比较,我们将男女声信号通
过八阶低通滤波器,其截至止频率设定为400Hz,仿真结果如图三所示。
从图形上
我们可以看到,通过400Hz的低通滤波器后,男女声输出为约120Hz左右周期性
信号(非单频正弦波);女声输出约250Hz左右周期性信号,其波形接近正弦波。
这说明经过400Hz低通滤波器后,女声声音主要由基音信号构成,而男性声音的
非正弦性是由于其二次谐波及共振峰的存在的结果。
2.将男女声信号通过200Hz低通滤波器后的仿真波形进行比较。
将男、女声输入信
号经过八阶数字滤波器滤波,截止频率设定为200Hz。
男声、女声及其通过200Hz 低通滤波后的波形如图四所示:
从上面的波形我们看出,经过200Hz的低通滤波器,男声输出为较好的正弦波(基音信号),而女生基本上没有信号通过。
附录
MATLAB程序function ds(file,r)
[y,fs]=audioread(file);
y=y(:,1);
yy=downsample(y,r); %降采样
t=interp(yy,r); %插值
n=0:length(t)-1; %建立一个信号等长的序列time=n/fs; %建立时间序列,作为横坐标subplot(2,1,1); %图1:时域波形图
plot(time,t); %作图
title('音频信号波形图') %标题
xlabel('时间/s'); %标注横坐标
ylabel('幅值'); %标注纵坐标
grid on; %打开网格线
%=======频域图像======
N=length(t); %取信号矩阵的长度
Y1=fft(t,N); %N点傅里叶变换
mag=abs(Y1); %取模
f=n*fs/N; %频率序列
subplot(2,1,2); %图2:频谱图
%取1/2作图
plot(f(1:fix(N/2)),mag(1:fix(N/2)));
title('音频信号fft频谱图');%标题
xlabel('频率/Hz'); %标注横坐标
ylabel('幅度'); %标注纵坐标
grid on; %打开网格线
%======基音频率提取======
[~,index]=max(t);
timewin=floor(0.015*fs);
xwin=t(index-timewin:index+timewin);
[y,~]=xcov(xwin);
ylen=length(y);
halflen=(ylen+1)/2 +30;
yy=y(halflen: ylen);
[~,maxindex] = max(yy);
fmax=fs/(maxindex+30);
disp([file,'基音频率为 ', num2str(fmax), ' Hz']) %======通过基因频率判断男女声======
if fmax<250;
disp([file,' 是男声文件']); else
disp([file,' 是女声文件']); end;
sound(t,fs);。