重叠相加法实现卷积Word下载.docx
《重叠相加法实现卷积Word下载.docx》由会员分享,可在线阅读,更多相关《重叠相加法实现卷积Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
![重叠相加法实现卷积Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/18/9570d0b3-e600-4bdf-9e92-9764d96ffd2f/9570d0b3-e600-4bdf-9e92-9764d96ffd2f1.gif)
DFT具备明确且合理的物理含义,适合应用于数字系统,同时可以方便地由计算机进行运算。
对于线性非移变离散系统,可由线性卷积表示时域输入输出关系,即
y(n)=x(n)*h(n)
通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。
因此,产生了重叠相加法和重叠保留法两种典型的算法,用以快速计算线性卷积,成为了DFT的一个重要应用。
2、算法基本思想
重叠相加法是将待过滤的信号分割成长为N的若干段,,每一段都可以和有限时宽单位取样回应作卷积,再将过滤后的各段重叠相加。
在实际应用中利用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)的重叠部分相加,最后得到结果为
二、程序设计
1、程序设计思路
函数juanji(x1,x2,L)设计
(1)x1(n)进行N点快速傅里叶变换得X1k
(2)x2(n)进行N点快速傅里叶变换得X2k
(3)进行频域相乘Yk=X1k*X2k
(4)对Yk进行反变换得到时域卷积结果y(n)
函数chongdie(x,h,N)设计
(1)首先取圆周卷积的周期L(即进行L点的快速傅里叶变换)
(2)计算每一分段的大小N
(3)填充序列使得循环中对序列的索引不会超出围
(4)计算分段数K
(5)对序列进行分段调用juanji()函数计算圆周卷积
(6)各段重叠相加
(7)取出实际的输出序列
2、程序流程图
开始
对x1(n)进行FFT运算
对x
(2)进行FFT运算
频域相乘
Yk=X1k*X2k
对Yk进行反变换得到时域结果y(n)
结束
取圆周卷积的周期L
计算每一分段的大小N
将序列按要求填充
计算分段数K
调用卷积函数
将各段处理的结果重叠相加输出最终结果
重叠相加法
卷积
三、分析与测试
1、循环卷积设计
①程序
M=length(h);
ifN<
M%为N选择合适的值保证运算正确
N=M+1;
end
L=M+N-1;
%循环卷积与线性卷积结果一样时需要进行运算的最少点数
Lx=length(x);
T=ceil(Lx/N);
%确定分段数T
t=zeros(1,M-1);
%初始化序列t(n)
x=[x,zeros(1,(T+1)*N-Lx)];
%不足的分段补零
y=zeros(1,(T+1)*N);
%生成输出序列y(n),长度足够长
fori=0:
1:
T
xi=i*N+1;
x_seg=x(xi:
xi+N-1);
%选择低点数计算时的分段x(n)
X1k=fft(x_seg,L);
%x_seg做L点FFT
X2k=fft(h,L);
%h做L点FFT
Yk=X1k.*X2k;
%频域相乘
y_seg=ifft(Yk);
%FFT反变换得循环卷积结果
y_seg(1:
M-1)=y_seg(1:
M-1)+t(1:
M-1);
%完成重叠相加
t(1:
M-1)=y_seg(N+1:
L);
%重新对t(n)赋值为保留的后M-1点
y(xi:
xi+N-1)=y_seg(1:
N);
%直接输出前N个点
y=y(1:
Lx+M-1);
%取出最终的输出序列
②测试
设N=4
h=[1,2,3,4]
X=[1,2,3,4,5,6,7,8,9]
调用系统函数fftfilt(h,x,N)
对比生成图像
设计函数图形
系统函数fftfilt(h,x,N)
③分析
设计函数与系统函数前7个点一样,系统函数没有后4-1=3个点,
4为h(n)长度。
设计函数符合要求。
2、线性卷积设计
Lx=length(A)+length(B)-1;
%线性卷积长度
l1=length(A)-1;
l2=length(B)-1;
A=[zeros(1,l2)Azeros(1,l2)];
%A序列前后补零
B=fliplr(B);
%反转B
B=[B,zeros(1,l1+l2)];
%B序列后面补零与A长度相等
fori=1:
Lx%计算z(i)
z(i)=A
(1)*B
(1);
fork=2:
length(B)
z(i)=z(i)+A(k)*B(k);
end
t=B(length(B));
%保存B序列最后一个数
forj=length(B):
-1:
2%B序列依次向后移位
B(j)=B(j-1);
B
(1)=t;
end
设h=[1,3,5,7]
X=[9,8,7,6,5,4,3,2,1]
调用系统函数conv(h,x)
系统函数conv(h,x)
设计函数与调用系统函数结果完全一样,设计函数符合要求。
四、实验结果
1、实验源程序
见附录
2、实验结果
五、总结
作为电子信息工程系的学生,数字信号处理这门课程是其他很多课程的基础,所以学好学通数字信号处理这门课程对我们来说是非常重要的。
而MATLAB这款软件对数字信号处理的建模、编程、分析、实现有极大的帮助作用,所以我们应该掌握使用MATLAB编程来实现对数字信号的处理。
此次我得到的课设题目是:
通过重叠相加法计算卷积。
拿到课设题目后,我仔细研究了与题目相关的原理,包括线性卷积、周期卷积、圆周卷积、重叠相加法、离散福利叶变换DFT、快速傅里叶变换FFT等原理知识,弄清楚了它们之间的关系。
通过这次课程设计,我不仅顺利完成课程设计的要求,而且在课程设计过程过对相关原理的回顾,对各相关原理之间的关系有了脱胎换骨般的认识,让我意识到此前学到的知识是多么的浅薄。
在和同组同学一起讨论研究通基于重叠相加法的圆周卷积原理后,我开始了利用MATLAB来实现这个功能。
在编写程序的过程中,我查阅了很多有关MATLAB的编程知识,通过整合所查阅到的编程知识,结合先前研究的基于重叠相加法的圆周卷积原理,我设计了具有此功能的MATLAB函数。
在设计时我遇到了不少的问题,刚开始时我先设定分段长度N,然后由N来求卷积周期L。
但是在程序运行过程中我发现算法具有很大的局限性。
通过仔细揣摩这其中的问题,原来是我忽略了FFT运算的条件。
所以我制定了第二个方案,先设定卷积的周期L,然后由L来求分段长度N,这样程序的适用围就扩大了。
为了提高程序的适用性,我不断的对程序进行修改和测试,以求能够达到更好的效果,这个过程让我体会到了编程解决问题的乐趣。
通过这次课程设计,让我加深了对书本知识的理解,并应用课本的理论知识,结合相关软件,设计解决问题的算法。
从而提高了由知识转换为技能的能力,提高了自己的实践能力。
通过与同学的互相沟通,不仅使各自的知识得到了扩充,而且从中得到了很多的启示,这次课程设计让人受益匪浅。
六、参考文献
[1]高西全、丁玉美.数字信号处理第三版.电子科技大学.2008.
[2]罗建军、琦.精讲多练MATLAB.:
交通大学.2002.
[3]泉、阙大顺、郭志强.数字信号处理.电子工业.2009.
[4]程卫国.MATLAB53精要编程与高级应用.:
机械工业.2000.
[5]正周.MATLAB数字信号处理与应用.:
清华大学.2008.
[6]周建兴、岂兴明等编.MATLAB从入门到精通.人民邮电.2008
[7]徐金明、孟喜、丁涛编.Matlab实用教程.清华大学,交通大学.2007.
附录:
源程序
functionvarargout=zc(varargin)
%ZCM-fileforzc.fig
%ZC,byitself,createsanewZCorraisestheexisting
%singleton*.
%
%H=ZCreturnsthehandletoanewZCorthehandleto
%theexistingsingleton*.
%ZC('
Property'
'
Value'
...)createsanewZCusingthe
%givenpropertyvaluepairs.Unrecognizedpropertiesarepassedvia
%varargintozc_OpeningFcn.Thiscallingsyntaxproducesa
%warningwhenthereisanexistingsingleton*.
CALLBACK'
)andZC('
hObject,...)callthe
%localfunctionnamedCALLBACKinZC.Mwiththegiveninput
%arguments.
%*SeeGUIOptionsonGUIDE'
sToolsmenu.Choose"
GUIallowsonlyone
%instancetorun(singleton)"
.
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpzc
%LastModifiedbyGUIDEv2.530-Jun-201022:
11:
29
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
zc_OpeningFcn