快速卷积MATLAB实现.docx

上传人:b****1 文档编号:927821 上传时间:2022-10-14 格式:DOCX 页数:10 大小:207.32KB
下载 相关 举报
快速卷积MATLAB实现.docx_第1页
第1页 / 共10页
快速卷积MATLAB实现.docx_第2页
第2页 / 共10页
快速卷积MATLAB实现.docx_第3页
第3页 / 共10页
快速卷积MATLAB实现.docx_第4页
第4页 / 共10页
快速卷积MATLAB实现.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

快速卷积MATLAB实现.docx

《快速卷积MATLAB实现.docx》由会员分享,可在线阅读,更多相关《快速卷积MATLAB实现.docx(10页珍藏版)》请在冰豆网上搜索。

快速卷积MATLAB实现.docx

快速卷积MATLAB实现

快速卷积MATLAB实现

摘要

在信号处理中,许多具体的应用是以线性卷积为基础的。

当序列点数较少时可以直接计算线性卷积,然而当序列长度很长时,直接计算卷积的运算量非常庞大。

快速卷积是实现卷积的一种快速算法,减少了运算量,节约了时间,给我们计算卷积提供了很大的便利。

本课程设计是以Matlab为基础,完成序列的卷积和快速卷积运算的编程实现,以及相应的分析和比较。

关键字:

Matlab卷积快速卷积

 

1.基于设计题目的原理简介

卷积是数字信号处理(DSP)系统中最常见的,也是最重要的运算之一,无论在时域或频域都离不开卷积运算,FFT是DFT的快速算法,当满足一定条件时可用来计算线性卷积,称为快速卷积。

Matlab具有强大的矩阵运算能力,方便实用的绘图功能和语言的高度集成性,在DSP开发中,使用Matlab可以快速对系统进行仿真运算。

1.1序列卷积的定义

设x(n)和h(n)是两个离散序列,进行下列求和运算:

这样,随着n的不同取值,这个求和公式就定义了一个新序列y(n),称为序列x(n)与h(n)的卷积,记为y(n)=x(n)*h(n)。

由于DSP主要依靠计算机完成,而计算机无论在时域或频域只能处理有限长的离散信号。

此时只需令上述公式中的n在一个范围内取值即可。

1.2快速傅里叶变换FFT概念

DFT就是对序列频谱的离散化,在数字信号处理中有着重要的作用,但直接计算DFT的运算量非常大,它与序列长度的平方成正比,因此制约了DFT的应用。

快速傅里叶变换FFT是实现DFT的一种快速算法,能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

因而FFT也有重要的作用,下面一节要介绍的快速卷积就是其应用之一。

1.3快速卷积方法及实现

在信号处理中,许多具体的应用是以线性卷积为基础的。

我们知道,当满足一定条件(L≥M+N-1)时,可以用圆周卷积来计算线性卷积。

由圆周卷积定理知道,圆周卷积可以借助DFT来运算,因此DFT的快速算法FFT就可以用来计算线性卷积。

设x1(n)与x2(n)分别是长度为N与M的有限长序列,它们的线性卷积为yl(n),L点的圆周卷积为yc(n),它们的关系为:

yc(n)=∑yl(n+rL)RL(n)

快速卷积算法过程的示意图如图1.1所示。

在实际应用中,常遇到的问题是参加卷积的两个序列的长度相差较大,这样长度小的序列就需补很多的零点,这样就需要大的存储量,运算时间也会变长。

常用的解决方法有两种,一是重叠想加法,另一种是重叠保留法。

这里不作介绍。

图1.1快速卷积示意图

1.4直接卷积和快速卷积分析比较

快速卷积,顾名思义,其重点在一个“快”,如果对卷积速度要求较高,快速卷积无疑是理想的工具。

当然,为了提高速度,就要牺牲面积和功耗。

而且由上一节的介绍可知,快速卷积运算的步骤较多,因而当序列较短时快速卷积运算并没有优势,直接进行卷积运算反而更简便。

卷积计算的方法选择要视实际情况而定。

2.程序设计及运行结果分析

2.1题目一

