You are on page 1of 45

第四章 快速付里叶变换

FFT: Fast Fourier Transform


目录

§4-1 引言

§4-2 按时间抽取 (DIT) 的 FFT 算法

§4-3 DIF 的 FFT 算法

§4-4 IFFT 算法

§4-5 线性卷积的 FFT 算法


一、快速付里叶变换 FFT
 有限长序列通过离散傅里叶变换 (DFT) 将其频 域离散化
成有限长序列 . 但其计算量太大 ( 与 N 的平方成正比) , 很
难 实时地处理问题 , 因 此 引 出 了 快 速 傅 里 叶
变 换 (FFT) 。

 FFT 并 不 是 一 种 新 的 变 换 形 式 , 它 只 是 DF
T 的 一 种 快 速 算 法 . 并 且 根 据 对 序 列 分 解
与 选 取 方 法 的 不 同 而 产 生 了 FFT 的 多 种
算 法 。

 FFT 在 离 散 傅 里 叶 反 变 换 、 线 性 卷 积 和
线 性 相 关 等 方 面 也 有 重 要 应 用。
二、 FFT 算法的产生
当时加文 (Garwin) 在自已的研究中极需要一个计算付里叶
变换的快速方法。在加文的迫切要求下,库利很快设计出一
个计算机程序。
1965 年库利 -- 图基在 < 计算数学 > 、 Mathematic of Comp
utation 杂志上发表了著名的“机器计算付里级数的一种算
法”文章,提出一种快速计算 DFT 的方法和计算机程序 --
揭开了 FFT 发展史上的第一页。
促使 FFT 算法产生原因还有 1967 年至 1968 年间 FFT 的数
字硬件制成,电子数字计算机的条件, 使 DFT 的运算大简
化了。
三、直接计算 DFT 计算量
问题提出: 设有限长序列 x(n), 非零值
长度为 N, 计算对 x(n) 进行一次 DFT 运
算,共需多大的运算工作量 ?
N 1
X (k )  
n 0
x(n)W Nnk , k  0,1,  , N  1

N 1
1
x ( n) 
N 
k 0
X (k )WN nk , n  0,1, , N  1
N 1
X (k )   x(n)W ,
nk
N k  0,1,  , N  1
n 0
N 1
1
x(n)   X (k )WN ,
 nk
n  0,1,, N  1
N k 0
2
j kn
 kn
W e
其中 x(n) 为复数, N
N

也为复数,两者的差别仅在指数的
符号和系数 1/N ,所以它们的计算量是
相等的 .
举例计算
计算一个 X(k) 的值,例如取 k=1,

N 1
X (1)   x(n)W n
N
n 0

X (1)  x(0)WN0  x(1)WN1  x(2)WN2  ...   x( N  1)WNN 1

计算一个 X(k) 的值需要 N 次复数乘法运算 ,


和 N  1 次复数加法运算 . 那么 , 所有的 X(k)
就要 N2 次复数乘法运算 ,N(N-1) 次复数加法运
算。
1: 当 N=1024 点时,直接计算 DFT 需要:
N2=220=1048576 次,即一百多万次的复乘运算
这对实时性很强的信号处理 ( 如雷达信号处理 ) 来
讲,它对计算速度有十分苛刻的要求 --> 迫切需要
改进 DFT 的计算方法,以减少总的运算次数。

2 :石油勘探, 24 道记录,每道波形记录长度 5 秒
,若每秒抽样 500 点 / 秒,
每道总抽样点数 =500*5=2500 点
24 道总抽样点数 =24*2500=6 万点
DFT 运算时间 =N2=(60000)2=36*108 次
四、 FFT 的分类和基本思想
分 类:
时间抽选法
DIT: Decimation-In-Time
频率抽选法
DIF: Decimation-In-Frequency
基本思想:利用 DFT 运算的系数WNkn 的固有对称性和
周期
性,改善 DFT 的运算效率。
1. 合并法:合并 DFT 运算中的某些项。
2. 分解法:将长序列 DFT 利用对称性和周期性, 分解为
kn
五、W N 的性质
周期性 WNnk  WN( N  n ) k  WNn ( N  k )
 nk ( N n ) k n ( N k )
