通过重叠相加法实现卷积的报告.doc

上传人:wj 文档编号:592365 上传时间:2023-04-29 格式:DOC 页数:20 大小:207.26KB
下载 相关 举报
通过重叠相加法实现卷积的报告.doc_第1页
第1页 / 共20页
通过重叠相加法实现卷积的报告.doc_第2页
第2页 / 共20页
通过重叠相加法实现卷积的报告.doc_第3页
第3页 / 共20页
通过重叠相加法实现卷积的报告.doc_第4页
第4页 / 共20页
通过重叠相加法实现卷积的报告.doc_第5页
第5页 / 共20页
通过重叠相加法实现卷积的报告.doc_第6页
第6页 / 共20页
通过重叠相加法实现卷积的报告.doc_第7页
第7页 / 共20页
通过重叠相加法实现卷积的报告.doc_第8页
第8页 / 共20页
通过重叠相加法实现卷积的报告.doc_第9页
第9页 / 共20页
通过重叠相加法实现卷积的报告.doc_第10页
第10页 / 共20页
通过重叠相加法实现卷积的报告.doc_第11页
第11页 / 共20页
通过重叠相加法实现卷积的报告.doc_第12页
第12页 / 共20页
通过重叠相加法实现卷积的报告.doc_第13页
第13页 / 共20页
通过重叠相加法实现卷积的报告.doc_第14页
第14页 / 共20页
通过重叠相加法实现卷积的报告.doc_第15页
第15页 / 共20页
通过重叠相加法实现卷积的报告.doc_第16页
第16页 / 共20页
通过重叠相加法实现卷积的报告.doc_第17页
第17页 / 共20页
通过重叠相加法实现卷积的报告.doc_第18页
第18页 / 共20页
通过重叠相加法实现卷积的报告.doc_第19页
第19页 / 共20页
通过重叠相加法实现卷积的报告.doc_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

通过重叠相加法实现卷积的报告.doc

《通过重叠相加法实现卷积的报告.doc》由会员分享,可在线阅读,更多相关《通过重叠相加法实现卷积的报告.doc(20页珍藏版)》请在冰点文库上搜索。

通过重叠相加法实现卷积的报告.doc

数字信号处理

课程设计

题目:

通过重叠相加法实现卷积

院系:

自动化与信息工程学院

专业:

通信工程

班级:

通信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的某一小段转置,然后用循环卷积矩阵乘以它就可以得到循环卷积的结果,在此也即线性卷积。

重叠相加法的图示如下:

二、设计过程

1.循环卷积子函数流程图

开始

输入A序列和B序列

若A或B序列的长度大于L则出错

若A和B的任一个长度小于L则补零

算出循环卷积矩阵并用它和B补零矩阵的转置

相乘

输出结果

结束

2.主函数流程图

开始

输入给定序列A和导入序列B

N1=length(A)

N2=lehgth(B)

将B分为i=fix(n2/n1)个长度为n1的小段

取循环卷积点数为L=2*n1-1,并调用设计的子函数

每组的循环卷积结果按相应的规则相加

将最后一组循环卷积结果未重叠的部分加在得到的总的序列后

若mod(n2,n1)~=0

将B余下的那几个数补零到L长度再做循环卷积,结果加在叠加序列的后面

画出图形,输出结果

结束

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;%*************************

三、结果与验证

当输入序列为rand(1,80)时,输入前后以及结果图形:

四、界面设计

在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:

le

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2