南京邮电大学通达学院实验报告实验名称语音时频参数的提取和应用实验语音编码实验课程名称信息处理技术专业综合实验班级学号姓名开课时间2016/2017学年,第二学期实验一语音时频参数的提取和应用一、实验目的熟悉基本的语音时频参数提取方法,观察并比较各类参数采用不同提取方法的效果,了解这些时频参数在语音处理中的应用。二、实验内容1、编写并调试语音时域参数提取程序,包括短时功率、短时过零率等函数。2、编写并调试语音频域参数提取程序,包括频谱、语谱图、基音频率、共振峰等。3、利用提取出的时频参数对语音信号进行静/清/浊音的划分。三、实验原理语音信号具有短时平稳性,需对其进行分段(帧)处理(帧长一般取10至30ms之间)。根据激励方式的不同,语音信号可以分成浊音和清音两大类:浊音:激励源可模拟成准周期性的脉冲串。该周期称为基音周期,其倒数就是基音频率,基音频率一般在几百赫兹以内。清音:激励源可模拟成随机白噪声。简化的语音生成数学模型如图所示:准周期脉冲序列发生器随机噪声发生器基音周期时变线性系统浊音清音增益控制时变参数语音取样值对语音时\频波形进行绘制与观察,有助于了解语音的清/浊音等特性。对基音周期等声门参数和共振峰等声道参数进行提取与分析,是语音处理与应用的重要内容。对于时变语音信号)(nx,可以计算它的短时功率)(mPx和短时过零率)(mZx。第m帧(帧长为N个样点)的功率计算公式为:21)(1)(mNmnxnxNmP过零率计算公式为:mNmnxnxsignnxsignNmZ12)}1({)}({1)(对于浊音语音,可以利用其频谱)(X具有丰富的谐波分量的特点,求出其谐波乘积谱,计算公式为:RrrXHPSx1)()(式中,R一般取为5。在谐波乘积谱中,基频分量变得很大,更易于估计基音周期。四、实验方法及程序1.调用matlab中的wavread和wavplay读入并播放语音文件。2.调用fft命令计算语音的频谱。3.调用specgram命令得到语音的语谱图。4.调用plot命令绘制并观察语音的时\频域波形。5.根据短时功率、短时过零率、谐波乘积谱的计算公式,编写分别用以计算短时功率、短时过零率、基音频率的函数:functionPx=stpower、functionZx=stzerocross(x,N)和functionHPSx=hpspectrum(x,N,R)。6.利用短时功率和短时过零率这两个参数可以对语音信号进行浊音/清音分类。编写实现此分类功能的函数voiunvoi.m。五、实验结果与分析1.清音和浊音的短时功率、短时过零率各有何特点?清音段的能量一般比浊音段的小得多。浊音时能量集中于较低频率段内,具有较低的过零率,而清音时能量集中于较高频率段内,具有较高的过零率。2.如何利用短时功率和短时过零率这两个参数对语音信号进行浊音/清音的分类?发浊音时,由于声门波引起了谱的高频跌落。所以其语音能量集中在3kHz以下;发清音时,多数能量出现在高频。高频率意味着高的平均过零率,低频率意味着低的平均过零率,一般可认为浊音具有较低的平均过零率,清音具有较高的平均过零率。3.如何根据时域波形估计各帧元音的基音周期?看图可知四帧语音的周期均为0.01s,第一帧0~100Hz有10个峰值点,基频约为10Hz,第二帧0~100Hz有5个峰值点,基频约为20Hz,第三帧0~100Hz有5个峰值点,基频约为20Hz,第四帧0~100Hz有4个峰值点,基频约为25Hz。4.如何根据基于DFT的对数幅度谱估计某幀浊音的基音周期?0~1172为一个基因周期。5.如何根据基于DFT的对数幅度谱,估计出共振峰频率?有7个峰点,因此基频约为167。6.时域对语音信号进行加窗,反映在频域,其窗谱对基于DFT的对数幅度谱有何影响?如何估计出窗谱的主瓣宽度?因为时间窗幅度的傅立叶变换为脉冲状态,则频谱偏差很小,当定常过程x(n)的平均值β为零且N很大时E[TN(ω)]=f(ω)(12)所以加窗的周期图TN(ω)是频谱密度函数的无偏估计。固有TN(ω)=[1+ξ(ω)]f(ω)。如果原始信号的频谱成份与FFT中的谱线完全一致,这种情况下采样数据的长度为信号周期的整数倍,频谱中只有主瓣。7.如何根据窄带、宽带语谱图,提取出语音的基音和共振峰轨迹?在基音提取中,广泛采用语音波形或误差信号波形的低通滤波。提取共振峰特性最简便的手段是使用语谱仪。提取共振峰还有倒谱法、LPC分析法等更为有效、准确的方法。(做完试验后,记住要回答这些问题)实验过程记录与结果分析1、进入matlab1.1在Windows环境中,创建一个名为speech的文件夹,存放语音数据和与实验相关的Matlab文件。如:E:\speech。用于实验的语音数据(.mat)及相应说明(.txt)包括:digits.mat%英文数字“0”到“9”的发音digits.txtgliss.mat%两个包含/i/的滑音gliss.txtletters.mat%英文字母表中26个字母的发音letters.txtma1.txtma1-1.mat%一句连续语音ma1-2.mat%一句连续语音ma1-3.mat%一句连续语音ma1-4.mat%一句连续语音timit.txttimit1.mat%一句连续语音timit2.mat%一句连续语音timit3.mat%一句连续语音timit4.mat%一句连续语音vowels.mat%元音/a/,/i/,/o/,/u/的发音vowels.txtwords.mat%十个孤立字的发音words.txt1.2在Windows桌面上,双击Matlab的图标,进入Matlab的工作环境。在命令窗口提示符后,键入cdE:\speech指令,进入实验文件夹路径。1.3在命令窗口键入clearall指令,清除工作空间的所有变量。2、加载语音数据,熟悉matlab命令2.1加载“timit1.mat”语音数据,命令为:loadtimit12.2用命令“who”和“whos”列出当前工作空间中的变量。变量“timit1”会以包含55911个元素的矩阵(列向量)形式出现Yourvariablesare:timit1NameSizeBytesClassAttributestimit155911x1447288double2.3利用命令“length”和“size”查看语音信号timit1的长度和维数:m=length(timit1)[m,n]=size(timit1)(粘贴实验结果)m=55911m=55911n=12.4通过以下命令,分别查看语音信号timit1中间的1个、2个和20个数据值:timit1(5001)timit1([5001,5003])timit1(5001:5020)(粘贴实验结果)ans=-0.0646ans=-0.06460.0111ans=-0.06460.03070.0111-0.02000.20210.40120.1869-0.1756-0.19020.08230.23630.17120.0637-0.0209-0.0683-0.03940.00810.01050.03110.06962.5Matlab中,符号“’”可以实现转置运算,运行以下命令进行观察:size(timit1’)(粘贴实验结果)ans=1559112.6使用函数max和min可以分别得到信号的最大值和最小值:max(timit1)min(timit1)(粘贴实验结果)ans=1ans=-0.80683、语音信号的时域分析3.1使用以下命令,画出语音信号timit1(采样频率为16kHz,长度为3.5秒)的时域波形。plot(timit1)title(‘timit1’)xlabel(‘TimeIndex,{\itn}’)ylabel(‘Amplitude’)axis([0length(timit1)-11])grid3.2分别画出一帧浊音和一帧清音的语音时域波形(采样频率为16kHz,帧长为25ms,每帧有400个样点)。subplot(211),plot(timit1(14501:14900))%/a/indark.subplot(212),plot(timit1(35501:35900))%/s/inwash.3.3编写个一用以计算信号短时功率的函数“stpower.m”,其Matlab代码如下:functionPx=stpower(x,N)M=length(x);Px=zeros(M,1);Px(N)=x(1:N)’*x(1:N)/N;For(m=(N+1):M)Px(m)=Px(m-1)+(x(m)^2-x(m-N)^2)/N;3.4编写一个用以计算信号短时过零率的函数“stzerocross.m”,其Matlab代码如下:functionZx=stzerocross(x,N)M=length(x);Zx=zeros(M,1);Zx(N+1)=sum(abs(sign(x(2:N+1))–sign(x(1:N))))/(2*N);for(m=(N+2):M)Zx(m)=Zx(m-1)+(abs(sign(x(m))–sign(x(m-1)))…-abs(sign(x(m-N))–sign(x(m-N-1))))/(2*N);end3.5加载“digits.mat”语音数据,该数据包含英文数字“0”到“9”的发音。计算其中的单词“four”的短时功率和过零率(采样频率为10kHz,帧长为30ms,每帧有300个样点)。loaddigits;N=300;x=digits.four1;Px=stpower(x,N);Zx=stzerocross(x,N);plot([Px*1e-5Zxx/2000])3.6加载“vowels.mat”语音数据,该数据包含元音/a/,/i/,/o/,/u/的发音。分别画出一帧/a/、一帧/i/、一帧/o/和一帧/u/的时域波形(采样频率为10kHz,帧长为30ms,每帧有300个样点)。loadvowelssubplot(221)plot(vowels.a_1(2001:2300))subplot(222)plot(vowels.i_1(2001:2300))subplot(223)plot(vowels.o_1(2001:2300))subplot(224)plot(vowels.u_1(2001:2300))3.7编写一个利用短时功率和短时过零率这两个参数对语音信号进行浊音/清音分类的函数“voiunvoi.m”,其Matlab代码如下:functionvoi=voiunvoi(x,N,Pth,Zth)%Short-timepowerPxandzerocrossingZxmeasures.Px=stpower(x,N);Zx=stzerocross(x,N);%Compareestimateswiththresholdvalues.voi=(PxPth*max(Px))&(ZxZth);%Shiftthevoi-flagN/2samplestotheleft(middlesampleinwindow).voi=[voi(fix(N/2)+1:length(voi));voi(length(voi))*ones(fix(N/2),1)];4、语音信号的频域分析4.1加载“ma1_1”语音数据。基于DFT变换,画出其中一帧数据(采样频率为8kHz,帧长为37.5ms,每帧有300个样点)的频域波形(对数幅度谱)。loadma1_1;x=ma1_1(4161:4460);subplot(121),plot(x)N=1024;k=0:N/2-1;X=fftshift(fft(x.*hann(length(x)),N));subplot(122),plot(k,20*log10(abs(X(N/2:-1:1)))),axis([0N/2-1-infinf])4.2编写一个用以计算信号谐波乘积谱的函数“hpspectrum.m”