对称性 (W )  W
nk *
N N W N W N

可约性 WNnk  WmN


mnk
WNnk  WNnk/ m/ m

特殊点: WN0  1 WNN / 2  1 WN( k  N / 2)  WNk

W49  W4( 45)  W45  W41


W 8
25
W
8
17
W W8
9
8
1
4.2.2 时域抽取法基 2FFT 基本原

 设输入序列长度为 N=2M(M
为正整数),将该序列按
时间顺序的奇偶分解为越来越短的子序列,称为基 2
按时间抽取的 FFT 算法。也称为 Coolkey-Tukey 算法。
 其中基数 2----N=2M , M 为整数 . 若不满足这个条件,
可以人为地加上若干零值(加零补长)使其达到 N=
2M
 设一序列 x(n) 的长度为 L=9, 应加零补长为
N=24=16 应补 7 个零值。
一、运算量的变化

把 N 点数据分成二半:
X (k ) N  X (k ) N  X (k ) N
2 2
其运算量为: N 2 N
2
( ) N 2
N2 2
+ ( ) =
再分二半: 2 2
X (k ) N  X (k )
 X (k ) N
N X (k ) N
4 4 2
N 2 N 2 N N 2 N
4 4

( ) + ( ) + ( ) + ( ) = 4 2

4 4 4 4
这样一直分下去,剩下两点的变换。
二、算法步骤
先将 x(n) 按 n 的奇偶分为两 组,作变量置换 :
当 n= 偶数时,令 n=2r;
当 n= 奇数时,令 n=2r+1;
得到: x(2r)=x1(r); x(2r+1)=x2(r);r=0…N/2-1;
则可得其 DFT 为两部分:
x(0),x(2)…x(2r) 偶数点
X(k )  DFT x ( n) x(1),x(3)…x(2r+1) 奇数
 DFT x ( 2r ) DFT x ( 2r点 1)
 DFT x1 ( r ) DFT x2 ( r )
所以:生成两个子序列
代入 DFT
N 1 N 1
X (k )   x(n)W nk
N   x(n)W nk
N
n 0 n 0
N
2
1 N
2
1
  x(2r )W 2 rk
N   x(2r  1)W ( 2 r 1) k
N
r 0 r 0
N
2
1 N
2
1
  x1 (r )(W )  W
2 rk
N
k
N  x (r )(W
2
2 rk
N )
r 0 r 0
 j 2N 2  j 2 /( N2 )
W  e
2
N e  WN
2
N
2
1 N
2
1
 X (k )   x1 (r )W N  W rk k
N  x (r )W2
rk
N
2 2
r 0 r 0

 X 1 (k )  W X 2 (k )
k
N

 1 1
N N
2 2

X
 1

( k )  
r 0
x1 ( r )W N
2
rk
 
r 0
x ( 2 r )W N
2
rk

其中  N 1 N 1
 2 2

X
 2

( k )  
r 0
x 2 ( r )W N
rk
2
 
r 0
x ( 2 r  1 )W N
2
rk
两点结论
(1) X 1 (k ), X 2 (k ) 均为 N/2 点的 DFT 。
(2) X(k)=X (k)+W X (k) 只能确定出
X(k) 的 k= 0,1,, N2  1 个;
即前一半的结果。
X(k) 的后一半的确定
N 1 N 1
N 2 2

X1(  k ) 
2  x (r )W
r 0
1
r ( N2  k )
N
2
  x (r )W
r 0
1
rk
N
2
 X 1 (k )

N
同理 , X 2 (  k )  X 2 (k )
2

( N2  k ) N
k k
由于 WN  WN WN
2
 WN
N N k  N2 N
X (k  )  X 1 (k  )  W N X 2 (k  )
2 2 2
k
 X 1 (k )  WN X 2 (k ), k  0,1,  , N2  1
