通过重叠相加法实现卷积的报告.docx
- 文档编号:10424671
- 上传时间:2023-02-11
- 格式:DOCX
- 页数:17
- 大小:195.50KB
通过重叠相加法实现卷积的报告.docx
《通过重叠相加法实现卷积的报告.docx》由会员分享,可在线阅读,更多相关《通过重叠相加法实现卷积的报告.docx(17页珍藏版)》请在冰豆网上搜索。
通过重叠相加法实现卷积的报告
数字信号处理
课程设计
题目:
通过重叠相加法实现卷积
院系:
自动化与信息工程学院
专业:
通信工程
班级:
通信091
学号:
3090432028
姓名:
雷帛川
指导教师:
李建勋
职称:
副教授
2012年7月10日-2012年7月14日
设计任务
对随机信号进行滑动均值滤波,分析统计特征。
功能:
对给定的数据进行滑动均值滤波。
要求从文本文件中读入数据,分析滤波前后的信号统计特征:
包括均值、方差、平均功率、自相关和功率谱密度。
各项功能可以在界面中选择。
画出原始数据的曲线,滤波后的波形,以及自相关序列,功率谱密度。
设计步骤:
1)初步完成总体设计,搭好框架,确定人机对话的界面,确定输入输出函数的接口;
2)编写主要程序,包括快速傅立叶正变换和逆变换的程序;
3)编写实现输入输出功能的程序;
4)编写波形输出程序;
5)用matlab的相应函数进行检验。
要求:
1)用结构化设计方法。
一个程序划分成若干模块,每一个模块的函数功能要划分好,总体设计应画出流程图;
2)输入输出界面要友好;
3)源程序书写要规范,加必要的注释;
4)要提供通过Matlab函数进行检验的结果;
5)程序一定要要能运行起来。
一、原理
经常遇到两个序列的长度相差很大的情况,解决这个问题的方法就是将长序列分段计算,运用分段处理方法中的重叠相加法计算两个序列的卷积运算。
设一个给定序列是长度为n1的A,另一个导入序列是长度为n2的B,其中B序列是相对A序列比较长的,所以可以把B分为和A一样长的若干段段,即B分后每一小段长度为n1。
根据公式:
可知将B序列的每一小段与A序列做现行卷积,然后将所有的n2/n1段的线性卷积结果相加起来就是整个B序列和A序列的线性卷积结果,而又在本设计中,B序列的一小段和A序列的线性卷积又可由循环卷积来实现,只要让循环卷积的点数
,循环卷积的结果就和线性卷积的结果等价,在本实验中取
故A序列和B序列的线性卷积可认为是由A序列和B的每一小段做
点的循环卷积的最终累加和,
另外还有两个个问题需要考虑,首先是做循环卷积时要对A序列和B序列的那一小段补零做卷积后,最终做累加的时候要考虑重叠的片段,必须将重叠的两段加起来。
不重叠的片段直接赋值。
其次是如果B序列长度n2不是A序列长度n1的整数倍时,必须将B序列余下的那几个数补零后和A序列做
点循环卷积再加到最终的结果的相应位置。
下列是计算循环卷积的过程:
在本次课设题中序列A和B序列的某一小段做循环卷积,由于已知A序列的长度为n1,故可取B序列的每一小段都和A序列相等长度,并且取循环卷积的点数为
,这就保证每一组的循环卷积都等效于线性卷积。
做循环卷积可运用循环卷积矩阵做,其第一步是将A序列和B序列的某一小段补零到长度为
,然后把A序列通过变换生成
的循环卷积矩阵,将补零后的B的某一小段转置,然后用循环卷积矩阵乘以它就可以得到循环卷积的结果,在此也即线性卷积。
重叠相加法的图示如下:
2、设计过程
1.循环卷积子函数流程图
2.主函数流程图
3.循环卷积子函数源程序:
functiony=Convmy4(A,B,L)%创建循环卷积函数
ifL error('出错'); end ifL>length(A)%如果A序列长度小于L则补零到L A=[A,zeros(1,L-length(A))]; end ifL>length(B)%给B序列补零到L B=[B,zeros(1,L-length(B))]; B=B';%B转置 end E=A(1,1); C=A(1,[2: L]);%写循环矩阵的第一行 D=fliplr(C); A=[E,D]; y (1)=A(1,1).*B(1,1); forh=2: 1: L y (1)=y (1)+A(1,h).*B(h,1);%%计算循环卷积序列的第一个值 end fork=2: 1: L t=A(1,L); fori=L: -1: 2 A(1,i)=A(1,i-1);%得到矩阵的第二到L行并计算循环卷积的 end%另外几个值 A(1,1)=t; y(k)=0; form=1: 1: L y(k)=y(k)+A(1,m).*B(m,1); end end 4.主函数源程序: A=input('请输入给定序列: '); c=load('huang.txt');%导入数据 B=c'; n1=length(A);%记序列A的长度 n2=length(B);%记序列B的长度 i=fix(n2/n1);%算B的长度是A的几倍,向下取整 L=2*n1-1;%取循环卷积的长度,使其每小段 %循环卷积满足和线性卷积等价 y(1: L)=Convmy4(A,B(1: n1),L);%调用编好的循环卷积函数 r(1: L)=y(1: L);%计算最终结果的前n1个点的值 forp=2: 1: i%循环 s=B((p-2)*n1+1: (p-2)*n1+n1);%取B序列的第一小段存到s y((p-2)*n1+1: (p-2)*n1+L)=Convmy4(A,s,L);%计算第一小段和A序列循环卷 %积的L点结果 C(1: L-n1)=y((p-2)*n1+n1+1: (p-2)*n1+L);%将第一组做循环卷积得到的结果 %重叠部分先转存到临时变量C中 z=B((p-1)*n1+1: (p-1)*n1+n1);%取B序列的第二小段存到z y((p-1)*n1+1: (p-1)*n1+L)=Convmy4(A,z,L);%将其和A的循环卷积的结果给y for n=1: 1: n1-1%------------------------- y((p-1)*n1+n)=C(n)+y((p-1)*n1+n);%计算重叠部分的结果 r((p-1)*n1+n)=y((p-1)*n1+n); end%------------------------- forn=n1: 1: n1%------------------------- y((p-1)*n1+n)=y((p-1)*n1+n);%计算没重叠部分的结果 r((p-1)*n1+n)=y((p-1)*n1+n); end%------------------------- end%循环结束 D(1: L-n1)=y((p-1)*n1+n1+1: (p-1)*n1+L);%************************* forn=n1+1: 1: L%显示末尾的一段 r((p-1)*n1+n)=D(n-n1); end%************************* Ifmod(n2,n1)~=0%------------------------- h=mod(n2,n1); E=[B(i*n1+1: i*n1+h),zeros(1,n1-h)]; F(1: L)=Convmy4(A,E,L); P(1: n1-1)=r((p-1)*n1+n1+1: (p-1)*n1+L);%如果n2不是n1的整数倍,则应 forn=1: 1: n1-1%将B序列多余的那几个点补零再 r(i*n1+n)=P(n)+F(n);%和A做循环卷积并显示出来 end forn=n1: 1: L r(i*n1+n)=F(n); end end%------------------------- q=conv(A,B);%调用系统函数做线性卷积,验证结果 r; x1=1: 1: n1;%------------------------- subplot(2,2,1); stem(x1,A); title('给定序列A'); gridon;%画原来输入的两个序列和最终序列的图形 x2=1: 1: n2; subplot(2,2,3); stem(x2,B); title('导入序列B'); gridon; x3=1: 1: length(r); subplot(2,2,2); stem(x3,r); title('线性卷积结果图形'); gridon;%-----------------------x4=1: 1: n1+n2-1;%************************* subplot(2,2,4);%画调用系统函数得到的结果图形 stem(x4,q); title('直接调用系统函数得到的图形'); gridon;%************************* 3、结果与验证 当输入序列为rand(1,80)时,输入前后以及结果图形: 4、界面设计 在MATLAB的命令窗口中运行guide命令,即可打开GUIDE界面,选择BlankGUI,点击OK,就可以进行界面设计。 根据题目要求,逐步设计各各模块的功能,再修改所要用到的属性,全部完成后,运行,界面如下: 五、分析和总结 学习了MATLAB后,我深刻地体会到了它功能的强大,不管是数据处理,矩阵计算,频谱分析,还是图形处理,只要函数格式使用正确,一切都能快速准确的实现。 在实验的过程中培养了我的独立分析问题和解决问题的能力。 在遇到实在过不去的地方,总能在同学和老师的指点下豁然开朗,对培养我的思维方法有了很大的帮助,使我受益匪浅。 我了解到MATLAB在我们的生活中的重要地位,随着社会的不断发展,科技的不断进步,计算机的普及,它也被应用在越来越多的方面。 通过本次实验,使我掌握了MATLAB的使用,对我今后的学习之路将产生很大的帮助,使我更能发挥所长报效社会。 参考文献 【1】罗建军,杨琦.精讲多练MATLAB(第二版).西安: 西安交通大学大学出版社,2010.1 【2】高西全,丁玉美.数字信号处理(第三版).西安: 西安电子科技大学出版社,2008.8 【3】刘卫国.MATLAB程序设计与应用(第二版).高等教育出版社,2006.7 【4】邓薇.MATLAB函数速查手册(第一版).人民邮电出版社,2008.10 附录: 主要程序 1.循环卷积子函数源程序: functiony=Convmy4(A,B,L)%创建循环卷积函数 ifL error('出错'); end ifL>length(A)%如果A序列长度小于L则补零到L A=[A,zeros(1,L-length(A))]; end ifL>length(B)%给B序列补零到L B=[B,zeros(1,L-length(B))]; B=B';%B转置 end E=A(1,1); C=A(1,[2: L]);%写循环矩阵的第一行 D=fliplr(C); A=[E,D]; y (1)=A(1,1).*B(1,1); forh=2: 1: L y (1)=y (1)+A(1,h).*B(h,1);%%计算循环卷积序列的第一个值 end fork=2: 1: L t=A(1,L); fori=L: -1: 2 A(1,i)=A(1,i-1);%得到矩阵的第二到L行并计算循环卷积的 end%另外几个值 A(1,1)=t; y(k)=0; form=1: 1: L y(k)=y(k)+A(1,m).*B(m,1); end end 2.主函数源程序: A=input('请输入给定序列: '); c=load('huang.txt');%导入数据 B=c'; n1=length(A);%记序列A的长度 n2=length(B);%记序列B的长度 i=fix(n2/n1);%算B的长度是A的几倍,向下取整 L=2*n1-1;%取循环卷积的长度,使其每小段 %循环卷积满足和线性卷积等价 y(1: L)=Convmy4(A,B(1: n1),L);%调用编好的循环卷积函数 r(1: L)=y(1: L);%计算最终结果的前n1个点的值 forp=2: 1: i%循环 s=B((p-2)*n1+1: (p-2)*n1+n1);%取B序列的第一小段存到s y((p-2)*n1+1: (p-2)*n1+L)=Convmy4(A,s,L);%计算第一小段和A序列循环卷 %积的L点结果 C(1: L-n1)=y((p-2)*n1+n1+1: (p-2)*n1+L);%将第一组做循环卷积得到的结果 %重叠部分先转存到临时变量C中 z=B((p-1)*n1+1: (p-1)*n1+n1);%取B序列的第二小段存到z y((p-1)*n1+1: (p-1)*n1+L)=Convmy4(A,z,L);%将其和A的循环卷积的结果给y for n=1: 1: n1-1%------------------------- y((p-1)*n1+n)=C(n)+y((p-1)*n1+n);%计算重叠部分的结果 r((p-1)*n1+n)=y((p-1)*n1+n); end%------------------------- forn=n1: 1: n1%------------------------- y((p-1)*n1+n)=y((p-1)*n1+n);%计算没重叠部分的结果 r((p-1)*n1+n)=y((p-1)*n1+n); end%------------------------- end%循环结束 D(1: L-n1)=y((p-1)*n1+n1+1: (p-1)*n1+L);%************************* forn=n1+1: 1: L%显示末尾的一段 r((p-1)*n1+n)=D(n-n1); end%************************* Ifmod(n2,n1)~=0%------------------------- h=mod(n2,n1); E=[B(i*n1+1: i*n1+h),zeros(1,n1-h)]; F(1: L)=Convmy4(A,E,L); P(1: n1-1)=r((p-1)*n1+n1+1: (p-1)*n1+L);%如果n2不是n1的整数倍,则应 forn=1: 1: n1-1%将B序列多余的那几个点补零再 r(i*n1+n)=P(n)+F(n);%和A做循环卷积并显示出来 end forn=n1: 1: L r(i*n1+n)=F(n); end end%------------------------- q=conv(A,B);%调用系统函数做线性卷积,验证结果 r; x1=1: 1: n1;%------------------------- subplot(2,2,1); stem(x1,A); title('给定序列A'); gridon;%画原来输入的两个序列和最终序列的图形 x2=1: 1: n2; subplot(2,2,3); stem(x2,B); title('导入序列B'); gridon; x3=1: 1: length(r); subplot(2,2,2); stem(x3,r); title('线性卷积结果图形'); gridon;%-----------------------x4=1: 1: n1+n2-1;%************************* subplot(2,2,4);%画调用系统函数得到的结果图形 stem(x4,q); title('直接调用系统函数得到的图形'); gridon;%*************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通过 重叠 相加 实现 卷积 报告