《信号与系统》课程设计——回音的产生与消除班级:光电一(6)班姓名:骆骏学号:2010051060023全部源程序如下:[x,fs,bits]=wavread('xiyangyang');figure(1);subplot(3,1,1);plot(x(1:65000));title('原始信号');y=fft(x);subplot(3,1,2);plot(abs(y));title('幅值');subplot(3,1,3);plot(angle(y));title('相位');sound(x,fs);pause(10)x1=x(1:65000);x2=x(1:65000);x1=[x1,zeros(1,10000)];x2=[zeros(1,10000),0.7*x2];y=x1+x2;figure(2);subplot(3,1,1);plot(y(1:65000));title('回声');y1=fft(y);subplot(3,1,2);plot(abs(y1));title('幅值');subplot(3,1,3);plot(angle(y1));title('相位');sound(y,fs);pause(10)b=1;a=zeros(1,10000);a(1)=1;a=[a,0.7];z1=filter(b,a,y);z2=fft(z1);figure(3);subplot(3,1,1);plot(abs(z2));title('滤波幅值');subplot(3,1,2);plot(angle(z2));title('滤波相位');subplot(3,1,3);plot(z1(1:65000));title('滤波信号');sound(z1,fs);程序简要分析:首先利用声卡或软件(本人用的是格式工厂)录下一段采样率为22050Hz的wav格式的音频文件,并将其复制到Matlab的work工作区,取名“xiyangyang”。然后利用wavread函数读入并将其一维数组的值赋给变量x,经size(x)测得其长度为66230(x取前65000位)。利用图形窗口subplot函数将figure(1)分成3个绘图区,以便于分别用plot函数将原始音频的原始信号,幅值和相位在figure(1)上输出。相关函数有title,用于标注图形名称;fft用来计算离散傅里叶变换,此函数将序列x的快速离散傅里叶变换的结果存到向量y中,即其幅值;angle函数用于返回向量y的弧度,即一维复合元素的向量矩阵。最后利用sound命令把原始音频文件输出。然后分别把x赋x1和x2,并分别在x1的最后和x2的最前加10000个0,且设x2的回音衰减系数为0.7。使原始信号产生一个10000的时延和0.7的衰减率并将其进行叠加赋给y,而输出的y就实现了x1和x2的叠加,即产生回音的过程,再分别将y的回声,幅值和相位用相似的处理方法输出在figure(2)上。最后是回音的消除过程,此过程利用了一个关键的一维数字滤波滤波器函数filter,即建立一个一维差分方程,最后反求出原始信号x,即程序中所指的z1。“z1=filter(b,a,y)”的意思是使b*z1=a*y,而a,b,y和z1均可以是向量(实过程为“a(1)*z1(n)+a(2)*z1(n-1)+a(3)*z1(n-2)+…..=b(1)*y(n)+b(2)*y(n-1)+b(3)*y(n-2)+…..“),最后输出的是z(n)。执行此语句后,z1(n)+0.7*z1(n-10001)=y(n),而显然得到的z1(n)就是叠加信号y减去原来的回音x2后所得的原始信号,即x。注:1.本程序包含三个sound命令,应利用pause函数实现其先顺序的播放,否则播放时效果不好甚至混乱。2.本程序只设计了一个回音信号x2,也可以按相似方法多设计几个回音信号x3,x4等,即实现其回音次数的控制。只是注意其维数必须相同,否则不能相加,在最后回音消除的时候再按相似方法去掉回音即可。3.关于回音间隔,可通过改变其时延N来控制;至于回音大小,通过改变回音的回音衰减系数即可。4.在录取的音频不能太大,否则易造成程序执行时间过长,特别是filter函数的计算过程,一旦过长就极易死机。5.本程序参考了一些网上相关的回音的产生与消除的程序。感想:信号与系统是一门理论与实践紧密结合的课程,通过本次课程设计,增强了自己的实际动手能力,上网查资料以及自学能力。