蝶形运算
由 X1(k) 、 X 2(k) 表示 X(k) 的运算 - 碟形运算
X (k )  X 1 (k )  WNk X 2 (k ) (k  0,1,, N2  1)
X (k )  X 1 (k )  WNk X 2 (k ) (k  N2 ,, N  1)

实现上式运算的流图称作蝶形运算
1 1 X (k )  X 1 (k )  W Nk X 2 (k ) 前一半
X 1 (k )
1
1
X 2 (k )
N
W Nk -1 X (  k )  X 1 (k )  WNk X 2 (k ) 后一半
2
蝶式信号流图另一作图形式:
作图要素:
X1(k) X 1 (k )  WNk X 2 (k ) (1) 左边两路为输入
(2) 右边两路为输出
WNk (3) 中间以一个小圆表示加、
减运算(右上路为相加输
X2(k) X 1 (k )  WNk X 2 (k ) 出、右下路为相减输出 )

(4) 如果在某一支路上信号需要进行 (5) 当支路上没有箭头及系


相乘运算,则在该支路上标以箭头, 数时,则该支路的传输比
将相乘的系数标在箭头旁。 为1。
5. 计算工作量分析
按奇、偶分组后的计算量:
N 2 N2
(1)N/2 点的 DFT 运算量 : 复乘次数 : (
2
) 
4
复加次数 :2 ( 2  1)
N N

(2) 两个 N/2 点的 DFT 运算量 : 复乘次数


2
N
:
2
复加次数N:( N  1)
2
(3)N/2 个蝶形运算的运算量 : 复乘次数 : N
2
复加次数2: N  N
2
复乘 :
2
N N N2
 
总共运算量 : 2 2 2
复加 : N(
N
 1)  N 
N2
2 2

* 但是 ,N 点 DFT 的复乘为 N2 ; 复加 N(N-1);



例如: N=8 时的 DFT, 可以分解为两个
N/2=4 点的 DFT. 具体方法如下 :
(1)n 为偶数时 , 即 x (0), x ( 2), x ( 4), x (6);
分别记作 : x (0)  x (0),
1

x1 (1)  x ( 2),
x1 ( 2)  x ( 4),
x1 (3)  x (6);

进行N / 2  4点的DFT,得X 1 (k )
3 3
X 1 (k )   x1 (r )W   x(2r )W
4
rk
4
rk

r 0 r 0

k  0,1,2,3
(2) n 为奇数时 , 分别记作 :
x2 (0)  x (1),
x2 (1)  x (3),
x2 ( 2)  x (5),
x2 (3)  x (7);

进行N / 2  4点的DFT,得X 2 (k )
3 3
X 2 (k )   x2 (r )W 4
rk
  x(2r  1)W
4
rk

r 0 r 0

k  0,1,2,3
X (k )  X 1 (k )  W X 2 (k )
k
N

X (k  4)  X 1 (k )  W X 2 (k ), k  0,1,2,3
k
N
(3) 对 X (k) 和 X (k) 进行蝶形运算 , 前半部

X(0) X(3), 后半部分为 X(4) X(7)
整个过程如下图所示 X1(0):
x1(0)=x(0) X(0)
X1(1)
x1(1)=x(2) N/2 点
X(1)
X1(2)
x1(2)=x(4) DFT X(2)
x1(3)=x(6) X1(3)
X(3)
X2(0)
x2(0)=x(1) 0 -1
X(4)
X2(1)WN
-1 X(5)
x2(1)=x(3) N/2 点 1
WN
x2(2)=x(5) DFT X2(2)
-1 X(6)
2
WN
x2(3)=x(7) X2(3)
3
W -1 X(7)
x1(r)
x(0) X1(0)
偶 X(0)
x(2) X1(1)
数 4点 X(1)
X1(2)
序 x(4) DFT X(2)
X1(3)
列 x(6) X(3)
x2(r) X2(0) W80
x(1)
奇 X2(1)W81 X(4)
数 x(3) 4 点 X2(2) X(5)
序 x(5) DFT W82
X2(3) W 3 X(6)
列 x(7) 8
X(7)

X(0) X 1 (0)  X 2 (0)W80 X(1) X 1 (1)  X 2 (1)W81


