1、用 Matlab 编程实现语音信号的短时分析课程设计1 / 8目录一、目的 .2二、原理及方法 .2三、实验步骤 .2四、实验结论与分析 .2五、心得体会 .4六、附录 .4用 Matlab 编程实现语音信号的短时分析课程设计2 / 8用 Matlab 编程实现语音信号的短时分析一、目的1.在理论学习的基础上,进一步地理解和掌握语音信号短时分析的意义,短时时域分析的基本方法。2.进一步理解和掌握语音信号短时平均能量函数及短时平均过零数的计算方法和重要意义。二、原理及方法一定时宽的语音信号,其能量的大小随时间有明显的变化。其中清音段(以清音为主要成份的语音段) ,其能量比浊音段小得多。短时过零数
2、也可用于语音信号分析中,发浊音时,其语音能量约集中于 3kHz 以下,而发清音时,多数能量出现在较高频率上,可认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数,因而,对一短时语音段计算其短时平均能量及短时平均过零数,就可以较好地区分其中的清音段和浊音段,从而可判别句中清、浊音转变时刻,声母韵母的分界以及无声与有声的分界。这在语音识别中有重要意义。三、实验步骤(1)从网上找了一段录音,采样率为 8KHZ,量化精度为 16 比特线性码。(2)利用设计方案中给定的公式分别编程计算这段语音信号的短时能量、短时平均幅度、短时过零率,然后分别画出它们的曲线;(3)然后画出短时零能比曲线。(4)
3、根据上述结果判断找出其中的一帧浊音信号和一帧清音信号。判断依据是,浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。浊音,取 13270-13510 个点,清音,取 12120-12360 个点。分别计算他们的短时自相关函数和平均幅度差函数;(5)根据图形,分析浊音段语音的基音周期。用 Matlab 编程实现语音信号的短时分析课程设计3 / 8四、实验结论与分析(1)从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。清音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。(2)浊音:短时能量
4、大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。(3)基音提取消除共振峰的影响。从画出的图形中间可以看出,没有加滤波器的声音信号处理后共振峰的影响很大。但是加一个 60500Hz 的带通滤波器,利用滤波后的信号进行基因估计,这样可除去大部分共振峰的影响,自相关函数和短时平均幅度差函数具有更尖锐地峰值,有利于判决地准确性。(4)画出的波形如下所示:图 1 为没有加窗 nowindow.wav, ,无滤波,图 2 为加窗后的语音信号为 havewindow.wav,有滤波。图 1 没有滤波的第一列的图形从上到下分别表示:短时能量、短时平均幅度、短时过零率和零能比曲
5、线,第二列从上到下分别为浊音的短时自相关函数、短时平均幅度差函数和轻清音的短时自相关函数、短时平均幅度差函数。图 1用 Matlab 编程实现语音信号的短时分析课程设计4 / 8图 2五、心得体会在本次的课程设计中,通过自己查找资料,修改程序,最后得出了基音频率。这种以实验方式学习的过程,加深了我对语音信号理论知识的理解,在设计中,也使我获得了很多新的知识,熟练对 matlab 的使用,对 MATLAB 的应用也更加熟练了。总的说来,这个实验在周老师的指导下完成,感谢周老师在这个课程教会了我们很多关于语音处理的知识。六、附录源程序:% 没有加窗 nowindow.wavN=240Y=WAVRE
6、AD(nowindow,1 18000);L=length(Y)%30 秒,每秒 8000 个点,一共 240000 个点LL=length(Y)/N %一共 1000 帧figure(1)set(1,Position,10,35,350,650)%短时能量 Em=zeros(1,(LL-1)*240);for ii=1:(LL-1)*240,temp=Y(ii:ii+240);Em(ii)=sum(temp.*temp);endsubplot(4,1,1)jj=1:(LL-1)*240; plot(jj, Em,b);grid% axis(12000,16000,0.15,0.4)%短时平均
7、幅度 Mn=sum(abs(Y)/NMn=zeros(1,(LL-1)*240);for ii=1:(LL-1)*240,temp=Y(ii:ii+240);Mn(ii)=sum(abs(temp)/N;endfigure(1)用 Matlab 编程实现语音信号的短时分析课程设计5 / 8subplot(4,1,2)jj=1:(LL-1)*240; plot(jj, Mn,b);grid% axis(12000,16000,0.02,0.04)%短时过零率 Zn=zeros(1,(LL-1)*240);for ii=2:(LL-1)*240,temp1=sign(Y(ii:ii+240);te
8、mp=sign(Y(ii-1:ii+240-1);Zn(ii)=sum(abs(temp1-temp);endfigure(1)subplot(4,1,3)jj=1:(LL-1)*240; plot(jj, Zn,b);grid% axis(12000,16000,0,20)%零能比曲线figure(1)subplot(4,1,4)jj=1:(LL-1)*240; plot(jj, Zn./Em,b);grid% axis(12000,16000,0,100)% % Wn=60/8000 ,500/8000% n=1:240;% B = FIR1(239,Wn,bandpass);%浊音,取
9、13270-13510 个点%短时自相关函数temp=Y(13271:13510);% % wc1 = 0.0075; wc2 = 0.9625; % wn = wc1/pi,wc2/pi;% h = fir1(239,wn,blackman(240);% h=reshape(h,240,1);% temp= temp.*abs(h);% % %temp2=reshape(temp,1,240);%temp=temp2.*B;Rn1=zeros(1,240);for nn=1:240,for ii=1:240-nn,Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);
10、endendfigure(2)set(2,Position,400,35,350,650) subplot(4,1,1)jj=1:240;plot(jj, Rn1,b);grid%axis(9,50,-0.01,0.02)%短时平均幅度差函数Yn1=zeros(1,240);for nn=1:240,for ii=1:240-nn,Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii);endendfigure(2)subplot(4,1,2)jj=1:240;plot(jj, Yn1,b);grid%清音,取 12120-12360 个点%短时自相关函数temp
11、=Y(12121:12360);% %temp2=reshape(temp,1,240);%temp=temp2.*B;Rn2=zeros(1,240);用 Matlab 编程实现语音信号的短时分析课程设计6 / 8for nn=1:240,for ii=1:240-nn,Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);endendfigure(2)subplot(4,1,3)jj=1:240;plot(jj, Rn2,b);grid%axis(9,50,-0.01,0.02)%短时平均幅度差函数Yn2=zeros(1,240);for nn=1:240,for
12、ii=1:240-nn,Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii);endendfigure(2)subplot(4,1,4)jj=1:240;plot(jj, Yn2,b);grid%加窗后的语音信号为 havewindow.wavN=240Y=WAVREAD(havewindow,1 18000);L=length(Y)%30 秒,每秒 8000 个点,一共 240000 个点LL=length(Y)/N %一共 1000 帧figure(1)set(1,Position,10,35,350,650)%短时能量 Em=zeros(1,(LL-1)*
13、240);for ii=1:(LL-1)*240,temp=Y(ii:ii+240);Em(ii)=sum(temp.*temp);endsubplot(4,1,1)jj=1:(LL-1)*240; plot(jj, Em,b);grid% axis(0,(LL-1)*240,0,0.6)% axis(12000,16000,0,0.06)%短时平均幅度 Mn=sum(abs(Y)/NMn=zeros(1,(LL-1)*240);for ii=1:(LL-1)*240,temp=Y(ii:ii+240);Mn(ii)=sum(abs(temp)/N;endfigure(1)subplot(4,
14、1,2)jj=1:(LL-1)*240; plot(jj, Mn,b);grid% axis(12000,16000,0,0.015)%短时过零率 Zn=zeros(1,(LL-1)*240);for ii=2:(LL-1)*240,temp1=sign(Y(ii:ii+240);temp=sign(Y(ii-1:ii+240-1);Zn(ii)=sum(abs(temp1-temp);endfigure(1)subplot(4,1,3)jj=1:(LL-1)*240; plot(jj, Zn,b);grid% axis(12000,16000,0,60)%零能比曲线figure(1)subp
15、lot(4,1,4)jj=1:(LL-1)*240; 用 Matlab 编程实现语音信号的短时分析课程设计7 / 8plot(jj, Zn./Em,b);grid%axis(12000,16000,0,3*107)% % Wn=60/8000 ,500/8000% n=1:240;% B = FIR1(239,Wn,bandpass);%浊音,取 13270-13510 个点%短时自相关函数temp=Y(13271:13510);% %temp2=reshape(temp,1,240);%temp=temp2.*B;Rn1=zeros(1,240);for nn=1:240,for ii=1:
16、240-nn,Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);endendfigure(2)set(2,Position,400,35,350,650) subplot(4,1,1)jj=1:240;plot(jj, Rn1,b);grid%axis(9,50,-0.01,0.02)%短时平均幅度差函数Yn1=zeros(1,240);for nn=1:240,for ii=1:240-nn,Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii);endendfigure(2)subplot(4,1,2)jj=1:240;plot(j
17、j, Yn1,b);grid%清音,取 12120-12360 个点%短时自相关函数temp=Y(12121:12360);% %temp2=reshape(temp,1,240);%temp=temp2.*B;Rn2=zeros(1,240);for nn=1:240,for ii=1:240-nn,Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);endendfigure(2)subplot(4,1,3)jj=1:240;plot(jj, Rn2,b);grid%axis(9,50,-0.01,0.02)%短时平均幅度差函数Yn2=zeros(1,240);for nn=1:240,for ii=1:240-nn,Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii);endendfigure(2)subplot(4,1,4)jj=1:240;plot(jj, Yn2,b);grid用 Matlab 编程实现语音信号的短时分析课程设计8 / 8