通过重叠相加法实现卷积的报告.doc
《通过重叠相加法实现卷积的报告.doc》由会员分享,可在线阅读,更多相关《通过重叠相加法实现卷积的报告.doc(20页珍藏版)》请在冰豆网上搜索。
![通过重叠相加法实现卷积的报告.doc](https://file1.bdocx.com/fileroot1/2022-10/5/23fe07c9-cf1a-4ef3-9fac-ed195647bcd5/23fe07c9-cf1a-4ef3-9fac-ed195647bcd51.gif)
数字信号处理
课程设计
题目:
通过重叠相加法实现卷积
院系:
自动化与信息工程学院
专业:
通信工程
班级:
通信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)%创建循环卷积函数
ifLerror('出错');
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);