X(2) X 1 (2)  X 2 (2)W82 X(3) X 1 (3)  X 2 (3)W83
( 二 ) N/4 点 DFT
由于 N=2 L , 所以 N/2 仍为偶数 , 可以进
一步把每个 N/2 点的序列再按其奇偶部分
分解为两个 N/4 的子序列。例如, n 为偶数
时的 N/2 点分解为 :

x1 (2l )  x3 (l ), 0,1,  , N4  1
x1 (2l  1)  x 4 (l ), 0,1,  , N4  1
进行 N/4 点的 DFT, 得到
N 1 N 1
4 4

X 3 (k )   x3 (l )W lk
N /4   x1 (2l )W 2 lk
N /2 ( 偶中偶 )
l 0 l 0
N 1 N 1

X 4 (k )   x4 (l )WNlk/ 4   x1 (2l  1)WN( 2/ l21) k ( 偶中奇 )


4 4

l 0 l 0
从而可得到前 N/4 的 X1(k)

X 1 (k )  X 3 (k )  W Nk X 4 (k )
2

k  0,1,, N4  1
后 N/4 的 X1(k) 为

N
X 1 (  k )  X 3 (k )  W N X 4 (k )
k

4 2

k  0,1,, N4  1
同样对 n 为奇数时, N/2 点分为两个 N/4 点
的序列进行 DFT ,则有 :
N 1 N 1
( 奇中偶 )
4 4
X 5 (k )   x2 (2l )W lk
N /4   x5 (l )WNlk/ 4
l 0 l 0
N 1 N 1
  x6 (l )WNlk/ 4 ( 奇中奇 )
4 4
X 6 (k )   x2 (2l  1)W lk
N /4
l 0 l 0

由X 5 (k )、X 6 (k )进行碟形运算,得:
N
X 2 (k)  X 5 (k)  W X 6 (k) ; k  0,1,  ,  1
k
N/2
4
N N
X 2 (  k)  X 5 (k)  WN/2 X 6 (k) ; k  0,1, ,  1
k

4 4
例如 ,N=8 时的 DFT 可分解为四个 N/4 的
DFT,
(1)具体步骤如下 :
将原序列 x(n) 的“偶中偶”部分 :

x3 (l )  x1 (r )  x(n)
x3 (0)  x1 (0)  x(0)
x3 (1)  x1 (2)  x(4)
构成 N/4 点 DFT ,从而得到 X3(0), X3(1) 。
(2) 将原序列 x(n) 的“偶中奇”部分 :
x4 (l )  x1 ( r )  x ( n)
x4 (0)  x1 (1)  x ( 2)
x4 (1)  x1 (3)  x (6)
构成 N/4 点 DFT ,从而得到 X4(0), X4(1) 。
(3) 将原序列 x(n) 的“奇中偶”部分 :
x5 (l )  x2 ( r )  x ( n)
x5 (0)  x2 (0)  x (1)
x5 (1)  x2 ( 2)  x (5)
构成 N/4 点 DFT ,从而得到 X5(0), X5(1) 。
(4) 将原序列 x(n) 的“奇中奇”部分 :
x6 (l )  x2 ( r )  x ( n)
x6 (0)  x2 (1)  x (3)
x6 (1)  x2 (3)  x (7)
构成 N/4 点 DFT ,从而得到 X6(0), X6(1) 。
( 5 )由 X3(0), X3(1), X4(0), X4(1) 进行碟形运算
,
得到 X1(0), X1(1), X1(2), X1(3) 。
( 6 )由 X5(0), X5(1), X6(0), X6(1) 进行碟形运算 ,

得到 X2(0), X2(1), X2(2), X2(3) 。


一个 2 点的 DFT 蝶形流图
X3(0) X1(0)
x(0)
2 点 DFT X (1)
3
X1(1)
x(4)

