参考文献:
- Cooley J W, Tukey J W. An algorithm for the machine calculation of complex Fourier series[J]. Mathematics of computation, 1965, 19(90): 297-301.
- Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Computation, 2014, 60: 113-119.
DFT
离散傅里叶变换和相应的逆变换为:
X k = ∑ l = 0 n − 1 x l w n k l , k = 0 , 1 , ⋯ , n − 1 x l = 1 n ∑ k = 0 n − 1 X k w n − k l , l = 0 , 1 , ⋯ , n − 1 \begin{aligned} X_k = \sum_{l=0}^{n-1} x_l w_n^{kl},\,\, k=0,1,\cdots,n-1 \\ x_l = \dfrac{1}{n} \sum_{k=0}^{n-1} X_k w_n^{-kl},\,\, l=0,1,\cdots,n-1 \\ \end{aligned} Xk=l=0∑n−1xlwnkl,k=0,1,⋯,n−1xl=n1k=0∑n−1Xkwn−kl,l=0,1,⋯,n−1
Cooley–Tukey Butterfly
推导
DFT可以写成:
X
k
=
∑
l
=
0
n
−
1
x
l
w
n
k
l
=
∑
l
=
0
n
/
2
−
1
x
2
l
w
n
k
(
2
l
)
+
∑
l
=
0
n
/
2
−
1
x
2
l
+
1
w
n
k
(
2
l
+
1
)
\begin{aligned} X_k =& \sum_{l=0}^{n-1} x_l w_n^{kl}\\ =& \sum_{l=0}^{n/2-1} x_{2l} w_n^{k(2l)} + \sum_{l=0}^{n/2-1} x_{2l+1} w_n^{k(2l+1)}\\ \end{aligned}
Xk==l=0∑n−1xlwnkll=0∑n/2−1x2lwnk(2l)+l=0∑n/2−1x2l+1wnk(2l+1)
令:
G
k
=
∑
l
=
0
n
/
2
−
1
x
2
l
w
n
/
2
k
l
H
k
=
∑
l
=
0
n
/
2
−
1
x
2
l
+
1
w
n
/
2
k
l
\begin{aligned} G_k =& \sum_{l=0}^{n/2-1} x_{2l} w_{n/2}^{kl}\\ H_k =& \sum_{l=0}^{n/2-1} x_{2l+1} w_{n/2}^{kl}\\ \end{aligned}
Gk=Hk=l=0∑n/2−1x2lwn/2kll=0∑n/2−1x2l+1wn/2kl
那么:
X
k
=
G
k
+
w
n
k
H
k
X
k
+
n
/
2
=
G
k
−
w
n
k
H
k
\begin{aligned} X_k = G_k + w_n^k H_k\\ X_{k+n/2} = G_k - w_n^k H_k\\ \end{aligned}
Xk=Gk+wnkHkXk+n/2=Gk−wnkHk
并且,
G
k
,
H
k
G_k,\,H_k
Gk,Hk保持
X
k
X_k
Xk的分解性质,可以继续分解。
CT蝴蝶
G k → → → → → ⊕ → X k ↘ ↗ ⋅ ↗ ↘ H k → ⊗ → → → ⊖ → X k + n / 2 ↑ w n k \begin{matrix} G_k & \rightarrow & \rightarrow & \rightarrow & \rightarrow & \rightarrow & \oplus & \rightarrow & X_k\\ &&& \searrow && \nearrow\\ &&&& \cdot\\ &&& \nearrow && \searrow\\ H_k & \rightarrow & \otimes & \rightarrow & \rightarrow & \rightarrow & \ominus & \rightarrow & X_{k+n/2}\\ && \uparrow\\ && w_n^k\\ \end{matrix} GkHk→→→⊗↑wnk→↘↗→→⋅→→↗↘→⊕⊖→→XkXk+n/2
定义比特反序: b r v L ( ∑ i = 0 L − 1 a i 2 i ) : = ∑ i = 0 L − 1 a i 2 L − i − 1 brv_L(\sum_{i=0}^{L-1}a_i2^i) := \sum_{i=0}^{L-1}a_i2^{L-i-1} brvL(∑i=0L−1ai2i):=∑i=0L−1ai2L−i−1
令FFT的空间表示为: { x l } → { x l ′ } → ⋯ → { X k } \{x_l\} \rightarrow \{x'_l\} \rightarrow \cdots \rightarrow\{X_k\} {xl}→{xl′}→⋯→{Xk},从左到右的运算依次记做第 j = 1 , 2 , ⋯ j=1,2,\cdots j=1,2,⋯层。
- 先将 { x l } \{x_l\} {xl}按照 b r v L ( l ) brv_L(l) brvL(l)重新排序,得到 { x l ′ } \{x'_l\} {xl′},上半部分是 G k G_k Gk序列,下半部分是 H k H_k Hk序列。
- 在第 j j j层运算,将 n = 2 L n=2^L n=2L长序列分成长度 2 j 2^j 2j的 2 L − j 2^{L-j} 2L−j个基本块。
- 在每个块里,上半部分是 G k G_k Gk序列,下半部分是 H k H_k Hk序列。
- 利用CT蝴蝶,计算 X k X_k Xk和 X k + n / 2 X_{k+n/2} Xk+n/2 (这只是中间结果),排成 2 j 2^{j} 2j长序列
- 迭代运算 L L L层后,得到序列 { X k } \{X_k\} {Xk}
Gentleman–Sande Butterfly
推导
DFT可以写成:
X
k
=
∑
l
=
0
n
−
1
x
l
w
n
k
l
=
∑
l
=
0
n
/
2
−
1
x
l
w
n
k
l
+
∑
l
=
0
n
/
2
−
1
x
l
+
n
/
2
w
n
k
(
l
+
n
/
2
)
=
∑
l
=
0
n
/
2
−
1
(
x
l
+
x
l
+
n
/
2
w
n
k
n
/
2
)
w
n
k
l
\begin{aligned} X_k =& \sum_{l=0}^{n-1} x_l w_n^{kl}\\ =& \sum_{l=0}^{n/2-1} x_{l} w_n^{kl} + \sum_{l=0}^{n/2-1} x_{l+n/2} w_n^{k(l+n/2)}\\ =& \sum_{l=0}^{n/2-1} (x_{l}+x_{l+n/2}w_n^{kn/2}) w_n^{kl} \end{aligned}
Xk===l=0∑n−1xlwnkll=0∑n/2−1xlwnkl+l=0∑n/2−1xl+n/2wnk(l+n/2)l=0∑n/2−1(xl+xl+n/2wnkn/2)wnkl
并且:
X
2
m
=
∑
l
=
0
n
/
2
−
1
(
x
l
+
x
l
n
/
2
)
w
n
2
m
l
X
2
m
+
1
=
∑
l
=
0
n
/
2
−
1
[
(
x
l
−
x
l
n
/
2
)
w
n
l
]
w
n
2
m
l
\begin{aligned} X_{2m} =& \sum_{l=0}^{n/2-1} (x_{l}+x_{l_n/2}) w_{n}^{2ml}\\ X_{2m+1} =& \sum_{l=0}^{n/2-1} [(x_{l}-x_{l_n/2}) w_{n}^{l}] w_{n}^{2ml}\\ \end{aligned}
X2m=X2m+1=l=0∑n/2−1(xl+xln/2)wn2mll=0∑n/2−1[(xl−xln/2)wnl]wn2ml
令:
y
l
=
x
l
+
x
l
+
n
/
2
z
l
=
(
x
l
−
x
l
n
/
2
)
w
n
l
\begin{aligned} y_l =& x_l + x_{l+n/2}\\ z_l =& (x_{l}-x_{l_n/2}) w_{n}^{l} \end{aligned}
yl=zl=xl+xl+n/2(xl−xln/2)wnl
那么:
X
2
m
=
∑
l
=
0
n
/
2
−
1
y
l
w
n
2
m
l
X
2
m
+
1
=
∑
l
=
0
n
/
2
−
1
z
l
w
n
2
m
l
\begin{aligned} X_{2m} =& \sum_{l=0}^{n/2-1} y_l w_{n}^{2ml}\\ X_{2m+1} =& \sum_{l=0}^{n/2-1} z_l w_{n}^{2ml}\\ \end{aligned}
X2m=X2m+1=l=0∑n/2−1ylwn2mll=0∑n/2−1zlwn2ml
并且,
X
2
m
,
X
2
m
+
1
X_{2m},\,X_{2m+1}
X2m,X2m+1保持
X
k
X_k
Xk的分解性质,可以继续分解。
GS蝴蝶
x l → → → ⊕ → y l ↘ ↗ ⋅ ↗ ↘ x l + n / 2 → → → ⊖ → ⊗ → z l ↑ w n l \begin{matrix} x_l & \rightarrow & \rightarrow & \rightarrow & \oplus & \rightarrow & y_l\\ & \searrow && \nearrow\\ && \cdot\\ & \nearrow && \searrow\\ x_{l+n/2} & \rightarrow & \rightarrow & \rightarrow & \ominus & \rightarrow &\otimes & \rightarrow & z_l\\ &&&&&& \uparrow\\ &&&&&& w_n^l\\ \end{matrix} xlxl+n/2→↘↗→→⋅→→↗↘→⊕⊖→→yl⊗↑wnl→zl
定义比特反序: b r v L ( ∑ i = 0 L − 1 a i 2 i ) : = ∑ i = 0 L − 1 a i 2 L − i − 1 brv_L(\sum_{i=0}^{L-1}a_i2^i) := \sum_{i=0}^{L-1}a_i2^{L-i-1} brvL(∑i=0L−1ai2i):=∑i=0L−1ai2L−i−1
令FFT的空间表示为: { x l } → ⋯ → { X k ′ } → { X k } \{x_l\} \rightarrow \cdots \rightarrow \{X'_k\} \rightarrow \{X_k\} {xl}→⋯→{Xk′}→{Xk},从左到右的运算依次记做第 j = 1 , 2 , ⋯ j=1,2,\cdots j=1,2,⋯层。
- 利用CT蝴蝶,先将 { x l } \{x_l\} {xl}计算得到 { y l } \{y_l\} {yl}和 { z l } \{z_l\} {zl},并将 { y l } \{y_l\} {yl}排列在上半部分, { z l } \{z_l\} {zl}排列在下半部分。
- 在第 j j j层运算,将 n = 2 L n=2^L n=2L长序列分成长度 2 L − j 2^{L-j} 2L−j的 2 j 2^j 2j个基本块。
- 在每个块里,利用CT蝴蝶,计算 y l y_l yl和 z l z_l zl (这只是中间结果)
- 排成 2 L − j 2^{L-j} 2L−j长序列, { y l } \{y_l\} {yl}排列在上半部分, { z l } \{z_l\} {zl}排列在下半部分。
- 迭代运算 L L L层后,得到序列 { X k ′ } \{X'_k\} {Xk′}
- 将 { X k ′ } \{X'_k\} {Xk′}按照 b r v L ( k ) brv_L(k) brvL(k)重新排序,得到 { X k } \{X_k\} {Xk}