课程设计任务书学生姓名:专业班级:指导教师:工作单位:信息工程学院题目:基于重叠相加法圆周卷积的实现初始条件:具备数字信号处理的理论知识;具备Matlab编程能力;分析重叠相加法的圆周卷积的原理;提供编程所需要的计算机一台要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、独立编写程序实现基于重叠相加法的圆周卷积2、用Matlab验证程序结果,并分析重叠相加法的圆周卷积的原理3、完成符合学校要求的设计说明书时间安排:一周,其中3天程序设计,2天程序调试指导教师签名:年月日系主任(或责任教师)签名:年月日武汉理工大学《数字信号处理》课程设计说明书1目录摘要...................................................................21概述.................................................................32理论分析.............................................................42.1圆周卷积原理.....................................................42.2重叠相加法.......................................................52.3重叠相加法圆周卷积................................................62.4线性卷积、圆周卷积、重叠相加法、DFT、FFT之间的联系.................83程序设计..............................................................93.1程序设计思路.....................................................93.2程序设计流程图..................................................103.3程序代码........................................................104结果分析.................................................................124.1线性卷积结果....................................................124.2重叠相加法圆周卷积结果...........................................135心得体会.............................................................14参考文献..............................................................15武汉理工大学《数字信号处理》课程设计说明书2摘要MATLAB是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司出品的商业数学软件,主要用于算法开发、数据可视化、数据分析以及数值计算等领域。本次课程设计将通过MATLAB软件进行重叠相加法圆周卷积的设计,并对其具体过程进行分析。关键词:MATLAB重叠相加法圆周卷积武汉理工大学《数字信号处理》课程设计说明书31概述MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以使用。MATLAB具有以下特点:1.高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;2.具有完备的图形处理功能,实现计算结果和编程的可视化;3.友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;4.功能丰富的应用工具箱,为用户提供了大量方便实用的处理工具。武汉理工大学《数字信号处理》课程设计说明书42理论分析2.1圆周卷积原理对两个N点序列)(1nx和)(2nx,除了可以做线性卷积外,还有一种很重要的卷积运算,就是圆周卷积。令则圆周卷积结果长度不变,为N.由上式可以得出圆周卷积与周期卷积的关系,就是有限长序列圆周卷积结果的周期延拓,等于它们周期延拓后的周期卷积。也就是说,周期卷积的主值序列,是各周期序列主值序列的圆周卷积。若)(1nx、)(2nx分别是长度为N、M的序列则)(1nx与)(2nx线性卷积至多M+N-1个非零值,如果LM+N-1则周期延拓时必然会有一部分非零值发生混叠;只有当LM+N-1时,周期延拓才不会发生混叠。之所以讨论用圆周卷积来计算线性卷积的条件,是因为圆周卷积可在频域下利用DFT求得,从而可采用DFT的快速算法FFT来计算,这样就可以利用FFT来计算线性卷积,大大提高运算效率。1010)()(1111NnNNnnxnx1010)()(2222NnNNnnxnx1012102121))(()())(()()()()(NmNNmNmnxmxmnxmxnxnxny武汉理工大学《数字信号处理》课程设计说明书5圆周卷积的实现步骤如下图:图2.1圆周卷积的实现步骤2.2重叠相加法DFT是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的。DFT具备明确且合理的物理含义,适合应用于数字系统,同时可以方便地由计算机进行运算。对于线性非移变离散系统,可由线性卷积表示时域输入输出关系,即y(n)=x(n)*h(n)通常采用循环卷积降低运算量,但实际中往往无法满足对信号处理的实时性要求。因此,产生了重叠相加法,用以快速计算线性卷积,成为了DFT的一个重要应用。重叠相加法是将待过滤的信号分割成长为N的若干段,如图1所示,每一段都可以和有限时宽单位取样响应作卷积,再将过滤后的各段重叠相加。具体算法实现原理如图2所示,建立缓存序列,每次输入N点序列,通过计算补零:按要求使两序列补零后均为N点周期延拓:将一个序列按M点延拓为周期序列翻褶:将延拓后的周期序列翻褶取主值序列:对翻褶后的周期序列取主值圆周移位:对此主值序列做圆周移位(n)相乘:每次移位后的序列与另一序列相乘相加:将诸m点(m=0,1…m-1)的乘积值相加,即为移位n点后的y(n)值(n=0,1…n-1)武汉理工大学《数字信号处理》课程设计说明书6x(n)和h(n)的循环卷积实现线性卷积运算,将缓存的M-1点序列和卷积结果相加,并输出前N点作为计算结果,同时缓存后M-1点,如此循环,直至所有分段计算完毕,则输出序列y(n)为最终计算结果。图2.2重叠相加法的分段示意图图2.3重叠相加法算法示意图2.3重叠相加法圆周卷积在实际应用中利用FFT来计算两个序列的圆周卷积从而实现计算其线性卷积,但是常遇到的问题是参加卷积的两个序列的长度相差较大,这样长度小的序列就需要补很多的零点,这样就需要较大的存储量,运算时间也会变长。所以常用到的解决方法有两种,其中一种就是重叠相加法。武汉理工大学《数字信号处理》课程设计说明书7h(n)长度为N,x(n)长度为无限长,x(n)取M点,且与N尽量接近图2.4重叠相加法的卷积示意图重叠相加法的步骤如下(1)将h(n)补零延长到L=M+N-1,并计算长为L的FFT,得到H(k)。(2)分别将xk(n)补零延长到L=M+N-1,并计算长为L的FFT,得到Xk(k)(3)计算)()()(kHkXkYkk,并求长为L的反变换,即)]([)(kYIFFTnykk(4)将yk(n)的重叠部分相加,最后得到结果为kknyny)()(kknxnx)()()()()(kMnRnxnxMkx(n)与h(n)的卷积为)(*)()(*)()(nxnhnhnxnykk)()](*)([nynhnxkkkk武汉理工大学《数字信号处理》课程设计说明书82.4线性卷积、圆周卷积、重叠相加法、DFT、FFT之间的联系由时域与频域的关系可知,两序列)(1nx和)(2nx在时域下进行线性卷积的结果等于这两个序列在频域下相乘后进行反变换回时域的结果。圆周卷积在一定条件下(LM+N-1)与线性卷积得到的结果相同,而圆周卷积可在频域下利用DFT求得,从而可采用DFT的快速算法FFT来计算,这样就可以利用FFT来计算线性卷积,大大提高运算效率。而在利用FFT来计算圆周卷积的过程中当两序列的长度相差较大时采用重叠相加法来进行计算可有效提高计算的效率,减小存储空间的消耗。武汉理工大学《数字信号处理》课程设计说明书93程序设计3.1程序设计思路线性卷积函数iconv(x1,x2,L)设计(1)x1(n)进行N点快速傅里叶变换得X1(k)(2)x2(n)进行N点快速傅里叶变换得X2(k)(3)进行频域相乘Y(k)=X1(k)*X2k(4)对Y(k)进行反变换得到时域卷积结果y(n)圆周卷积函数oconv(x,h,N)设计方案1:(1)首先取长序列x(n)进行分段的长度N,以使其分段后的长度与较短的相近(2)确定圆周卷积的周期L(3)填充序列使得循环中对序列的索引不会超出范围(4)确定分段数K(5)对序列进行分段调用conv()函数计算圆周卷积(6)各段重叠相加(7)取出实际的输出序列方案2:(1)首先取圆周卷积的周期L(即进行L点的快速傅里叶变换)(2)计算每一分段的大小N(3)填充序列使得循环中对序列的索引不会超出范围(4)计算分段数T(5)对序列进行分段调用conv()函数计算圆周卷积(6)各段重叠相加(7)取出实际的输出序列结论:方案二比较接近我们平常的思维,使用较为方便,利于程序调试。武汉理工大学《数字信号处理》课程设计说明书103.2程序设计流程图图3.1程序设计流程图3.3程序代码functiony=iconv(x1,x2,L)%利用循环卷积计算线性卷积%循环卷积采用频域计算方法,已FFT代替DFT,降低运算量X1k=fft(x1,L);%x1做L点FFTX2k=fft(x2,L);%x1做L点FFTYk=X1k.*X2k;%频域相乘y=ifft(Yk);%FFT反变换得循环卷积结果开始输入序列x(n),h(n)计算各个序列长度,分段数,生成临时序列填入保留值后分段循环卷积输出前N个点并为t(n)重新赋为保留值完成所有分段计算输出序列y(n)结束武汉理工大学《数字信号处理》课程设计说明书11functiony=oconv(x,h,N)%重叠相加法实现%核心为将高点数DFT转化为低点数DFT,且用循环卷积计算线性卷积M=length(h);%获得h(n)的长度ifNM%为N选择合适的值保证运算正确N=M+1;endL=M+N-1;%循环卷积与线性卷积结果相同时需要进行运算的最少点数Lx=length(x);%获得x(n)的长度T=ceil(Lx/N);%确定分段数Tt=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:Txi=i*N+1;x_seg=x(xi:xi+N-1);%选择低点数计算时