X4(0)
x(2) W40
2 点 DFT X (1)
4 1
X1(2)
x(6) W4
X1(3)
其中X 1 (0)  X 3 (0)  W40 X 4 (0) X 1 (1)  X 3 (1)  W41 X 4 (1)
X 1 (2)  X 3 (0)  W40 X 4 (0) X 1 (3)  X 3 (1)  W41 X 4 (1)
另一个 2 点的 DFT 蝶形流图
同理:
X5(0) X2(0)
x(1)
2 点 DFT X (1)
5
X2(1)
x(5)

X6(0)
x(3) W40
2 点 DFT X (1)
6 1
X2(2)
x(7) W 4
X2(3)
其中X 2 (0)  X 5 (0)  W40 X 6 (0) X 2 (1)  X 5 (1)  W41 X 6 (1)
X 2 (2)  X 5 (0)  W40 X 6 (0) X 2 (1)  X 5 (1)  W41 X 6 (1)
( 7 )由 X1(0), X1(1), X1(2), X1(3) , X2(0), X2(1),X2(2),

X2(3) 进行碟形运算 , 得到
X(0), X(1), X(2), X(3) X(4), X(5), X(6), X(7) 。
X 1(0)
3(0)= 1(0)= (0) N/4 X (0)
3 X(0)
X 3(1) X 1(1)
3(1)= 1(2)= (4) DFT X(1)
X4(0) X 1(2)
4(0)= 1(1)= (2) N/4
WN0 -1 X (3)
X(2)
4(1)= 1 (3)= (6) DFT X4(1) 2 1
X(3)
X
WN
(0) -1 X 2(0)
5
(0)= 2
(0)= (1) N/4 5 X(4)
X 5(1) X (1) WN0 -1
5(1)= 2(2)= (5) DFT X(5)
2
X6(0) X 2(2) WN
1 -1
6(0)= 2 (1)= (3) N/4 WN0 -1 X(6)
X 2(3) WN2
6(1)= 2 (3)= (7) DFT X 6(1) 2 3 -1 X(7)
WN WN
将 N/4 ( 2 点) DFT 再分解成 2 个 1 点的
DFT
最后剩下两点 DFT, 它可分解成两个一点 DFT ,但一
点 DFT 就等于输入信号本身,所以两点 DFT 可用一个蝶
形结表示。取 x(0) 、 x(4) 为例。
1
X (k )   x(n)W2nk 代入上面流图可知:
n 0

X 3 (0)  x(0)W20  x(4)W20  x(0)W20  x(4)W20


X 3 (1)  x(0)W20  x(4)W21  x(0)W20  x(4)W20这是一蝶形结
这里用到对称性
nk  N2 nk 1
W N  W ,则W
nk
N 2  W ,其中n  0,1; k  0,1
2
nk

W201  W20
2 个 1 点的 DFT 蝶形流图
x(0) 1 点 DFT X3(0)

0
x(4) 1 点 DFT W 2
X3(1)

进一步简化为蝶形流图:
其中:
X 3 (0)  x(0)  W20 x(4)
x(0)
X3(0)  x ( 0)  x ( 4 )
X 3 (1)  x(0)  W20 x(4)
x(4) W20 X3(1)
 x ( 0)  x ( 4)
因此 ,8 点 DFT 的 FFT 的运算流图如下
X 3(0) X 1(0) X(0)
x (0) 0
WN X 3(1) X 1(1) X(1)
x (4)
x -1 0
X 4(0)WN X 1(2) X(2)
x (2)
0 -1
WN X 4(1)WN2 X 1(3) X(3)
x (6)
-1 -1 X (0) W 0
X 5(0) X(4)
x (1) 0
2 N
1 -1
WN X 5(1) X (1) WN X(5)
x (5) -1 0
2
2 -1
X 6(0)WN X 2(2) WN X(6)
x (3) 3 -1
WN0 2
X 6(1)WN
-1
X 2(3) WN X(7)
x (7) -1 -1
-1
一个完整 N=8 的按时间抽取 F
FT 的运算流图
m=0 m=1 m=2 X(0)
x(0)
x(4) X(1)
W80
x(2) W80 X(2)
x(6) 0 W82 X(3)
W8 W 0
x(1) 8

W81 X(4)
x(5)
W80 0 W82 X(5)
x(3) W8

