语音信号的采集和频谱分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语音信号的采集和频谱分析:
[y,fs,bits]=wavread('voice'); %读取音频信息(双声道,16位,频率44100Hz)sound(y,fs,bits); %回放该音频
Y=fft(y,4096); %进行傅立叶变换
subplot(211);
plot(y);
title('声音信号的波形');
subplot(212)
plot(abs(Y));
title('声音信号的频谱');
窗函数设计低通滤波器:
fp=1000;
fc=1200;
as=100;
ap=1;
fs=22000;
wp=2*fp/fs;
wc=2*fc/fs;
N=ceil((as-7.95)/(14.36*(wc-wp)/2))+1;
beta=0.1102*(as-8.7);
window=Kaiser(N+1,beta);
b=fir1(N,wc,window);
freqz(b,1,512,fs);
结果:
滤波:
[y,fs,bits]=wavread('voice');
d=filter(b,a,y);
D=fft(d);
subplot(211)
plot(d);
title('滤波后的声音波形')
subplot(212)
plot(abs(D))
title('滤波后的声音频谱')
回放:
sound(d,fs,bits)
与滤波之前相比,噪音明显降低了许多。
过零率的计算要用下面的代码:
zcr = zeros(size(y,1)1);
delta= 0.02;
for i=1:size(y,1)
x=y(i,:);
for j=1;length(x)-1
if x(j)*x(j+1)<0 &abs(x(j)-x(j+1))>delta
zcr(i)=zcr(i)+1;
end
end
end
其中设置了门限delta=0.02。这是个经验值,可以进行细微的调整。在此条件下可以得到如图所示的过零率波形。与过零率曲线画在一起的是原始的语音信号波形,可以看到,语音信号音母部分的幅度比较低,但是其过零率的数值却很高,峰值将近50,而后面的韵母部分过零率则比较低,在20左右。
加矩形窗的短时能量函数:
a=wavread('F:\WO.wav');
subplot(6,1,1),plot(a);
N=32;
for i=2:6
h=linspace(1,1, (i-1)*N);%形成一个矩形窗,长度为N
En=conv(h,a.*a);%求卷积得其短时能量函数En
subplot(6,1,i),plot(En);
if(i==2) legend('N=32');
elseif(i==3) legend('N=64');
elseif(i==4) legend('N=128');
elseif(i==5) legend('N=256');
elseif(i==6) legend('N=512');
end
end
加hamming窗的短时能量函数:
把h=linspace(1,1, (i-1)*N);
改为h1=hamming((i-1)*N);
加矩形窗的短时平均幅度:
a=wavread('F:\WO.wav');
subplot(6,1,1),plot(a);
N=32;
for i=2:6
h=linspace(1,1,(i-1)*N);%形成一个矩形窗,长度为N
En=conv(h,abs(a));%求卷积得其短时能量函数En
subplot(6,1,i),plot(En);
if(i==2) legend('N=32');
elseif(i==3) legend('N=64');
elseif(i==4) legend('N=128');
elseif(i==5) legend('N=256');
elseif(i==6) legend('N=512');
end
end
短时过零率:
a=wavread('F:\WO.wav');
n=length(a);
N=320;
subplot(3,1,1),plot(a);
h=linspace(1,1,N);%形成一个矩形窗,长度为N En=conv(h,a.*a);%求卷积得其短时能量函数En subplot(3,1,2),plot(En);
for i=1:n-1
if a(i)>=0
b(i)= 1;
else
b(i) = -1;
end
if a(i+1)>=0
b(i+1)=1;
else
b(i+1)=-1;
end
w(i)=abs(b(i+1)-b(i));
end%求出每相邻两点符号的差值的绝对值
k=1;
j=0;
while (k+N-1) Zm(k)=0; for i=0:N-1; Zm(k)=Zm(k)+w(k+i); end j=j+1; k=k+160; %每次移动半个窗 end for w=1:j Q(w)=Zm(160*(w-1)+1)/640;%短时平均过零率end subplot(3,1,3),plot(Q);