已知线性非移变系统的h(n)=[6,2,3,6,4,2],输入为x(n)=[1,2,3,4,5];

(1)用人工计算系统输出y(n);

(2)编写程序输出y(n),并作图。

2.1.1人工计算

长度为N=6的序列h(n)和长度为M=5的序列x(n),卷积y(n)的序列长度为(M+N-1)=10, 计算过程如下:

   

y

(1) = h

(1)•x

(1) =6

      y

(2) = h

(1)•x

(2)+h

(2)•x

(1) =14 

      y(3) =h

(1)•x(3)+h

(2)•x

(2)+h(3)•x

(1) = 25

       …  

     y(n) = h

(1)•x(n)+h

(2)•x(n-1)+ … +h(n)•x

(1)        …  

      y(M+N-1) = h

(1)•x(M+N-1)+h

(2)•x(M+N)+h(3)•x(M+N+1)+…+h(M+N-1)•x

(1) =10

所得的结果为y(n)=[6,14,25,36,63,50,55,52,28,10]。

2.1.2程序设计

在Matlab中实现卷积的函数conv,可以直接调用。

设计程序如下:

h=[6,2,3,6,4,2];

x=[1,2,3,4,5];

y=conv(h,x);%调用conv函数直接计算线性卷积

stem(y);%画出卷积结果h(n)的序列图

title('y(n)')

2.1.3运行结果及分析

程序运行后,得到的卷积结果y(n)如图2.1所示。

图2.1编程得到的卷积结果y(n)

由图2.1可看出,编程得到的卷积结果序列y(n)与自己先前计算的结果相同,说明所设计的程序是正确的,得到了正确的结果。

 

图2.1编程得到的卷积结果y(n)

2.2题目二

用函数conv和FFT计算长为1000序列的卷积,比较其计算时间。

2.2.1设计内容及原理分析

本题目的在于比较直接卷积和快速卷积的计算时间,分析其优劣性。

由1.3节可知快速卷积算法如下:

(1)序列补零:

将两序列都补零到L点; 

(2)计算X1(k)=FFT[x1(n)];

(3)计算X2(k)=FFT[x2(n)];

(4)计算Y(k)=X1(k)X2(k);

(5)计算y(n)=x1(n)*x2(n)=IFFT[Y(k)]。

本题中已经给定两原序列的长度M=N=1000,则L≥M+N-1,而因为快速卷积的基础是FFT,所以要求L满足L=2n,为减少运算量选取L=2048。

设两原序列分别为:

x1=0.5sin(2*n);x2=n^3

计算时间的获取方法为:

计算前先调用clock函数读取瞬时时钟,待计算结束后,调用etime(t1,t2)函数计算时刻t1,t2间所经历的时间。

2.2.2程序设计框图

图2.2程序设计框图

2.2.3程序代码

N=1000;

L=pow2(nextpow2(1000+1000-1));%计算L的值

n=1:

N;

x1=0.5*sin(2*n);x2=n.^3;

t0=clock;%调用clock函数读取瞬时时钟

yc=conv(x1,x2);%用函数conv计算卷积

conv_time=etime(clock,t0)%调用etime函数计算时间

t0=clock;

yf=ifft(fft(x1,L).*fft(x2,L));%用函数FFT计算卷积

fft_time=etime(clock,t0)

subplot(321),stem(x1,'.');ylabel('x1(n)');

subplot(322),stem(x2,'.');ylabel('x2(n)');

subplot(312);stem(real(yc),'.');ylabel('直接卷积y(n)');

subplot(313);stem(real(yf),'.');ylabel('快速卷积y(n)');

2.2.4运行结果及分析

用函数conv和FFT计算长为1000序列的卷积的结果如图2.3,计算时间如图2.4。

可以看出,两种方法所计算出的卷积结果是一样的。

再来看时间,用函数conv计算该卷积需要0.0070s,而用FFT计算该卷积需要0s。

由此可以得出,当序列长度为1000时,FFT算法所消耗的时间远小于函数conv要消耗的时间。

图2.3函数conv和FFT计算长为1000序列的卷积的结果