2 W83 X(6)
x(7) W8
W80
其中旋转因子,共有WN0 WNN / 2 1 X(7)
四、 FFT 算法中一些概念
( 1 )“级”概念

将 N 点 DFT 先分成两个 N/2 点 DFT ,再是


四个 N/4 点 DFT… 直至 N/2 个两点 DFT. 每
分一次称为“一”级运算。
因为 N=2M 所以 N 点 DFT 可分成 M 级
如上图所示依次 m=0,m=1….M-1 共 M 级
( 2 )“组”概念
每一级都有 N/2 个蝶形单元,例如: N=8, 则
每级都有 4 个蝶形单元。每一级的 N/2 个蝶形单元
r
可以分成若干组,每一组具有相同的结构,相同的 W N

因子分布,第 m 级的组数为:
N
2 m 1

例: N=8=23 ,分 3 级。
W 0
m=0 级 , 分成四组 , 每组系数为 N / 4  W2
0
 W8
0

m=1 级 , 分成二组 , 每组系数为WN0 / 2 ,WN1 / 2  WN0 ,WN2  W80 ,W82


m=2 级 , 分成一组 , 每组系数为
r
(3) 因子W N 的分布
由上可知:
m  0级,W 2
k
k  0 W W
2
0
8
0

m  1级,W
4
k
k  0,
1 W ,W  W , W
4
0 1
4 8
0
8
2

m  2级,W 8
k
k  0, 0
1,2,3 W ,W , W ,W
8 8
1
8
2
8
3

看出:第m级的系数为W k
2 m1
, k  0,1 2  1 m

结论:每由后向前( m 由 M-1-->0 级)推进一


级,则此级系数取后级系数中偶数序号的那一
半。
(4) 绘图规则——码位倒读

我们从输入序列的序号及整序规律得到码位
倒读规则。由 N=8 蝶形图看出:原位计算时,
FFT 输出的 X(k) 的次序正好是顺序排列的,
即 X(0)…X(7), 但输入 x(n) 都不能按自然顺
序存入到存储单元中,而是按 x(0),x(4),x(2),
x(6)…. 的顺序存入存储单元即为乱序输入,
顺序输出。这种顺序看起来相当杂乱,然而
它是有规律的。即码位倒读规则。
例子
以 N=8 为例:
自然顺序 n 二进制码表示 码位倒读 码位倒置顺序
0 000 000 n’
0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
看出:码位倒读后的顺序刚好是数据送入计算机内的顺序。
( 5 )按时间抽取法
由于每一步分解都是基于在每级按输入时间序列
的次序是属于偶数还是奇数来分解为两个更短的序列,
所以称为“按时间抽取法” .
2 点 DFT
两个 2 点
2 点 DFT DFT X1(k)
两个
2 点 DFT 两个 2 点 4 点 DFT
DFT
2 点 DFT 两个
…...
N/2 点
2 点 DFT 两个 2 点 DFT
DFT
2 点 DFT
两个 X2(k)
2 点 DFT 两个 2 点 4 点 DFT
2 点 DFT DFT
x(n)
五、按时间抽取的 FFT 算法与
直接计算 DFT 运算量的比较
由前面介绍的按时间抽取的 FFT 运算流图可见:
每级都由 N/2 个蝶形单元构成,因此每一
级运算都需要 N/2 次复乘和 N 次复加(每个结加减各
一次)。这样( N=2M)M 级运算共需要:

N N
复乘次数: mF  M  log 2N
2 2
复加次数: a F  N  M  N log N
2

而直接计算 DFT 时所需的复乘数与复加数则都是与 N2


成正比 .( 复乘数 md=N2, 复加数 ad=N(N-1)≈N2)
例子
看 N=8 点和 N=1024 点时直接计算 DFT 与
用基 2- 按时间抽取法 FFT 的运算量。
2
N N 2
N log N N
2
N log 2N
8 64 24 2. 7
210 2 20 210 10 102.4

看出:当 N 较大时,按时间抽取法将比直接法快一、
二个数量级之多。

You might also like