重叠相加法计算圆周卷积.docx
《重叠相加法计算圆周卷积.docx》由会员分享,可在线阅读,更多相关《重叠相加法计算圆周卷积.docx(11页珍藏版)》请在冰点文库上搜索。
重叠相加法计算圆周卷积
1理论分析
1.1圆周卷积的定义
对两个N点序列
和
,除了可以做线性卷积外,还有一种很重要的卷积运算,还有一种很重要的卷积运算,就是圆周卷积。
若
、
的离散付里叶变换分别为
、
,且有
=
则
=IDFT[
]
=
上式即为序列
与
的圆周卷积,习惯表示为
=
⊙
圆周卷积与周期卷积之间的关系,就是有限长序列圆周卷积结果的周期延拓,等于它们周期延拓后的周期卷积。
换句话说,周期卷积的主值序列,是各周期序列主值序列的圆周卷积。
周期卷积得到是周期序列,圆周卷积得到的是有限长序列,而且长度等于参加卷积的序列的长度。
1.2圆周卷积的计算
若
、
分别是长度为N、M的序列则
与
线性卷积至多M+N-1个非零值,如果LM+N-1时,周期延拓才不会发生混叠。
之所以讨论用圆周卷积来计算线性卷积的条件,是因为圆周卷积可在频域下利用DFT求得,从而可采用DFT的快速算法FFT来计算,这样就可以利用FFT来计算线性卷积,大大提高运算效率。
圆周卷积与周期卷积的卷积过程一样,只是结果只取主值序列,其具体步骤结构框图大致如下所示:
图1-1圆周卷积计算结构框图
1.3重叠相加法
在实际应用中利用FFT来计算两个序列的圆周卷积从而实现计算其线性卷积,但是常遇到的问题是参加卷积的两个序列的长度相差较大,这样长度小的序列就需要补很多的零点,这样就需要打的存储量,运算时间也会变长。
所以常用到的解决方法有两种,其中一种就是重叠相加法。
设h(n)长度为N,x(n)长度为无限长,x(n)取M点,且与N尽量接近。
=
=
x(n)与h(n)的卷积为:
*
=
*
=
重叠相加法实现步骤如下:
(1)将h(n)补零延长到L=M+N-1,并计算长为L的FFT,得到H(k)。
(2)分别将xk(n)补零延长到L=M+N-1,并计算长为L的FFT,得到Xk(k)
(3)计算
,并求长为L的反变换,即
(4)将yk(n)的重叠部分相加,最后得到结果为
2圆周卷积程序设计
2.1程序设计基本构思
由时域与频域的关系可知,两序列
和
在时域下进行线性卷积的结果等于这两个序列在频域下相乘后进行反变换回时域的结果。
圆周卷积在一定条件下(L>M+N-1)与线性卷积得到的结果相同,而圆周卷积可在频域下利用DFT求得,从而可采用DFT的快速算法FFT来计算,这样就可以利用FFT来计算线性卷积,大大提高运算效率。
而在利用FFT来计算圆周卷积的过程中当两序列的长度相差较大时采用重叠相加法来进行计算可有效提高计算的效率,减小存储空间的消耗。
2.2程序设计步骤
卷积函数程序设计:
(1)x1(n)进行N点快速傅里叶变换得X1(k)
(2)x2(n)进行N点快速傅里叶变换得X2(k)
(3)进行频域相乘Y(k)=X1(k)*X2(k)
(4)对Y(k)进行反变换得到时域卷积y(n)
图2-1卷积函数程序设计框图
重叠函数程序设计:
(1)首先取圆周卷积的周期L(即进行L点的快速傅里叶变换)
(2)计算每一分段的大小N
(3)填充序列使得循环中对序列的索引不会超出范围
(4)计算分段数K
(5)对序列进行分段调用juanji()函数计算圆周卷积
(6)各段重叠相加
(7)取出实际的输出序列
图2-2重叠函数程序设计框图
3程序代码
3.1主程序代码
x1=[1,2,3,4,5,5,4,3,2,1];
x2=[1,0,1];
L=8;
y=chongdie(x1,x2,L);
s=1:
10;subplot(2,2,1);
stem(s,x1)%作出序列x1图形
r=1:
3;subplot(2,2,2);
stem(r,x2)%作出序列x2图形
u=1:
13;subplot(2,2,3);
stem(u,y)%作出输出序列y图形
3.2重叠函数程序代码
function[y]=chongdie(x,h,L)
Lenx=length(x);%取x(n)的长度
M=length(h);%取h(n)的长度
N=L-M+1;%计算分段大小N
x=[x,zeros(1,N-1)];%填充序列使得循环中对序列的索引不会超出围
K=floor(Lenx/N);%确定分段数K
y=zeros(1,Lenx+L-1);
fori=0:
1:
K
ix=i*N;
x_seg=x(ix+1:
ix+N);%将x(n)分段
y_seg=juanji(x_seg,h,L);%调用函数juanji()计算圆周卷积
y(ix+1:
ix+L)=y(ix+1:
ix+L)+y_seg(1:
L);%各段重叠相加
end
y=y(1:
Lenx+M);%取出实际的输出序列
3.3卷积函数程序代码
functiony=juanji(x1,x2,L)
iflength(x1)>L%如果x1长度大于L则产生错误
error('Lmustnotbelessthanlengthofx1');
end
iflength(x2)>L%如果x2长度大于L则产生错误
error('Lmustnotbelessthanlengthofx2');
end
X1k=fft(x1,L);%对x1进行L点FFT计算
X2k=fft(x2,L);%对x2进行L点FFT计算
Yk=X1k.*X2k;%频域相乘
y=ifft(Yk);%反变换得卷积结果
if(all(imag(x1)==0))&(all(imag(x2)==0))
y=real(y);
end
4程序运行结果与分析
输入序列和周期L
x1=[1,2,3,4,5,5,4,3,2,1];
x2=[1,0,1];
L=8;
运算结果:
1246899864210
图4-1程序运行结果
通过计算,得到线性卷积结果,与程序运行结果相一致,可知程序计算结果是正确的,用重叠相加法实现圆周卷积的程序设计完成。
5心得体会
通过这次课程设计,加强了我们动手、思考和解决问题的能力。
数字信号处理这门课程是其他很多课程的基础,所以学好学通数字信号处理这门课程对我们来说是非常重要的。
而Matlab这款软件对数字信号处理的建模、编程、分析、实现有极大的帮助作用,所以我们应该掌握使用Matlab编程来实现对数字信号的处理。
在和同组同学一起讨论研究通基于重叠相加法的圆周卷积原理后,我开始了利用Matlab来实现这个功能。
在编写程序的过程中,我查阅了很多有关Matlab的编程知识,通过整合所查阅到的编程知识,结合先前研究的基于重叠相加法的圆周卷积原理,我设计了具有此功能的Matlab函数。
通过这次课程设计,让我加深了对书本知识的理解,并应用课本的理论知识,结合相关软件,设计解决问题的算法。
从而提高了由知识转换为技能的能力,提高了自己的实践能力。
通过与同学的互相沟通,不仅使各自的知识得到了扩充,而且从中得到了很多的启示,这次课程设计让人受益匪浅。
参考文献
[1]周建兴、岂兴明等编.MATLAB从入门到精通.人民邮电出版社.2008
[2]刘泉、阙大顺、郭志强.数字信号处理.电子工业出版社.2009
[3]程卫国.MATLAB53精要编程及高级应用.北京:
机械工业出版社.2000
[4]李正周.MATLAB数字信号处理与应用.北京:
清华大学出版社.2008年
[5]罗建军、杨琦.精讲多练MATLAB.西安:
西安交通大学出版社.2002