快速傅里叶变换(含详细实验过程分析)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[实验2] 快速傅里叶变换 (FFT) 实现
一、实验目的
1、掌握FFT 算法和卷积运算的基本原理;
2、掌握用C 语言编写DSP 程序的方法;
3、了解利用FFT 算法在数字信号处理中的应用。
二、实验设备 1. 一台装有CCS 软件的计算机; 2. DSP 实验箱的TMS320C5410主控板; 3. DSP 硬件仿真器。
三、实验原理 (一)快速傅里叶变换
傅里叶变换是一种将信号从时域变换到频域的变换形式,是信号处理的重要分析工具。离散傅里叶变换(DFT )是傅里叶变换在离散系统中的表示形式。但是DFT 的计算量非常大, FFT 就是DFT 的一种快速算法, FFT 将DFT 的N 2
步运算减少至 ( N/2 )log 2N 步。
离散信号x(n)的傅里叶变换可以表示为
∑=-=1
0][)(N N nk N W n x k X , N
j N e W /2π-=
式中的W N 称为蝶形因子,利用它的对称性和周期性可以减少运算量。一般而言,FFT 算法分为时间抽取(DIT )和频率抽取(DIF )两大类。两者的区别是蝶形因子出现的位置不同,前者中蝶形因子出现在输入端,后者中出现在输出端。本实验以时间抽取方法为例。
时间抽取FFT 是将N 点输入序列x(n) 按照偶数项和奇数项分解为偶序列和奇序列。偶序列为:x(0), x(2), x(4),…, x(N-2);奇序列为:x(1), x(3), x(5),…, x(N-1)。这样x(n) 的N 点DFT 可写成:
()()∑++∑=-=+-=1
2/0
)12(1
2/0
2122)(N n k
n N
N n nk
N
W n x W
n x k X
考虑到W N 的性质,即
2/)2//(22/)2(2][N N j N j N W e e W ===--ππ
因此有:
()()∑++∑=-=-=12/0
2/1
2/0
2
/122)(N n nk
N k N
N n nk
N W n x W
W
n x k X
或者写成:
()()12()k
N X k X k W X k =+
由于X 1(k) 与X 2(k) 的周期为N/2,并且利用W N 的对称性和周期性,即:
k
N
N
k
N
W
W-
=
+2/
可得:
()()
12
(/2)k
N
X k N X k W X k
+=-
对X1(k) 与X2(k)继续以同样的方式分解下去,就可以使一个N点的DFT最终用一组2点的DFT来计算。在基数为2的FFT中,总共有log2(N) 级运算,每级中有N/2 个2点FFT蝶形运算。
单个蝶形运算示意图如下:
以N=8为例,时间抽取FFT的信号流图如下:
从上图可以看出,输出序列是按自然顺序排列的,而输入序列的顺序则是“比特反转”方式排列的。也就是说,将序号用二进制表示,然后将二进制数以相反方向排列,再以这个数作为序号。如011变成110,那么第3个输入值和第六个输入值就要交换位置了。一种比较常用有效的方法就是雷德算法。
(二)卷积运算
卷积是数字信号处理中经常用到的运算。其基本的表达式为:
()()()
∑
=
-
=
n
m
m
n
x
m
h
n
y
编写实现程序时需要注意两点:(1)序列数组长度的分配,尤其是输出数组y (n) 要有足够的长度;(2)循环体中变量的位置,即n和m的关系。
(三)IDFT的FFT实现
IDFT与DFT的关系为
{}1
*
**
1
()[()]()
N
kn
N
k
x n IDFT X k X k W
N
-
=
==∑
即
{}**
1()[()]x n DFT X k N
=
那么直接调用FFT 子程序计算IDFT 的方法是:
X
(四)线性卷积的FFT 实现
当有限长序列x(n)与h(n)的圆周卷积长度L ≥N+M 时,其中N 、M 分别为x(n)和h(n)的长度,L 点的
圆周卷积能够代表它们的线性卷积,即x(n)○h(n)=x(n)*h(n)。再利用DFT 的圆周卷积性质
x(n)○h(n)=IDFT{X(k)H(k)}
就可以利用FFT 计算两个有限长序列的线性卷积。
y x (n h (n (n )n )*h (n )
(五)分段卷积
直接利用DFT 计算的缺点是:(1) 信号要全部输入后才能进行计算,延迟太多;(2) 内存要求大;(3) 算法效率不高。解决问题方法是采用分段卷积,分段卷积可采用重叠相加法和重叠保留法来实现。
1. 重叠相加(overlap add )
将长序列x[k] 分为若干段长度为L 的序列][][0
nL k x k x n n -=∑
∞
=
其中
⎩⎨
⎧-≤≤+=
010
][][其它L k nL k x k x n 记 [][][]n n y k x k h k =*,那么,][][][][0
k h nL k x k h k x n n *-=
*∑
∞
=][0
nL k y n n -=∑∞
=
y 0[k]的非零范围为20-+≤≤M L k ,y 1[k-L]的非零范围为22-+≤≤M L k L 。序列y 0[k]、y 1[k]的重叠部分为2-+≤≤M L k L ,重叠的点数L+M-2-L+1=M-1。依次将相邻两段的M-1个重叠点相加,即得到最终的线性卷积结果。
2.重叠保留法(overlap save) 方法:
(1) 将x [n ]长序列分段,每段长度为L ; (2) 各段序列xn [k ]与 M 点短序列h [k ]循环卷积; (3) 从各段循环卷积中提取线性卷积结果。
因 yn [k ]=xn [k ] L h [k ] 前M -1个点不是线性卷积的点,故分段时每段与其前一段有M-1个点重叠。