DIT & DIF
通常我们见到的基-2 FFT 都是按时间抽取的 FFT,称为 Decimation-in-Time (DIT)。
下面介绍一种按频率进行抽取的基-2 FFT,称为 Decimation-in-Frequency (DIF)
X2k=n=0∑N−1exp(−iN2π2kn)xn=n=0∑N/2−1exp(−iN2π2kn)xn+n=N/2∑N−1exp(−iN2π2kn)xn=n=0∑N/2−1exp(−iN2π2kn)xn+exp(−iN2π2k(n+N/2))xn+N/2=n=0∑N/2−1exp(−iN2π2kn)(xn+xn+N/2)
X2k+1=n=0∑N−1exp(−iN2π(2k+1)n)xn=n=0∑N/2−1exp(−iN2π(2k+1)n)xn+n=N/2∑N−1exp(−iN2π(2k+1)n)xn=n=0∑N/2−1exp(−iN2π2kn)exp(−iN2πn)xn+exp(−iN2π(2k+1)(n+N/2))xn+N/2=n=0∑N/2−1exp(−iN2π2kn)exp(−iN2πn)(xn−xn+N/2)
于是可以将 {xn+xn+N/2}n=0N−1,{exp(−iN2πn)(xn−xn+N/2)}n=0N−1 看作两个新序列,对他们分别做 DFT。DIF 的步骤可以总结为
(a0,a1,…,aN/2−1)=(x0+xN/2,x1+x1+N/2,…,xN/2+xN−1)(b0,b1,…,bN/2−1)=(x0−xN/2,x1−x1+N/2,…,xN/2−xN−1)⊙(wN0,wN1,…,wNN/2−1)(X0,X2,…,XN−2)=FFT(a0,a1,…,aN/2−1)(X1,X3,…,XN−1)=FFT(b0,b1,…,bN/2−1)
DIF 与 DIT 区别在于 DIF 是先做加法和乘法,再做 FFT。而 DIT 正好相反。
Split Radix
分裂基算法是基于 DIF 推导的,实际上是基-2和基-4的混合,对偶数下标的作基-2 FFT,对奇数下标的作基-4 FFT。具体如下:
X2kx4k+1x4k+3=n=0∑N/2−1exp(−iN2π2kn)(xn+xn+N/2)=n=0∑N/4−1exp(−iN2π4k)exp(−iN2πn)(xn−xn+N/2−i(xn+N/4−xn+3N/4))=n=0∑N/4−1exp(−iN2π4k)exp(−iN2π3n)(xn−xn+N/2+i(xn+N/4−xn+3N/4))
这样,长度为 N 的 DFT 可以分解为一个长度为 N/2 和两个长度为 N/4 的 DFT。分裂基算法相对于基-2的 FFT 计算量更小,原因是:可以观察到,偶数项前不需要乘旋转因子,这一部分计算量已经最小;而对于奇数项,由于计算机进行复数运算时是将实部和虚部分别进行计算,与 exp(iπk/2),k∈Z 这类复数的乘积是可以简化的:exp(iπk),k∈Z 不需要进行加法和乘法运算,只需要将符号或者实部虚部互换;exp(iπ(k+21)) 由于虚部和实部的绝对值相等,所以也只需进行两次加法运算和乘法运算;而其他复数则需要进行四次乘法和两次加法。
所以对于基-2 的 FFT,可以得到递推公式
Add(n)=⎩⎪⎨⎪⎧4162Add(n/2)+2n+2(n/2−2)=2Add(n/2)+3n−4n=2n=4n≥8
Mul(n)={02Mul(n/2)+4(n/2−4)+2⋅2=2Mul(n/2)+2n−12n=2,4n≥8
对于分裂基 FFT,可以得到递推公式
Add(n)=⎩⎪⎨⎪⎧416Add(n/2)+2Add(n/4)+3n+2(n/2−2)n=2n=4n≥8
Mul(n)={0Mul(n/2)+2Mul(n/4)+4(n/2−4)+4n=2,4n≥8
通过递推公式可以证明分裂基 FFT 的计算量,不管是加法还是减法,都更少。原因是它更好地利用了较小的 n,同时也更好地利用了单位根的性质。
证明:
乘法是显然的,因为后面加的一项是一样的,而由计算复杂度为 Θ(nlogn),所以 Mul(n)≥2Mul(n/2),前一项也更小
令 Add1 表示基-2 FFT,Add2 表示分裂基 FFT,运用数学归纳法,对于 n=2,4 成立,假设对于 2,4,…,n/2 都成立,则有
Add1(n)−Add2(n)≥Add1(n/2)−2Add1(n/4)−n=23n−4−n=21n−4≥0
得证
以下展示一些 n 的运算量
加法运算数:
n |
Radix-2 |
Split Radix |
8 |
52 |
52 |
16 |
148 |
144 |
32 |
388 |
372 |
64 |
964 |
912 |
乘法运算数:
n |
Radix-2 |
Split Radix |
8 |
4 |
4 |
16 |
28 |
24 |
32 |
108 |
84 |
64 |
332 |
248 |