语音信号的采集和频谱分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档