08实验八利用快速傅里叶变换(FFT)实现快速卷积
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八利用FFT实现快速卷积
一、实验目的
(1)通过这一实验,加深理解FFT在实现数字滤波(或快速卷积)中的重要作用,更好的利用FFT进行数字信号处理。
(2)进一步掌握循环卷积和线性卷积两者之间的关系。
二、实验原理与方法
数字滤波器根据系统的单位脉冲响应h(n)是有限长还是无限长可分为有限长单位脉冲响应(Finite Impulse Response)系统(简记为FIR系统)和无限长单位脉冲响应(Infinite Impulse Response)系统(简记为IIR系统)。
对于FIR滤波器来说,除了可以通过数字网络来实现外,也可以通过FFT的变换来实现。
一个信号序列x(n)通过FIR滤波器时,其输出应该是x(n)与h(n)的卷积:
或
当h(n)是一个有限长序列,即h(n)是FIR滤波器,且
时
在数字网络(见图6.1)类的FIR滤波器中,普遍使用的横截型结构(见下图6.2)就是按这个卷积公式构成的。
图6.1 滤波器的数字网络实现方法
图6.2 FIR滤波器横截型结构
应用FFT实现数字滤波器实际上就是用FFT来快速计算有限长度列间的线性卷积。
粗略地说,这种方法就是先将输入信号x(n)通过FFT变换为它的频谱采样
值X(k),然后再和FIR滤波器的频响采样值H(k)相乘,H(k)可事先存放在存储器中,最后再将乘积H(k)X(k)通过快速傅里叶变换(简称IFFT)还原为时域序列,即得到输出y(n)如图6.3所示。
图6.3 数字滤波器的快速傅里叶变换实现方法
现以FFT求有限长序列间的卷积及求有限长度列与较长序列间的卷积为例来讨论FFT的快速卷积方法。
(1)序列
和
的列长差不多。
设
的列长为
,
的列长为
,要求
N
用FFT完成这一卷积的具体步骤如下:
i. 为使两有限长序列的线性卷积可用其循环卷积代替而不发生混叠,必须选择循环卷积长度
,若采用基2-FFT完成卷积运算,要求
(
为整数)。
ii. 用补零方法使
,
变成列长为
的序列。
iii. 用FFT计算
的
点离散傅里叶变换
iv. 做
和
乘积,
v. 用FFT计算
的离散傅里叶反变换得
(2)当x(n)长度很长时,即
,通常不允许等x(n)全部采集齐后再进行卷积,否则使输出相对于输入有较长的延时,另外,若
太大,
要补上太多的零点,很不经济,且FFT的计算时间也要很长。
为此,采用分段卷积的方法,即把x(n)分成长度与h(n)相仿的一段段,分别求出每段卷积的结果,然后用相应的方式把它们结合起来,便是总的输出。
分段卷积方法主要有两种,即重叠相加法和重叠保留法。
具体内容请参考教材中“快速离散傅里叶变换”一章中的线性卷积的FFT算法部分,本实验这部分不作重点要求。
三、实验任务
(1)用FFT实现以下两序列的线性卷积。
n=[0:1:11];
m=[0:1:5];
N1=length(n);
N2=length(m);
xn=0.8.^n;
hn=ones(1,N2);
N=N1+N2-1;
XK=fft(xn,N);
HK=fft(hn,N);
YK=XK.*HK;
yn=ifft(YK,N);
if all(imag(xn)==0)&(all(imag(hn)==0))
yn=real(yn);
end
x=0:N-1;
stem(x,yn,'.')
title('2015167111(1)??D??í?y');
(2)数字滤波器的脉冲响应为
可自定,本实验取
输入序列
可选下列几种情况
i.
可取16
clc
clear all
n=[0:1:15];
m=[0:1:16];
N1=length(n);
N2=length(m);
x=ones(1,N1);
h=(-1/2).^m;
N=N1+N2-1;
X=fft(x,N);
H=fft(h,N);
Y=X.*H;
y=ifft(Y,N);
if all(imag(x)==0)&(all(imag(h)==0)) y=real(y);
end
x1=0:N-1;
stem(x1,y);
title('2015167111(2-1)FFT快速卷积'); ii.
clc
clear all
n=[0:1:15];
m=[0:1:16];
N1=length(n);
N2=length(m);
x=cos(2*pi*n/16);
h=(-1/2).^m;
N=N1+N2-1;
X=fft(x,N);
H=fft(h,N);
Y=X.*H;
y=ifft(Y,N);
if all(imag(x)==0)&(all(imag(h)==0)) y=real(y);
end
x1=0:N-1;
stem(x1,y);
title('2015167111(2-2)FFT快速卷积'); iii.
clc
clear all
n=[0:1:15];
m=[0:1:16];
N1=length(n);
N2=length(m);
x=(1/3).^n; ;
h=(-1/2).^m;
N=N1+N2-1;
X=fft(x,N);
H=fft(h,N);
Y=X.*H;
y=ifft(Y,N);
if all(imag(x)==0)&(all(imag(h)==0))
y=real(y);
end
x1=0:N-1;
stem(x1,y);
title('2015167111(2-3)FFT快速卷积');
附:实验用MATLAB语言工具函数简介
若序列x1(n)、x2(n)为长度分别为N1、N2的有限长序列,
N
,。
由DFT的性质可知:当
时有。
序列较长时DFT运算通常用快速算法FFT实现。
在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅里叶变换和逆变换。
函数FFT的调用格式同实验七。