一个五项余弦级数的时域信号。频率为
10
2
{\displaystyle 10{\sqrt {2}}}
的倍数。振幅为 1, 2, 3, 4, 5。时间步长为 0.001 s
用FFT(~40,000次运算)五项余弦级数及用显式积分(~1亿次运算)得出的DFT。时间窗口是10秒。FFT是用FFTW3( http://www.fftw.org/ (页面存档备份 ,存于互联网档案馆 ) )计算的。显式积分DFT是用 https://sourceforge.net/projects/amoreaccuratefouriertransform/ (页面存档备份 ,存于互联网档案馆 ) 计算的。
缩放后的五项余弦级数的DFT。注意到显式积分更细的步长大小比FFT更精确地再现了峰值(4)和频率(56.569 Hz),代价是速度慢了上千倍。
快速傅里叶变换 (英語:Fast Fourier Transform, FFT ),是快速计算序列的离散傅里叶变换 (DFT)或其逆变换的方法[ 1] 。傅里叶分析 将信号从原始域(通常是时间或空间)转换到頻域 的表示或者逆过来转换。FFT会通过把DFT矩阵 分解 为稀疏 (大多为零)因子之积来快速计算此类变换。[ 2] 因此,它能够将计算DFT的复杂度 从只用DFT定义计算需要的
O
(
n
2
)
{\displaystyle O(n^{2})}
,降低到
O
(
n
log
n
)
{\displaystyle O(n\log n)}
,其中
n
{\displaystyle n}
为数据大小。
快速傅里叶变换广泛的应用于工程、科学和数学领域。这里的基本思想在1965年才得到普及,但早在1805年就已推导出来。[ 3] 1994年美國數學家吉爾伯特·斯特朗 把FFT描述为“我们一生中最重要的数值算法 ”[ 4] ,它还被IEEE科学与工程计算期刊列入20世纪十大算法。[ 5]
定义和速度
用FFT计算DFT 会得到与直接用DFT定义计算相同的结果;最重要的区别是FFT更快。(由于捨入誤差 的存在,许多FFT算法还会比直接运用定义求值精确很多,后面会讨论到这一点。)
令 x 0 , ...., x N -1 為复数 。DFT由下式定义
X
k
=
∑
n
=
0
N
−
1
x
n
e
−
i
2
π
k
n
N
k
=
0
,
…
,
N
−
1.
{\displaystyle X_{k}=\sum _{n=0}^{N-1}x_{n}e^{-{i2\pi k{\frac {n}{N}}}}\qquad k=0,\dots ,N-1.}
直接按这个定义求值需要
O
(
N
2
)
{\displaystyle O(N^{2})}
次运算:X k 共有 N 个输出,每个输出需要 N 项求和。直接使用DFT運算需使用N個複數乘法(4N個實數乘法)與N-1個複數加法(2N-2個實數加法),因此,計算使用DFT所有N點的值需要N 2 複數乘法與N 2 -N 個複數加法。FFT则是能够在
O
(
N
log
N
)
{\displaystyle O(N\log {}N)}
次操作计算出相同结果的任何方法。更准确的说,所有已知的FFT算法都需要
O
(
N
log
N
)
{\displaystyle O(N\log {}N)}
次运算(技术上O只标记上界 ),虽然还没有已知的证据证明更低的复杂度是不可能的。[ 6]
要说明FFT节省时间的方式,就得考虑复数相乘和相加的次数。直接计算DFT的值涉及到 N 2 次复数相乘和 N (N −1) 次复数相加(可以通过削去琐碎运算(如乘以1)来节省
O
(
N
)
{\displaystyle O(N)}
次运算)。众所周知的基2库利-图基算法 ,N 为2的幂,可以只用 (N /2)log2 (N ) 次复数乘法(再次忽略乘以1的简化)和 N log2 (N ) 次加法就可以得到相同结果。在实际中,现代计算机通常的实际性能通常不受算术运算的速度和对复杂主体的分析主导[ 7] ,但是从
O
(
N
2
)
{\displaystyle O(N^{2})}
到
O
(
N
log
N
)
{\displaystyle O(N\log {}N)}
的总体改进仍然能够体现出来。
一般的簡化理論
假設一個M*N型矩阵S 可分解成列向量以及行向量相乘:
S
=
[
a
1
a
2
⋮
a
m
]
[
b
1
b
2
⋯
b
n
]
{\displaystyle \mathbf {S} ={\begin{bmatrix}a_{1}\\a_{2}\\\vdots \\a_{m}\end{bmatrix}}{\begin{bmatrix}b_{1}&b_{2}&\cdots &b_{n}\end{bmatrix}}}
若
[
a
1
a
2
⋯
a
m
]
T
{\displaystyle {\begin{bmatrix}a_{1}&a_{2}&\cdots &a_{m}\end{bmatrix}}^{T}}
有
M
0
{\displaystyle M_{0}}
個相異的非平凡值(
a
m
≠
±
2
k
,
a
m
≠
±
2
k
a
n
{\displaystyle a_{m}\neq \pm 2^{k},a_{m}\neq \pm 2^{k}a_{n}}
where
m
≠
n
{\displaystyle m\neq n}
)
[
b
1
b
2
⋯
b
n
]
{\displaystyle {\begin{bmatrix}b_{1}&b_{2}&\cdots &b_{n}\end{bmatrix}}}
有
N
0
{\displaystyle N_{0}}
個相異的非平凡值
則S 共需要
M
0
∗
N
0
{\displaystyle M_{0}*N_{0}}
個乘法。
[
Z
[
1
]
Z
[
2
]
⋮
Z
[
N
]
]
=
S
[
X
[
1
]
X
[
2
]
⋮
X
[
N
]
]
=
[
a
1
a
2
⋮
a
m
]
[
b
1
b
2
⋯
b
n
]
[
X
[
1
]
X
[
2
]
⋮
X
[
N
]
]
{\displaystyle {\begin{bmatrix}Z[1]\\Z[2]\\\vdots \\Z[N]\end{bmatrix}}=\mathbf {S} {\begin{bmatrix}X[1]\\X[2]\\\vdots \\X[N]\end{bmatrix}}={\begin{bmatrix}a_{1}\\a_{2}\\\vdots \\a_{m}\end{bmatrix}}{\begin{bmatrix}b_{1}&b_{2}&\cdots &b_{n}\end{bmatrix}}{\begin{bmatrix}X[1]\\X[2]\\\vdots \\X[N]\end{bmatrix}}}
Step 1:
Z
a
=
b
1
X
[
1
]
+
b
2
X
[
2
]
+
⋯
+
b
n
X
[
N
]
{\displaystyle Z_{a}=b_{1}X[1]+b_{2}X[2]+\cdots +b_{n}X[N]}
Step 2:
Z
[
1
]
=
a
1
Z
a
,
Z
[
2
]
=
a
2
Z
a
,
⋯
,
Z
[
N
]
=
a
m
Z
a
{\displaystyle Z[1]=a_{1}Z_{a},Z[2]=a_{2}Z_{a},\cdots ,Z[N]=a_{m}Z_{a}}
簡化理論的變型:
S
=
[
a
1
a
2
⋮
a
m
]
[
b
1
b
2
⋯
b
n
]
+
S
1
{\displaystyle \mathbf {S} ={\begin{bmatrix}a_{1}\\a_{2}\\\vdots \\a_{m}\end{bmatrix}}{\begin{bmatrix}b_{1}&b_{2}&\cdots &b_{n}\end{bmatrix}}+\mathbf {S} _{1}}
S
1
{\displaystyle S_{1}}
也是一個M*N的矩陣。
若
S
1
{\displaystyle S_{1}}
有
P
1
{\displaystyle P_{1}}
個值不等於0,則
S
{\displaystyle \mathbf {S} }
的乘法量上限為
M
0
+
N
0
+
P
1
{\displaystyle M_{0}+N_{0}+P_{1}}
。
快速傅立葉變換乘法量的計算
假設
N
=
P
1
×
P
2
×
⋯
×
P
k
{\displaystyle N=P_{1}\times P_{2}\times \cdots \times P_{k}}
,其中
P
1
,
P
2
,
⋯
,
P
k
{\displaystyle P_{1},P_{2},\cdots ,P_{k}}
彼此互質
P
k
{\displaystyle \mathbf {P_{k}} }
點DFT的乘法量為
B
k
{\displaystyle \mathbf {B_{k}} }
,則
N
{\displaystyle \mathbf {N} }
點DFT的乘法量為:
N
P
1
B
1
+
N
P
2
B
2
+
⋯
⋯
+
N
P
k
B
k
{\displaystyle {\frac {N}{P_{1}}}B_{1}+{\frac {N}{P_{2}}}B_{2}+\cdots \cdots +{\frac {N}{P_{k}}}B_{k}}
假設
N
=
P
c
{\displaystyle \mathbf {N=P^{c}} }
,P是一個質數。
若
N
1
=
P
a
{\displaystyle \mathbf {N_{1}=P^{a}} }
點的DFT需要的乘法量為
B
1
{\displaystyle \mathbf {B_{1}} }
且
n
1
×
n
2
{\displaystyle n_{1}\times n_{2}}
當中(
n
1
=
0
,
1
,
⋯
,
N
1
−
1
,
n
2
=
0
,
1
,
⋯
,
N
2
−
1
{\displaystyle n_{1}=0,1,\cdots ,N_{1}-1,\quad n_{2}=0,1,\cdots ,N_{2}-1}
)
有
D
1
{\displaystyle D_{1}}
個值不為
N
12
{\displaystyle {\frac {N}{12}}}
及
N
8
{\displaystyle {\frac {N}{8}}}
的倍數,
有
D
2
{\displaystyle D_{2}}
個值為
N
12
{\displaystyle {\frac {N}{12}}}
及
N
8
{\displaystyle {\frac {N}{8}}}
的倍數,但不為
N
4
{\displaystyle {\frac {N}{4}}}
的倍數,
則N點DFT的乘法量為:
N
2
B
1
+
N
1
B
2
+
3
D
1
+
2
D
2
{\displaystyle \mathbf {N_{2}B_{1}+N_{1}B_{2}+3D_{1}+2D_{2}} }
库利-图基算法
库利-图基算法是最常见的FFT算法。这一方法以分治法 为策略递归 地将长度为
N
=
N
1
N
2
{\displaystyle N=N_{1}N_{2}}
的离散傅里叶变换 分解为长度为
N
1
{\displaystyle N_{1}}
的
N
2
{\displaystyle N_{2}}
个较短序列的离散傅里叶变换,以及与
O
(
N
)
{\displaystyle \mathrm {O} (N)}
个旋转因子 的复数乘法。
这种方法以及FFT的基本思路在1965年J. W. Cooley和J. W. Tukey合作发表An algorithm for the machine calculation of complex Fourier series 之后开始为人所知。但后来发现,实际上这两位作者只是重新发明了高斯 在1805年就已经提出的算法(此算法在历史上数次以各种形式被再次提出)。
库利-图基算法最有名的应用,是将序列长为N 的DFT分割为两个长为N/2 的子序列的DFT,因此这一应用只适用于序列长度为2的幂的DFT计算,即基2-FFT。实际上,如同高斯和Cooley与Tukey都指出的那样,Cooley-Tukey算法也可以用于序列长度N 为任意因数分解形式的DFT,即混合基FFT,而且还可以应用于其他诸如分裂基FFT等变种。尽管Cooley-Tukey算法的基本思路是采用递归的方法进行计算,大多数传统的算法实现都将显式的递归算法改写为非递归的形式。另外,因为Cooley-Tukey算法是将DFT分解为较小长度的多个DFT,因此它可以同任一种其他的DFT算法联合使用。
设计思想
下面,我们用N次单位根
W
N
{\displaystyle W_{N}}
来表示
e
−
j
2
π
N
{\displaystyle e^{-j{\frac {2\pi }{N}}}}
。
W
N
{\displaystyle W_{N}}
的性质:
周期性 ,
W
N
{\displaystyle W_{N}}
具有周期
N
{\displaystyle N}
,即
W
N
k
+
N
=
W
N
k
{\displaystyle W_{N}^{k+N}=W_{N}^{k}}
对称性 :
W
N
k
+
N
2
=
−
W
N
k
{\displaystyle W_{N}^{k+{\frac {N}{2}}}=-W_{N}^{k}}
。
若
m
{\displaystyle m}
是
N
{\displaystyle N}
的约数,
W
N
m
k
n
=
W
N
m
k
n
{\displaystyle W_{N}^{mkn}=W_{\frac {N}{m}}^{kn}}
为了简单起见,我们下面设待变换序列长度
n
=
2
r
{\displaystyle n=2^{r}}
。根据上面单位根的对称性,求级数
y
k
=
∑
n
=
0
N
−
1
W
N
k
n
x
n
{\displaystyle y_{k}=\sum _{n=0}^{N-1}W_{N}^{kn}x_{n}}
时,可以将求和区间分为两部分:
y
k
=
∑
n
=
2
t
W
N
k
n
x
n
+
∑
n
=
2
t
+
1
W
N
k
n
x
n
=
∑
t
W
N
2
k
t
x
2
t
+
W
N
k
∑
t
W
N
2
k
t
x
2
t
+
1
=
F
e
v
e
n
(
k
)
+
W
N
k
F
o
d
d
(
k
)
(
i
∈
Z
)
{\displaystyle {\begin{matrix}y_{k}=\sum _{n=2t}W_{N}^{kn}x_{n}+\sum _{n=2t+1}W_{N}^{kn}x_{n}\\=\sum _{t}W_{\frac {N}{2}}^{kt}x_{2t}+W_{N}^{k}\sum _{t}W_{\frac {N}{2}}^{kt}x_{2t+1}\\=F_{even}(k)+W_{N}^{k}F_{odd}(k)&&&&&&(i\in \mathbb {Z} )\end{matrix}}}
F
o
d
d
(
k
)
{\displaystyle F_{odd}(k)}
和
F
e
v
e
n
(
k
)
{\displaystyle F_{even}(k)}
是两个分别关于序列
{
x
n
}
0
N
−
1
{\displaystyle \left\{x_{n}\right\}_{0}^{N-1}}
奇数号和偶数号序列N/2点变换。由此式只需计算出
y
k
{\displaystyle y_{k}}
的前N/2个点,对于后N/2个点可以通过复指数函数的对称性快速求解 。即,注意
F
o
d
d
(
k
)
{\displaystyle F_{odd}(k)}
和
F
e
v
e
n
(
k
)
{\displaystyle F_{even}(k)}
都是周期为N/2的函数,由单位根的对称性,有以下变换公式:
y
k
+
N
2
=
F
e
v
e
n
(
k
)
−
W
N
k
F
o
d
d
(
k
)
{\displaystyle y_{k+{\frac {N}{2}}}=F_{even}(k)-W_{N}^{k}F_{odd}(k)}
y
k
=
F
e
v
e
n
(
k
)
+
W
N
k
F
o
d
d
(
k
)
{\displaystyle y_{k}=F_{even}(k)+W_{N}^{k}F_{odd}(k)}
。
这样,一个N点变换就分解成了两个N/2点变换。照这样可继续分解下去。这就是库利-图基快速傅里叶变换 算法的基本原理。根据主定理 不难分析出此时算法的时间复杂度为
O
(
N
log
N
)
{\displaystyle \mathrm {O} (N\log N)}
算法实现
首先将
n
=
2
N
{\displaystyle n=2^{N}}
个输入点列按二进制进行编号,然后对各个编号按位倒置并按此重新排序。例如,对于一个8点变换,
001倒置以后变成 100
000 → 000
001 → 100
010 → 010
011 → 110
100 → 001
101 → 101
110 → 011
111 → 111
倒置后的编号为{0,4,2,6,1,5,3,7}。
然后将这n个点列作为输入传送到蝶形结 网络中,注意将因子
W
N
k
{\displaystyle W_{N}^{k}}
逐层加入到蝶形网络中。
算法复杂度
由于按蝶形结网络 计算n点变换要进行log n 层计算,每层计算n个点的变换,故算法的时间复杂度为
O
(
n
log
n
)
{\displaystyle \mathrm {O} (n\log n)}
。
其他算法
在Cooley-Tukey算法 之外还有其他DFT的快速演算法。对于长度
N
=
N
1
N
2
{\displaystyle N=N_{1}N_{2}}
且
N
1
{\displaystyle N_{1}}
与
N
2
{\displaystyle N_{2}}
互质的序列,可以采用基于中国剩余定理 的互质因子算法 将N长序列的DFT分解为两个子序列的DFT。与Cooley-Tukey算法不同的是,互质因子算法 不需要旋转因子。
Rader-Brenner算法是类似于Cooley-Tukey算法,但是采用的旋转因子都是纯虚数,以增加加法运算和降低了数值稳定性为代价减少了乘法运算。这方法之后被split-radix variant of Cooley-Tukey所取代,与Rader-Brenner演算法相比,有一样多的乘法量,却有较少的加法量,且不牺牲数值的准确性。
Bruun 以及QFT 演算法是不断的把DFT分成许多较小的DFT运算。(Rader-Brenner以及QFT演算法是为了2的指数所设计的演算法,但依然可以适用在可分解的整数上。Bruun演算法则可以运用在可被分成偶数个运算的数字)。尤其是Bruun演算法,把FFT看成是
z
N
−
1
{\displaystyle z^{N}-1}
,并把它分解成
z
M
−
1
{\displaystyle z^{M-1}}
与
z
2
M
+
a
z
M
+
1
{\displaystyle z^{2M}+az^{M}+1}
的形式。
另一个从多项式观点的快速傅立叶变换法是Winograd算法 。此演算法把
z
N
−
1
{\displaystyle z^{N}-1}
分解成cyclotomic多项式,而这些多项式的系数通常为1,0,-1。这样只需要很少的乘法量(如果有需要的话),所以winograd是可以得到最少乘法量的快速傅立叶演算法,对于较小的数字,可以找出有效率的算方式。更精确地说,winograd演算法让DFT可以用
2
k
{\displaystyle 2^{k}}
点的DFT来简化,但减少乘法量的同时,也增加了非常多的加法量。Winograd也可以利用剩余值定理来简化DFT。
Rader演算法提出了利用点数为N(N为质数)的DFT进行长度为N-1的回旋摺积来表示原本的DFT,如此就可利用摺积用一对基本的FFT来计算DFT。另一个prime-size的FFT演算法为chirp-Z演算法。此法也是将DFT用摺积来表示,此法与Rader演算法相比,能运用在更一般的转换上,其转换的基础为Z转换(Rabiner et al., 1969)。
实数或对称资料专用的演算法
在许多的运用当中,要进行DFT的资料是纯实数,如此一来经过DFT的结果会满足对称性:
X
N
−
k
{\displaystyle \mathbf {X} _{N-k}}
=
X
k
∗
{\displaystyle \mathbf {X} _{k}^{*}}
而有一些演算法是专门为这种情形设计的(e.g. Sorensen, 1987)。另一些则是利用旧有的演算法(e.g. Cooley-Tukey),删去一些不必要的演算步骤,如此省下了记忆体的使用,也省下了时间。另一方面,也可以把一个偶数长度且纯实数的DFT,用长度为原本一半的复数型态DFT来表示(实数项为原本纯实数资料的偶数项,虚数项则为奇数项)。
在Matlab上用一次N點FFT計算兩個N點實數信號x,y的FFT:
function [X,Y] = Real2FFT ( x,y )
% N-point FFT is used for 2 real signals both with length N
N = length ( x );
z = x + y * i ;
Z = fft ( z );
X = 0.5 * ( Z + conj ( Z ( 1 + mod ( 0 : - 1 : 1 - N , N ))));
Y = 0.5 * ( Z - conj ( Z ( 1 + mod ( 0 : - 1 : 1 - N , N )))) / i ;
end
一度人们认为,用离散哈特利转换 (Discrete Hartley Transform)来处理纯实数的DFT会更有效率,但接着人们发现,对于同样点数的纯实数DFT,经过设计的FFT,可以比DHT省下更多的运算。Bruun演算法是第一个试着从减少实数输入的DFT运算量的演算法,但此法并没有成为人们普遍使用的方法。
对于实数输入,且输入为偶对称或奇对称的情形,可以更进一步的省下时间以及记忆体,此时DFT可以用离散余弦转换 或离散正弦转换 来代替(Discrete cosine/sine transforms)。由于DCT/DST也可以设计出FFT的演算法,故在此种情形下,此方法取代了对DFT设计的FFT演算法。
DFT可以应用在频谱分析以及做摺积的运算,而在此处,不同应用可以用不同的演算法来取代,列表如下:
用来做频谱分析 的情况下,DFT可用下列的演算法代替:
DCT
DST
DHT
正交基底的扩展(orthogonal basis expantion)包括正交多项式(orthogonal polynomials)以及CDMA.
Walsh(Hadamard)转换
Haar转换
小波(wavelet)转换
时频分布(time-frequency distribution)
用来做摺积 的情况下,DFT可用下列的演算法代替:
DCT
DST
DHT
直接做摺积(direct computing)
分段式DFT摺积(sectioned DFT convolution)
威諾格拉德快速傅立葉變換演算法
沃尔什(Walsh、Hadamard)转换
数论转换
單一路徑延遲迴授系統
單一路徑延遲迴授系統(英語:Single-path delay feedback,縮寫為SDF)是一種用於實現快速傅立葉轉換 (Fast Fourier Transform)中運算的管線式架構(pipeline architecture)。此架構的特點是資料從輸入一直到最終的輸出只會通過單一的路徑,並使用蝶形結 (butterfly diagram)做為資料的運算單元。經過蝶形結後的輸出資料會先暫存在系統的移位暫存器 (shift registers)或是隨機存取記憶體 (RAM)當中,而由於只有單一路徑的關係,對於每一級的蝶形結架構我們只需要一個複數乘法器來進行和FFT當中的旋轉因子 (twiddle factor)的乘積運算。[ 8]
SDF的優點在於其架構簡單並且利用硬體實現的成本較低,原因在於其單一路徑的設計,使得資料會依序進行處理並輸出,並不會在系統中加入多個複雜的運算單元以進行平行化的運算,事實上SDF的架構在管線式快速傅立葉轉換 處理器(pipelined FFT processors)中具有最高的記憶體使用效率,而由於記憶體單元數量會隨快速傅立葉轉換 的級數而指數增長,記憶體使用效率進而成為影響電路面積和功耗的主要因素之一。因此在實作大型快速傅立葉轉換 處理器的情況下,SDF架構一直是被優先考量採用的選擇。然而其缺點也同樣來自於單一路徑的設計,導致其吞吐量 (throughput)和多路徑延遲交換線路系統(英語:Multiple-path delay commutator,縮寫為MDC)相比較低。
接著我們將以8個點的基-2單一路徑延遲迴授系統(8-point R2SDF)為例進行其演算法細節的介紹,並且展示在硬體實作中每一個cycle的運算和中間結果的存儲位置。
8-point R2SDF Architecture
首先考慮系統輸入為x0 , x1 , ..., x7, 並在前8個cycle依序輸入。
Cycle 0~3 : x0 ~x3 依序存入第一級BF-2上方的暫存器中。
Cycle 4 : x0 和x4 輸入第一級BF-2後輸出x0 ' 和x4 ' ,x0 ' 存入第二級BF-2上方的暫存器中,x4 ' 存入第一級BF-2上方的暫存器中。
Cycle 5 : x1 和x5 輸入第一級BF-2後輸出x1 ' 和x5 ' ,x1 ' 存入第二級BF-2上方的暫存器中,x5 ' 存入第一級BF-2上方的暫存器中。
Cycle 6 : x2 和x6 輸入第一級BF-2後輸出x2 ' 和x6 ' ,x6 ' 存入第一級BF-2上方的暫存器中,x0 ' 和x2 ' 輸入第二級BF-2後輸出x0 '' 和x2 '' ,x0 '' 存入第三級BF-2上方的暫存器中,x2 '' 存入第二級BF-2上方的暫存器中。
Cycle 7 : x3 和x7 輸入第一級BF-2後輸出x3 ' 和x7 ' ,x7 ' 存入第一級BF-2上方的暫存器中,x1 ' 和x3 ' 輸入第二級BF-2後輸出x1 '' 和x3 '' ,x3 '' 存入第二級BF-2上方的暫存器中,x0 '' 和x1 '' 輸入第三級BF-2後輸出x0 ''' 和x1 ''' ,x0 ''' 直接輸出,x1 ''' 存入第三級BF-2上方的暫存器中。(此為第一筆輸出 ,此後每一個cycle皆會輸出一筆資料。)
Cycle 8 : x4 ' 乘上W0 後存入第二級BF-2上方的暫存器中,x2 '' 乘上W0 後存入第三級BF-2上方的暫存器中,x1 ''' 直接輸出。
Cycle 9 : x5 ' 乘上W1 後存入第二級BF-2上方的暫存器中,x3 '' 乘上W2 後和x2 '' 輸入第三級BF-2後輸出x2 ''' 和x3 ''' , x2 ''' 直接輸出,x3 ''' 存入第三級BF-2上方的暫存器中。
Cycle 10 : x6 ' 乘上W2 後和x4 ' 輸入第二級BF-2後輸出x4 '' 和x6 '' ,x6 '' 存入第二級BF-2上方的暫存器中,x4 '' 存入第三級BF-2上方的暫存器中,x3 ''' 直接輸出。
Cycle 11 : x7 ' 乘上W3 後和x5 ' 輸入第二級BF-2後輸出x5 '' 和x7 '' ,x7 '' 存入第二級BF-2上方的暫存器中,x4 '' 和x5 '' 輸入第三級BF-2後輸出x4 ''' 和x5 ''' ,x4 ''' 直接輸出,x5 ''' 存入第三級BF-2上方的暫存器中。
Cycle 12 : x6 '' 乘上W0 後存入第三級BF-2上方的暫存器中,x5 ''' 直接輸出。
Cycle 13 : x7 '' 乘上W2 後和x6 '' 輸入第三級BF-2後輸出x6 ''' 和x7 ''' ,x6 ''' 直接輸出,x7 ''' 存入第三級BF-2上方的暫存器中。
Cycle 14 : x7 ''' 直接輸出。(此為最後一筆輸出 。)
此外,我們可以在蝶形結 中的加法器和乘法器加上額外的暫存器 (register)來降低系統的關鍵路徑(critical path),來避免某些時刻不同級之間的繁重運算必須擠在同一個cycle中運算完成,進而嚴重影響整體電路在timing上的表現。但如此的管線式設計(pipeline design)也會增加整體電路的延遲(latency)和暫存器 使用量。
相似架構之硬體實作比較
Radix-2 SDF: 2(log4 N-1) 個乘法器、4log4 N 個加法器、記憶體大小為 N-1。
Radix-4 SDF: log4 N-1 個乘法器、8log4 N 個加法器、記憶體大小為 N-1。
Radix-22 SDF: log4 N-1 個乘法器、4log4 N 個加法器、記憶體大小為 N-1。
Radix-2 MDC: 2(log4 N-1) 個乘法器、4log4 N 個加法器、記憶體大小為 1.5N-2。
Radix-4 MDC: 3(log4 N-1) 個乘法器、8log4 N 個加法器、記憶體大小為 2.5N-4。
Radix-4 SDC: log4 N-1 個乘法器、3log4 N 個加法器、記憶體大小為 2N-2。
複雜度以及運算量的極限
長久以來,人們對於求出快速傅立葉變換的複雜度下限以及需要多少的運算量感到很有興趣,而實際上也還有許多問題需要解決。即使是用較簡單的情形,即
2
k
{\displaystyle 2^{k}}
點的DFT,也還沒能夠嚴謹的證明出FFT至少需要
Ω
(
N
log
N
)
{\displaystyle \Omega (N\log N)}
(不比
N
log
N
{\displaystyle N\log N}
小)的運算量,目前也沒有發現複雜度更低的演算法。通常數學運算量的多寡會是運算效率好壞最主要的因素,但在現實中,有許多因素也會有很大的影響,如快取記憶體以及CPU均有很大的影響。
在1978年,Winograd率先導出一個較嚴謹的FFT所需乘法量的下限:
Θ
(
N
)
{\displaystyle \Theta (N)}
。當
N
=
2
k
{\displaystyle N=2^{k}}
時,DFT只需要
4
N
−
2
log
2
2
N
−
2
log
2
N
−
4
{\displaystyle 4N-2\log _{2}^{2}N-2\log _{2}N-4}
次無理實數的乘法即可以計算出來。更詳盡,且也能趨近此下限的演算法也一一被提出(Heideman & Burrus, 1986; Duhamel, 1990)。很可惜的是,這些演算法,都需要很大量的加法計算,目前的硬體無法克服這個問題。
對於所需加法量的數目,雖然我們可以在某些受限制的假設下,推得其下限,但目前並沒有一個精確的下限被推導出來。1973年,Morgenstern在乘法常數趨近巨大的情形下(對大部分的FFT演算法為真,但不是全部)推導出加法量的下限:
Ω
(
N
log
N
)
{\displaystyle \Omega \left(N\log N\right)}
。Pan(1986)在假設FFT演算法的不同步的情形有其極限下證明出加法量的下限
Ω
(
N
l
o
g
N
)
{\displaystyle \Omega (NlogN)}
,但一般來說,此假設相當的不明確。長度為
N
=
2
k
{\displaystyle N=2^{k}}
的情形下,在某些假設下,Papadimitriou(1979)提出使用Cooley-Tukey演算法所需的複數加法量
N
log
2
N
{\displaystyle N\log _{2}N}
是最少的。到目前為止,在長度為
N
=
2
k
{\displaystyle N=2^{k}}
情況,還沒有任何FFT的演算法可以讓複數的加法量比
N
log
2
N
{\displaystyle N\log _{2}N}
還少。
還有一個問題是如何把乘法量與加法量的總和最小化,有時候稱作"演算複雜度"(在這裡考慮的是實際的運算量,而不是漸近複雜度)。同樣的,沒有一個嚴謹下限被證明出來。從1968年開始,
N
=
2
k
{\displaystyle N=2^{k}}
點DFT而言,split-radix FFT演算法需要最少的運算量,在
N
>
1
{\displaystyle N>1}
的情形下,其需要
4
N
log
2
N
−
6
N
+
8
{\displaystyle 4N\log _{2}N-6N+8}
個乘法運算以及加法運算。最近有人導出更低的運算量:
34
9
N
log
2
N
{\displaystyle {\frac {34}{9}}N\log _{2}N}
。(Johnson and Frigo, 2007; Lundy and Van Buskirk, 2007)
大多數嘗試要降低或者證明FFT複雜度下限的人都把焦點放在複數資料輸入的情況,因其為最簡單的情形。但是,複數資料輸入的FFT演算法,與實數資料輸入的FFT演算法,離散餘弦轉換(DCT),離散哈特列轉換(DHT),以及其他的演算法,均有很大的關連性。故任何一個演算法,在複雜度上有任何的改善的話,其他的演算法複雜度也會馬上獲得改善(Duhamel & Vetterli, 1990)。
快速演算法查表
For a N-point DFT:
N = 1~60
N
乘法數
加法數
N
乘法數
N
乘法數
N
乘法數
1
0
0
11
46
24
28
39
182
2
0
4
12
8
25
148
40
100
3
2
12
13
52
26
104
42
124
4
0
16
14
32
27
114
44
160
5
10
34
15
40
28
64
45
170
6
4
36
16
20
30
80
48
92
7
16
72
18
32
32
72
52
208
8
4
52
20
40
33
160
54
228
9
16
72
21
62
35
150
56
156
10
20
88
22
80
36
64
60
160
N < 1000
N
乘法數
N
乘法數
N
乘法數
N
乘法數
63
256
96
280
192
752
360
1540
64
204
104
468
204
976
420
2080
66
284
108
456
216
1020
480
2360
70
300
112
396
224
1016
504
2300
72
164
120
380
240
940
512
3180
80
260
128
560
252
1024
560
3100
81
480
144
436
256
1308
672
3496
84
248
160
680
288
1160
720
3620
88
412
168
580
312
1324
784
4412
90
340
180
680
336
1412
840
4580
N > 1000
N
乘法數
N
乘法數
N
乘法數
N
乘法數
1008
5356
1440
8680
2520
16540
4032
29488
1024
7436
1680
10420
2688
19108
4096
37516
1152
7088
2016
12728
2880
20060
4368
35828
1260
7640
2048
16836
3369
24200
4608
36812
1344
8252
2304
15868
3920
29900
5040
36860
其他N的算法:
(1)若N可被兩個以上互質的數相乘得到
設
N
=
P
1
×
P
2
{\displaystyle N=P_{1}\times P_{2}}
,且
P
1
{\displaystyle P_{1}}
與
P
2
{\displaystyle P_{2}}
互質(無須
P
1
{\displaystyle P_{1}}
與
P
2
{\displaystyle P_{2}}
為質數):
則當輸入信號長度為N所需之的乘法器=
P
1
×
B
2
+
P
2
×
B
1
{\displaystyle P_{1}\times B_{2}+P_{2}\times B_{1}}
其中
B
1
{\displaystyle B_{1}}
為
P
1
{\displaystyle P_{1}}
-point DFT乘法量,
B
2
{\displaystyle B_{2}}
為
P
2
{\displaystyle P_{2}}
-point DFT乘法量。
例如:
N
=
65
{\displaystyle N=65}
可以拆成
65
=
5
×
13
{\displaystyle 65=5\times 13}
,其中5與13互質,
藉由查表可得知5-points DFT乘法量為10,13-points DFT乘法量為52,
所以13-points DFT乘法量為
5
×
52
+
13
×
10
=
390
{\displaystyle 5\times 52+13\times 10=390}
。
擴展:
設
N
=
P
1
×
P
2
×
⋅
⋅
⋅
×
P
K
{\displaystyle N=P_{1}\times P_{2}\times \cdot \cdot \cdot \times P_{K}}
,且
P
1
×
P
2
×
⋅
⋅
⋅
×
P
K
{\displaystyle P_{1}\times P_{2}\times \cdot \cdot \cdot \times P_{K}}
互質,
P
k
{\displaystyle P_{k}}
-point DFT乘法量為
B
k
{\displaystyle B_{k}}
,
則N-point DFT可分解為
N
/
P
1
{\displaystyle N/P_{1}}
個
P
1
{\displaystyle P_{1}}
-point DFT+
N
/
P
2
{\displaystyle N/P_{2}}
個
P
2
{\displaystyle P_{2}}
-point DFT+
⋅
⋅
⋅
{\displaystyle \cdot \cdot \cdot }
+
N
/
P
K
{\displaystyle N/P_{K}}
個
P
K
{\displaystyle P_{K}}
-point DFT,
總乘法量為
N
P
1
B
1
+
N
P
2
B
2
+
.
.
.
+
N
P
K
B
K
{\displaystyle {\frac {N}{P_{1}}}B_{1}+{\frac {N}{P_{2}}}B_{2}+...+{\frac {N}{P_{K}}}B_{K}}
(2)若N不可被兩個互質的數相乘得到
設
N
=
P
1
×
P
2
{\displaystyle N=P_{1}\times P_{2}}
,且
P
1
{\displaystyle P_{1}}
與
P
2
{\displaystyle P_{2}}
不互質:
且
n
×
m
{\displaystyle n\times m}
當中(
n
=
1
,
2
,
.
.
.
,
P
1
−
1
{\displaystyle n=1,2,...,P_{1}-1}
,
m
=
1
,
2
,
.
.
.
,
P
2
−
1
{\displaystyle m=1,2,...,P_{2}-1}
),
有
D
1
{\displaystyle D_{1}}
個值不為
N
/
12
{\displaystyle N/12}
及
N
/
8
{\displaystyle N/8}
的倍數,
有
D
2
{\displaystyle D_{2}}
個值為
N
/
12
{\displaystyle N/12}
或
N
/
8
{\displaystyle N/8}
的倍數,但不為
N
/
4
{\displaystyle N/4}
的倍數。
則N-point DFT所需之的乘法量=
P
1
×
B
2
+
P
2
×
B
1
+
3
D
1
+
2
D
2
{\displaystyle P_{1}\times B_{2}+P_{2}\times B_{1}+3D_{1}+2D_{2}}
其中
B
1
{\displaystyle B_{1}}
為
P
1
{\displaystyle P_{1}}
-point DFT乘法量,
B
2
{\displaystyle B_{2}}
為
P
2
{\displaystyle P_{2}}
-point DFT乘法量。
例如:16-point DFT,
16
=
8
×
2
{\displaystyle 16=8\times 2}
乘法量=
2
×
4
+
8
×
0
+
3
×
4
+
2
×
2
=
24
{\displaystyle 2\times 4+8\times 0+3\times 4+2\times 2=24}
or
16
=
4
×
4
{\displaystyle 16=4\times 4}
乘法量=
4
×
0
+
4
×
0
+
3
×
4
+
2
×
4
=
20
{\displaystyle 4\times 0+4\times 0+3\times 4+2\times 4=20}
FFT的應用
快速傅立葉變換可將卷積化乘法並以對數級數降低運算量,已成數位訊號與科學計算核心工具。
其應用涵蓋:
1.音訊與影像壓縮
MP3、AAC 與 JPEG 均把訊號分塊後先作 FFT/MDCT,以把時域樣本轉到頻域;高能量係數集中於低頻,小幅子載波便能重現重要訊息。接著結合人耳/視覺掩蔽模型及 Zig-zag 掃描,將低感知值係數量化為零,大幅降低位元率。最後用霍夫曼或算術編碼存儲係數與量化步階,達到有損壓縮與可調畫質/音質的目的。若不經 FFT,逐點卷積將耗費 O(N²) 運算,無法在即時裝置上完成。
2.無線通訊
現代蜂巢式網路與 Wi-Fi 系統皆採正交分頻多工 (OFDM)。基站先將並行調變符號經 IFFT 合成等間隔子載波;終端則以 FFT 還原頻域資料。此架構可在多徑通道中保持子載波互不干擾,同時透過可變子載波間距支撐 5G NR 的 eMBB 與 mMTC 場景。運用循環字首可把時域摺積化為頻域乘法,等效頻率選擇通道簡化為每載波一次複數乘法,計算量對比傳統單載波大幅減少。
3.頻譜分析與測試儀器
FFT 讓示波器、功率分析儀與機房電力品質監控能在毫秒級顯示功率頻譜。將長度 N 的窗函數樣本取 FFT 後,平方其複數幅度並適當標準化,即得單/雙邊功率譜密度 (PSD)。工程師可由此快速辨識諧波、雜訊底或機械轉速邊帶;科學領域亦用來分析地震波與星體光譜。無須昂貴的掃頻式分析器,即可精確估測頻率分量與相位。
4.圖像處理與快速卷積
空間濾波、去模糊及模板匹配常利用「乘頻域、回時域」策略:對影像與濾波器 PSF 取 FFT,相乘後作 IFFT,即得卷積結果,計算量由 O(N²) 降為 O(N log N)。在盲去模糊或維納解卷積中,亦可用頻域除法抑制模糊並保留高頻細節。此方法支援任意遮罩大小,遠優於滑動視窗直接卷積,適用醫學影像與天文攝影等高解析度場景。
5.雷達/聲納脈衝壓縮
雷達為兼顧高解析與大探測距離,常發射長碼調變脈衝並於接收端做匹配濾波。將回波與已知碼序列分別取 FFT,相乘後 IFFT,即可在頻域完成相關;此「脈衝壓縮」技術能在固定峰值功率下獲得窄等效脈衝寬,提升距離解析度與信雜比,並大幅降低即時硬體乘加數。
6.多項式乘法與同態加密
在多項式乘法或卷積為瓶頸的應用(例如格基同態加密、FFT-based 大數計算)中,先將係數以 NTT/FFT 轉到頻域,再做逐點乘法,最後逆變換還原,即可把 O(N²) 乘法降至 O(N log N)。加密函式庫 SEAL、HElib 均內建此優化,使百萬階多項式運算在一般 CPU 上於毫秒內完成,直接左右現代隱私計算性能。
由此可見,FFT已由數學演算法演變為支撐資訊社會不可或缺的基礎技術。
参阅
参考资料
^ 杨毅明. 数字信号处理(第2版). 北京: 机械工业出版社. 2017年: 第95页. ISBN 9787111576235 .
^ Charles Van Loan, Computational Frameworks for the Fast Fourier Transform (SIAM, 1992).
^ Heideman, M. T.; Johnson, D. H.; Burrus, C. S. Gauss and the history of the fast Fourier transform. IEEE ASSP Magazine. 1984, 1 (4): 14–21. doi:10.1109/MASSP.1984.1162257 .
^ Strang, Gilbert. Wavelets. American Scientist. May–June 1994, 82 (3): 253. JSTOR 29775194 .
^ Dongarra, J.; Sullivan, F. Guest Editors Introduction to the top 10 algorithms . Computing in Science Engineering. January 2000, 2 (1): 22–23. ISSN 1521-9615 . doi:10.1109/MCISE.2000.814652 .
^ Johnson and Frigo, 2007
^ Frigo & Johnson, 2005
^ Shousheng He; Torkelson, M. A new approach to pipeline FFT processor . IEEE Comput. Soc. Press. 1996. ISBN 978-0-8186-7255-2 . doi:10.1109/IPPS.1996.508145 .
延伸阅读
Brenner, N.; Rader, C. A New Principle for Fast Fourier Transformation. IEEE Acoustics, Speech & Signal Processing. 1976, 24 (3): 264–266. doi:10.1109/TASSP.1976.1162805 .
Brigham, E. O. The Fast Fourier Transform. New York: Prentice-Hall. 2002.
Cormen, Thomas H. ; Leiserson, Charles E. ; Rivest, Ronald L. ; Stein, Clifford . 30. (Polynomials and the FFT). Introduction to Algorithms 2. MIT Press and McGraw-Hill. 2001. ISBN 0-262-03293-7 .
Duhamel, Pierre. Algorithms meeting the lower bounds on the multiplicative complexity of length-2n DFTs and their connection with practical algorithms. IEEE Trans. Acoust. Speech. Sig. Proc. 1990, 38 (9): 1504–151. doi:10.1109/29.60070 .
Duhamel, P.; Vetterli, M. Fast Fourier transforms: a tutorial review and a state of the art . Signal Processing. 1990, 19 : 259–299. doi:10.1016/0165-1684(90)90158-U .
Edelman, A.; McCorquodale, P.; Toledo, S. The Future Fast Fourier Transform?. SIAM J. Sci. Computing. 1999, 20 : 1094–1114. doi:10.1137/S1064827597316266 .
D. F. Elliott, & K. R. Rao, 1982, Fast transforms: Algorithms, analyses, applications . New York: Academic Press.
Funda Ergün, 1995, , Proc. 27th ACM Symposium on the Theory of Computing : 407–416.
Frigo, M.; Johnson, S. G. The Design and Implementation of FFTW3 (PDF) . Proceedings of the IEEE. 2005, 93 : 216–231 [2008-06-22 ] . doi:10.1109/jproc.2004.840301 . (原始内容存档 (PDF) 于2019-07-16).
H. Guo and C. S. Burrus, 1996, , Proc. SPIE Intl. Soc. Opt. Eng. 2825 : 250–259.
H. Guo, G. A. Sitton, C. S. Burrus, 1994, , Proc. IEEE Conf. Acoust. Speech and Sig. Processing (ICASSP) 3 : 445–448.
Steve Haynal and Heidi Haynal, "Generating and Searching Families of FFT Algorithms ", Journal on Satisfiability, Boolean Modeling and Computation vol. 7, pp. 145–187 (2011).
Heideman, Michael T.; Burrus, C. Sidney. On the number of multiplications necessary to compute a length-2n DFT. IEEE Trans. Acoust. Speech. Sig. Proc. 1986, 34 (1): 91–95. doi:10.1109/TASSP.1986.1164785 .
Johnson, S. G.; Frigo, M. A modified split-radix FFT with fewer arithmetic operations (PDF) . IEEE Trans. Signal Processing. 2007, 55 (1): 111–119 [2008-06-22 ] . doi:10.1109/tsp.2006.882087 . (原始内容存档 (PDF) 于2021-02-25).
T. Lundy and J. Van Buskirk, 2007. "A new matrix approach to real FFTs and convolutions of length 2k ," Computing 80 (1): 23–45.
Kent, Ray D. and Read, Charles (2002). Acoustic Analysis of Speech . ISBN 978-0-7693-0112-9 . Cites Strang, G. (1994)/May–June). Wavelets. American Scientist, 82, 250–255.
Morgenstern, Jacques. Note on a lower bound of the linear complexity of the fast Fourier transform. J. ACM. 1973, 20 (2): 305–306. doi:10.1145/321752.321761 .
Mohlenkamp, M. J. A fast transform for spherical harmonics (PDF) . J. Fourier Anal. Appl. 1999, 5 (2–3): 159–184. doi:10.1007/BF01261607 . (原始内容 (PDF) 存档于2007年2月6日).
Nussbaumer, H. J. Digital filtering using polynomial transforms. Electronics Lett. 1977, 13 (13): 386–387. doi:10.1049/el:19770280 .
V. Pan, 1986, , Information Proc. Lett. 22 : 11–14.
Christos H. Papadimitriou, 1979, , J. ACM 26 : 95–102.
D. Potts, G. Steidl, and M. Tasche, 2001. "Fast Fourier transforms for nonequispaced data: A tutorial (页面存档备份 ,存于互联网档案馆 )", in: J.J. Benedetto and P. Ferreira (Eds.), Modern Sampling Theory: Mathematics and Applications (Birkhauser).
Press, W.H.; Teukolsky, S.A.; Vetterling, W.T.; Flannery, B.P., Chapter 12. Fast Fourier Transform , Numerical Recipes: The Art of Scientific Computing 3, New York: Cambridge University Press, 2007 [2015-12-11 ] , ISBN 978-0-521-88068-8 , (原始内容存档 于2011-08-11)
Rokhlin, Vladimir; Tygert, Mark. Fast algorithms for spherical harmonic expansions. SIAM J. Sci. Computing. 2006, 27 (6): 1903–1928. doi:10.1137/050623073 .
Schatzman, James C. Accuracy of the discrete Fourier transform and the fast Fourier transform . SIAM J. Sci. Comput. 1996, 17 : 1150–1166. doi:10.1137/s1064827593247023 .
Shentov, O. V.; Mitra, S. K.; Heute, U.; Hossen, A. N. Subband DFT. I. Definition, interpretations and extensions . Signal Processing. 1995, 41 (3): 261–277. doi:10.1016/0165-1684(94)00103-7 .
Sorensen, H. V.; Jones, D. L.; Heideman, M. T.; Burrus, C. S. Real-valued fast Fourier transform algorithms. IEEE Trans. Acoust. Speech Sig. Processing. 1987, 35 (35): 849–863. doi:10.1109/TASSP.1987.1165220 . See also Sorensen, H.; Jones, D.; Heideman, M.; Burrus, C. Corrections to "Real-valued fast Fourier transform algorithms" . IEEE Transactions on Acoustics, Speech, and Signal Processing. 1987, 35 (9): 1353–1353. doi:10.1109/TASSP.1987.1165284 .
Welch, Peter D. A fixed-point fast Fourier transform error analysis. IEEE Trans. Audio Electroacoustics. 1969, 17 (2): 151–157. doi:10.1109/TAU.1969.1162035 .
Winograd, S. On computing the discrete Fourier transform. Math. Computation. 1978, 32 (141): 175–199. JSTOR 2006266 . doi:10.1090/S0025-5718-1978-0468306-4 .