快速卷积的MATLAB实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速卷积的MATLAB实现
在信号处理中,许多具体的应用是以线性卷积为基础的。当序列点数较少时可以直接计算线性卷积,然而当序列长度很长时,直接计算卷积的运算量非常庞大。快速卷积是实现卷积的一种快速算法,减少了运算量,节约了时间,给我们计算卷积提供了很大的便利。本课程设计是以Matlab为基础,完成序列的卷积和快速卷积运算的编程实现,以及相应的分析和比较。关键字:Matlab 卷积快速卷积目录
1、基于设计题目的原理简介
11、1 序列卷积的定义
11、2 快速傅里叶变换FFT概念
11、3 快速卷积方法及实现
12、程序设计及运行结果分析
32、1 题目一
32、2 题目二
42、3 题目三
73、心得体会10参考文献11专业综合课程设计成绩评定表12
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计算卷积