通过重叠相加法实现卷积的报告Word文档格式.doc
- 文档编号:13120207
- 上传时间:2022-10-05
- 格式:DOC
- 页数:20
- 大小:207.26KB
通过重叠相加法实现卷积的报告Word文档格式.doc
《通过重叠相加法实现卷积的报告Word文档格式.doc》由会员分享,可在线阅读,更多相关《通过重叠相加法实现卷积的报告Word文档格式.doc(20页珍藏版)》请在冰豆网上搜索。
设计任务
对随机信号进行滑动均值滤波,分析统计特征。
功能:
对给定的数据进行滑动均值滤波。
要求从文本文件中读入数据,分析滤波前后的信号统计特征:
包括均值、方差、平均功率、自相关和功率谱密度。
各项功能可以在界面中选择。
画出原始数据的曲线,滤波后的波形,以及自相关序列,功率谱密度。
设计步骤:
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<
length(A)||L<
length(B)%若A和B中任何一个序列长度大于L则出错
error('
出错'
);
end
ifL>
length(A)%如果A序列长度小于L则补零到L
A=[A,zeros(1,L-length(A))];
length(B)%给B序列补零到L
B=[B,zeros(1,L-length(B))];
B=B'
;
%B转置
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);
%%计算循环卷积序列的第一个值
fork=2:
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:
L
y(k)=y(k)+A(1,m).*B(m,1);
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:
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:
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:
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:
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:
%如果n2不是n1的整数倍,则应
forn=1:
n1-1%将B序列多余的那几个点补零再
r(i*n1+n)=P(n)+F(n);
%和A做循环卷积并显示出来
r(i*n1+n)=F(n);
end%-------------------------
q=conv(A,B);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通过 重叠 相加 实现 卷积 报告