DSP课设设计基于重叠相加法圆周卷积的实现.docx
《DSP课设设计基于重叠相加法圆周卷积的实现.docx》由会员分享,可在线阅读,更多相关《DSP课设设计基于重叠相加法圆周卷积的实现.docx(15页珍藏版)》请在冰豆网上搜索。
DSP课设设计基于重叠相加法圆周卷积的实现
题目:
基于重叠相加法圆周卷积的实现
初始条件:
具备数字信号处理的理论知识;
具备Matlab编程能力;
分析重叠相加法的圆周卷积的原理;
提供编程所需要的计算机一台
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、独立编写程序实现基于重叠相加法的圆周卷积
2、用Matlab验证程序结果,并分析重叠相加法的圆周卷积的原理
3、完成符合学校要求的设计说明书
时间安排:
一周,其中3天程序设计,2天程序调试
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
摘要I
1软件基础1
1.1MATLAB介绍1
1.2MATLAB的应用2
2理论基础3
2.1圆周卷积原理3
2.2重叠相加法4
3程序设计6
3.1程序设计思路6
3.2程序设计流程图7
3.3方案比较8
4程序代码9
5程序运行结果与分析11
心得体会12
参考文献13
摘要
MATLAB是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司出品的商业数学软件,主要用于算法开发、数据可视化、数据分析以及数值计算等领域。
本次课程设计将通过MATLAB软件进行重叠相加法圆周卷积的设计,并对其具体过程进行分析。
关键词:
MATLAB重叠相加法圆周卷积
1软件基础
1.1MATLAB介绍
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
Matlab和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接MATLAB开发工作界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以使用。
MATLAB具有以下特点:
1.高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;
2.具有完备的图形处理功能,实现计算结果和编程的可视化;
3.友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;
4.功能丰富的应用工具箱,为用户提供了大量方便实用的处理工具。
1.2MATLAB的应用
MATLAB产品族可以用来进行以下各种工作:
●数值分析
●数值和符号计算
●工程与科学绘图
●控制系统的设计与仿真
●数字图像处理技术
●数字信号处理技术
●通讯系统设计与仿真
●财务与金融工程
MATLAB的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域。
附加的工具箱(单独提供的专用MATLAB函数集)扩展了MATLAB环境,以解决这些应用领域内特定类型的问题。
2理论基础
2.1圆周卷积原理
对两个N点序列
和
,除了可以做线性卷积外,还有一种很重要的卷积运算,就是圆周卷积。
令
则圆周卷积结果长度不变,为N。
由上式可以得出圆周卷积与周期卷积的关系,就是有限长序列圆周卷积结果的周期延拓,等于它们周期延拓后的周期卷积。
也就是说,周期卷积的主值序列,是各周期序列主值序列的圆周卷积。
圆周卷积的实现步骤如下:
若
、
分别是长度为N、M的序列则
与
线性卷积至多M+N-1个非零值,如果LM+N-1时,周期延拓才不会发生混叠。
之所以讨论用圆周卷积来计算线性卷积的条件,是因为圆周卷积可在频域下利用DFT求得,从而可采用DFT的快速算法FFT来计算,这样就可以利用FFT来计算线性卷积,大大提高运算效率。
2.2重叠相加法
在实际应用中利用FFT来计算两个序列的圆周卷积从而实现计算其线性卷积,但是常遇到的问题是参加卷积的两个序列的长度相差较大,这样长度小的序列就需要补很多的零点,这样就需要打的存储量,运算时间也会变长。
所以常用到的解决方法有两种,其中一种就是重叠相加法。
h(n)长度为N,x(n)长度为无限长,
x(n)取M点,且与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)的重叠部分相加,最后得到结果为
3程序设计
由以上原理可以设计程序利用FFT算法来实现基于重叠相加法的圆周卷积。
3.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:
(1)首先取长序列x(n)进行分段的长度N,以使其分段后的长度与较短的相近
(2)确定圆周卷积的周期L
(3)填充序列使得循环中对序列的索引不会超出范围
(4)确定分段数K
(5)对序列进行分段调用juanji()函数计算圆周卷积
(6)各段重叠相加
(7)取出实际的输出序列
方案2:
(1)首先取圆周卷积的周期L(即进行L点的快速傅里叶变换)
(2)计算每一分段的大小N
(3)填充序列使得循环中对序列的索引不会超出范围
(4)计算分段数K
(5)对序列进行分段调用juanji()函数计算圆周卷积
(6)各段重叠相加
(7)取出实际的输出序列
3.2程序设计流程图
整体程序包含主程序与卷积函数、重叠相加函数两大部分。
函数juanji()流程图如下
此函数用于对X1和X2两序列进行快速傅里叶变换后进行乘积,之后再进行反变换后恢复到时域结果。
chongdie(x,h,N)函数流程图如下:
方案1:
方案2:
3.3方案比较
方案1和方案2的区别在于:
在方案1中由已知的长序列x(n)分段大小N、短序列长度M依据公式计算L
N+M-1圆周卷积周期L。
而在方案2中由已知的圆周卷积周期L、短序列长度M依据公式计算长序列x(n)的分段大小。
比较这两种方案可以知道,方案1中如果L直接取L=N+M-1,则L的值不一定是2的n次方,而接下来的要进行的L点快速傅里叶变换中,L的值需要为2的n次方才能正确计算。
所以方案1的必须要求取恰当的N值以使L点满足要求。
方案2中可以直接取L为恰当的值从而满足快速傅里叶变换的要求,所以方案2比方案1的适用范围更大。
4程序代码
主程序:
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)
r=1:
3;subplot(2,2,2);
stem(r,x2)
u=1:
13;subplot(2,2,3);
stem(u,y)
函数juanji():
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
函数chongdie():
方案1:
function[y]=chongdie(x,h,N)
Lenx=length(x);%取x(n)的长度
M=length(h);%取h(n)的长度
L=N+M-1;%计算圆周卷积的周期L使其不发生混叠
x=[x,zeros(1,N-1)];%填充序列使得循环中对序列的索引不会超出围
K=floor(Lenx/N);
y=zeros(1,Lenx+L-1);%确定分段数K
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-1);%取出实际的输出序列
方案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);%取出实际的输出序列
5程序运行结果与分析
输入序列和周期L
x1=[1,2,3,4,5,5,4,3,2,1];
x2=[1,0,1];
L=8;
运算结果:
124689986421
由程序运行结果与线性卷积结果比较可以知道程序计算结果正确的。
心得体会
作为电子信息工程系的学生,数字信号处理这门课程是其他很多课程的基础,所以学好数字信号处理这门课是非常重要的。
而MATLAB这款软件对数字信号处理的建模、编程、分析、实现有极大的帮助作用,所以我们应该掌握使用MATLAB编程来实现对数字信号的分析处理。
此次我得到的课设题目是:
基于重叠相加法圆周卷积的实现。
拿到课设题目后,我仔细研究了与题目相关的原理,包括线性卷积、周期卷积、圆周卷积、重叠相加法、离散傅里叶变换DFT、快速傅里叶变换FFT等原理知识,弄清楚了它们之间的关系。
通过这次课程设计,我不仅顺利完成课程设计的要求,而且在课程设计过程中通过对相关原理的回顾,对各相关原理之间的关系有了脱胎换骨般的认识,也意识到此前学到的理论知识是多么的浅薄。
在和同组同学一起讨论基于重叠相加法的圆周卷积原理后,我开始了利用MATLAB来实现这个功能。
在编写程序的过程中,我查阅了很多有关MATLAB的编程知识,通过整合所查阅到的编程知识,结合先前研究的基于重叠相加法的圆周卷积原理,我设计了具有此功能的MATLAB函数。
在设计时我遇到了不少的问题,刚开始时我先设定分段长度N,然后由N来求卷积周期L。
但是在程序运行过程中我发现算法具有很大的局限性。
通过仔细揣摩这其中的问题,原来是我忽略了FFT运算的条件。
所以我制定了第二个方案,先设定卷积的周期L,然后由L来求分段长度N,这样程序的适用范围就扩大了。
为了提高程序的适用性,我不断的对程序进行修改和测试,以求能够达到更好的效果,这个过程让我体会到了编程解决问题的乐趣。
通过本次课程设计,我对书本知识有了更深刻的理解,并应用课本的理论知识,结合相关软件,设计解决问题的算法。
从而提高了由知识转换为技能的能力,提高了自己的实践能力。
通过与同学的互相沟通,不仅使各自的知识得到了扩充,而且从中得到了很多的启示,这次课程设计让人受益匪浅。
参考文献
【1】《数字信号处理》,刘泉、阙大顺、郭志强编著,电子工业出版社,2009
【2】《信号与系统》,刘泉,江雪梅编著,高等教育出版社,2006
【3】《MATLAB从入门到精通》,周建兴、岂兴明等编,人民邮电出版社,2008
【4】《MATLAB实用教程》,徐金明、张孟喜、丁涛编,清华大学出版社,2007
【5】《MATLAB数字信号处理与应用》,李正周编,清华大学出版社,2008
.