图2.4函数conv和FFT的计算时间

2.3题目三

用快速卷积法计算

两个序列的卷积;并测试直接卷积和快速卷积的时间。

2.3.1设计内容及原理分析

用快速卷积计算两个序列卷积的方法与题目二中的一样,区别仅在于序列的长度没有给出,这里不再重复计算过程。

为了做对比分析,两个原序列的长度M和N取两组值进行仿真,分别取M=50,N=46和M=800,N=1000。

2.3.2程序设计框图

程序设计框图与题目二一样,如图2.2所示。

2.3.3程序代码

xn=0.9.^(1:

800);

hn=1.^(1:

1000);

L=pow2(nextpow2(800+1000-1));%计算L值

tic;

yc=conv(xn,hn);%直接计算卷积

toc;%计算时间

tic;

Xk=fft(xn,L);%求x(n)的快速傅里叶变换X(k)

Hk=fft(hn,L);%求h(n)的快速傅里叶变换H(k)

Yk=Xk.*Hk;%求Y(k)

yf=ifft(Yk,L);%用IFFT求快速卷积yf

toc;%计算时间

subplot(221),stem(xn,'.');title('x(n)');

subplot(222),stem(hn,'.');title('h(n)');

subplot(212),ny=1:

L;stem(real(yf),'.');title('快速卷积y(n)');

2.3.4运行结果及分析

(1)M=50,N=46

卷积结果及计算时间分别如图2.5和图2.6所示(直接卷积的计算时间在上,快速卷积的计算时间在下)。

图2.5M=50,N=46时的快速卷积

图2.6M=50,N=46时的计算时间

(2)M=800,N=1000

卷积结果及计算时间分别如图2.7和图2.8所示(直接卷积的计算时间在上,快速卷积的计算时间在下)。

图2.7M=800,N=1000时的快速卷积

图2.8M=800,N=1000时的计算时间

可以看出,当M=50,N=46时,快速卷积的计算时间比直接卷积的要长;而当M=800,N=1000时,快速卷积的时间更短。

这说明:

当序列的点数比较少时,快速卷积并不占有优势,所用时间反而比直接卷积长,只有在序列较长时,快速卷积才体现出“快”的优势。

3.心得体会

本次课程设计我的题目是——序列的卷积和快速卷积运算的编程实现,因为我们已经学习过信号与系统和Matlab应用实践课程,对序列的卷积和Matlab仿真并不陌生;而且此次题目卷积和快速卷积在课本上能找到相关的内容,老师在授课时已经讲得很详细,我对这部分的内容也比较熟悉。

所以这次课程设计做的比较顺利,没有遇到什么大的难题,只是有一些小的细节影响了设计的进程,比如函数名的拼写等。

这让我体会到,即使是比较容易的事情时,在对待它时也要很认真仔细,就像我们常说的:

细节决定成败。

数字信号处理是本专业的一门重要课程,与它相关性最强的软件就是Matlab,这次课程设计给我提供了一个用Matlab实现序列卷积和快速卷积的机会,通过编程得到了和理论一致的结果。

不仅加深了我对序列卷积和快速卷积这部分内容的理解,而且提高了我的程序编写和纠错能力,也进一步熟悉了Matlab的操作。

但这是远远不够的,卷积只是数字信号处理中比较简单的一部分,这门课程还有许多值得我们去实践和探究的地方,我现在的目标就是在假期将本课程其它几个课设题目都操作一遍,以进一步提升自己各方面的能力。

作为一名电子信息工程专业的学生,熟练掌握相关软件的操作是一门必修课,否则就算理论知识学得再好,不会应用,也只是纸上谈兵,不会真正取得什么成果,毕业之后在工作上也会很吃力。

而我们并没有专门的课程来学习这些软件,所以这就需要我们平时多多利用课余时间来自学。

现在互联网又发达,我们应充分利用这些资源,通过不断地积累知识来提高的能力。

参考文献

[1]刘泉等.数字信号处理原理与实现(第2版)[M].北京:

电子工业出版社,2009.

[2]程佩青.数字信号

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1