资源描述:
《matlab高级编程与应用-语音处理实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、语音处理实验报告自03张驰昱2010012028一、语音预测模型(1)给定e(n)=s(n)・o1s(n・1)・a2s(r)・2)假设e(n)是输入信号,s(n)是输出信号,上述滤波器的传递函数是什么?如果01=1.3789,02=-0.9506,上述合成模型的共振峰频率是多少?用zplane,freq乙impz分别绘出零极点图,频率响应和单位样值响应。用filter绘出单位样值响应,比较和impz的是否相同。问题分析:本问题主要练习传递函数到零极点的转化,零极点的绘制,频率响应的绘制,单位响应的绘制,复习filter数字滤波器的使用。具体实现:clear;clc;a=[1,-
2、1.3789,0.9506];sys=tf(1,a,-lz*variable1,'zA-l')[zzp]=tf2zp(l,a);%[rfp,kJ=residuez(1,a);也能求出零点omg=abs(angle(p(1)));fs=8000;%数字采样频率f=omg*fs/2/pi%弧度转化为频率n=[0:49]';x=(n==0);figure(1);zplane(1fa);figure(2);freqz(1,a);figure(3);subplot(2,1,1),stem(n,filter(lza,x));figure(3);subplot(2,1,2),impz(1,a
3、,50);(2)理解speechproc的主要流程我认为主要的部分是以下程序段:(个人理解写在了注释屮)%先要统一初始化所用到的向量,这样可以提高执行效率forn=3:FN%汉明窗取到了帧长的三倍,所以n从3开始s_w=s(n*FL-WL+l:n*FL)・*hw;%力口窗方便用JLpc处理[AE]=lpc(s_wfP);%用1卩<:技术得到传递函数系数As_f=s((n-1)*FL+l:n*FL);%待处理的本帧语音,即激励响应%需要推算本帧语咅的激励,只有得到了激励才能做接下来的变声处理s_Pitch=exc(n*FL-222:n*FL);PT=findp让ch(s_Pitc
4、h);咎刚才算出的激励信号是有高斯白噪声的,需要找%出基音周期和能量,为重新合成激励信号做准备G=sqrt(E*PT(n));⑶在27帧处观察零极点图问题分析:主要让我们刈•语音传函的共轨极点有一个更直观的认识具体实现:ifn==27figure(n);zplane(1,A);end(4)用filter计算每帧的激励信号问题分析:已经求出了传函系数和激励相应,只要传函的分子分母互换把激励相应当激励,得到的相应就是原激励具体实现:%前输!11状态作为后输入状态即前后状态不变[tempi,zi_pre]=filter(Az1,s_f,zi_pre);exc((n-1)*FL+1:n
5、*FL)=templ;(5)利用刚才得到的激励信号,继续用filter重建语咅问题分析:相当于对于之前求出的激励的验算。与前题一样,要保持前后状态不变。具体实现:[temp2,zi_rec]=fiIter(1zA,templ,zi_rec);s_rec((n-1)*FL+1:n*FL)=temp2;(6)比较激励信号与s(n)和重建语音的区別问题分析:重建语咅因为用原激励exc做输入,所以和原语咅相同。但exc中包含了高斯白噪声序列,这就是为什么接下来要计算exc的基音周期并重新合成“干净”的激励。具体实现:figure;subplot(2,1,1),plot(s(2000:4
6、000));subplot(2,1,2),plot(exc(2000:4000));二、语音合成模型(1)生成一个8kHz抽样频率的持续Is的数字信号,该信号是频率为200Hz的单位样值串NS7x(n)=刀〃(门—必')t=0问题分析:200Hz即一秒钟200个样值,所以NS=200-乂因为抽样频率为8000,所以相邻样值间隔为40,即N=40。具体实现:N=8000;f=200;%如果要300Hz,就改为300e=(mod([1:N]zfloor(N/f))==0);%8000个点取模再求逻辑判断自然生成一个样值串sound(e,8000);(1)生成基因周期满足PT=80+
7、5mod(m,50)的样值序列,其中m为10ms长的段的序号。问题分析:需要有一个变量來记忆现在已经到了第几个段,用循环累加的方式存储Z前所有样值间隔的和。而且没法用f。匕循环,因为步距不固定且步数事先不矢口道。用while循环。具体实现:N=8000;e=zeros(N,1);%—秒信号初始化PTsum=l;%第一个样值在丄处whilePTsum<=Ne(PTsum)=1;m=ceil(PTsum/80);%当前位置所处的段序号,注意这里是向上取整PT=80+5*mod(mz50);%当前