实验八 利用FFT 实现快速卷积
一、 实验目的
(1) 通过这一实验,加深理解FFT 在实现数字滤波(或快速卷积)中的重要作用,更好的利用FFT 进行数字信号处理。
(2) 进一步掌握循环卷积和线性卷积两者之间的关系。
二、 实验原理与方法
数字滤波器根据系统的单位脉冲响应h(n)是有限长还是无限长可分为有限长单位脉冲响应(Finite Impulse Response )系统(简记为FIR 系统)和无限长单位脉冲响应(Infinite Impulse Response )系统(简记为IIR 系统)。
对于FIR 滤波器来说,除了可以通过数字网络来实现外,也可以通过FFT 的变换来实现。
一个信号序列x(n)通过FIR 滤波器时,其输出应该是x(n)与h(n)的卷积:
∑+∞
-∞
=-=
=m m n h m x n h n x n y )()()(*)()(
或
∑+∞
-∞
=-=
=m m n x m h n x n h n y )
()()(*)()(
当h(n)是一个有限长序列,即h(n)是FIR 滤波器,且10-≤≤N n 时
∑-=-=1
0)
()()(N m m n x m h n y
在数字网络(见图6.1)类的FIR 滤波器中,普遍使用的横截型结构(见下图6.2
图6.1 滤波器的数字网络实现方法
图6.2 FIR 滤波器横截型结构
y(n)
y(n)
-1-1-1-1
应用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 x 和)(n h 的列长差不多。
设)(n x 的列长为1N ,)(n h 的列长为2N ,要求
)()(n x n y =N
∑-=-==1
)
()()(*)()(N r r n h r x n h n x n h
用FFT 完成这一卷积的具体步骤如下: i.
为使两有限长序列的线性卷积可用其循环卷积代替而不发生混叠,必须选择循环卷积长度121-+≥N N N ,若采用基2-FFT 完成卷积运
算,要求m
N 2=(m 为整数)。
ii.
用补零方法使)(n x ,)(n h 变成列长为N 的序列。
⎩⎨
⎧-≤≤-≤≤=10
10)()(11N n N N n n x n x ⎩⎨
⎧-≤≤-≤≤=10
1
0)()(22N n N N n n h n h iii.
用FFT 计算)(),(n h n x 的N 点离散傅里叶变换
)()(k X n x FFT
−−→− )()(k H n h FFT −−→−
iv. 做)(k X 和)(k H 乘积,)()()(k H k X k Y ⋅=
v.
用FFT 计算)(k Y 的离散傅里叶反变换得
y(n)
*
101
0)(*1)(1)(⎭⎬
⎫⎩⎨⎧⎥⎦⎤
⎢⎣⎡=⎥⎦⎤⎢⎣⎡=∑∑-=---N k nk x N k nk x W k Y N W k Y N n y
(2) 当x(n)长度很长时,即21N N >>,通常不允许等x(n)全部采集齐后再进行卷积,否则使输出相对于输入有较长的延时,另外,若121-+N N 太大,)(n h 要
补上太多的零点,很不经济,且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)ÏßÐÔ¾í»ý');
⎩⎨
⎧≤≤=⎩⎨
⎧≤≤=其它
其它0
501)(01108.0)(n n h n n x n
(2)数字滤波器的脉冲响应为2
2),()21
()(N n R n h N n =可自定,本实验取172=N
输入序列)(n x 可选下列几种情况
i.
)()(1n R n x N = 1N 可取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.
16)(2cos
)(111
==N n nR N n x N π
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.
16
),()31
)((11=N n R n x N n
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 语言工具函数简介
若序列x 1(n)、x 2(n)为长度分别为N 1、N 2的有限长序列,)()(1n x n y c =N )(2n x ,)(*)()(21n x n x n y l =。
由DFT 的性质可知:当121-+≥N N N 时有)]]([)]([[)()(21n x DFT n x DFT IDFT n y n y c l ⋅==。
序列较长时DFT 运算通常用快速
算法FFT实现。
在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅里叶变换和逆变换。
函数FFT的调用格式同实验七。
最新文件---------------- 仅供参考--------------------已改成word文本--------------------- 方便更改。