数字信号处理
课程设计
题目:通过重叠相加法实现卷积
院系:自动化与信息工程学院
专业:通信工程
班级: 通信091
学号: 3090432028
姓名: 雷帛川
指导教师: 李建勋
职称: 副教授
2012年7月1日2012年7月14日
用结构化设计方法。一个程序划分成若干模块,每一个模块的函数功能要划分好,总体设计应画出流程图;
输入输出界面要友好;
源程序书写要规范,加必要的注释;
要提供通过Matlab函数进行检验的结果;
程序一定要要能运行起来。
原理
经常遇到两个序列的长度相差很大的情况,解决这个问题的方法就是将长序列分段计算,运用分段处理方法中的重叠相加法计算两个序列的卷积运算。
设一个给定序列是长度为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.循环卷积子函数流程图
2.主函数流程图
3.循环卷积子函数源程序:
function y=Convmy4(A,B,L) %创建循环卷积函数
if L
error('出错');
end
if L>length(A) %如果A序列长度小于L则补零到L
A=[A,zeros(1,L-length(A))];
end
if L>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);
for h=2:1:L
y(1)=y(1)+A(1,h).*B(h,1); % %计算循环卷积序列的第一个值
end
for k=2:1:L
t=A(1,L);
for i=L:-1:2
A(1,i)=A(1,i-1); %得到矩阵的第二到L行并计算循环卷积的
end %另外几个值
A(1,1)=t;
y(k)=0;
for m=1:1:L
y(k)=y(k)+A(1,m).*B(m,1);
end
end
4.主