DFT
令 p 1 , p 2 , . . . , p b p_1,p_2,...,p_b p1,p2,...,pb是b个整数,令 θ j = e − 2 π i / p j \theta_j = e^{-2 \pi i/p_j} θj=e−2πi/pj 是 p j p_j pj阶单位根,其中 i 2 + 1 = 0 i^2+1=0 i2+1=0
定义 G : = Z p 1 × Z p 2 × ⋯ × Z p b G:= Z_{p_1} \times Z_{p_2} \times \dots \times Z_{p_b} G:=Zp1×Zp2×⋯×Zpb,容易验证G是拥有 p 1 p 2 … p b p_1p_2 \dots p_b p1p2…pb个元素的群。
对于 x ∈ G x \in G x∈G,我们简单记做: ( x 1 , x 2 , … , x b ) , x j ∈ Z p j (x_1,x_2, \dots, x_b),\, x_j \in Z_{p_j} (x1,x2,…,xb),xj∈Zpj
函数
f
:
G
→
C
f:G \rightarrow C
f:G→C 离散傅里叶变换是
F
:
G
→
C
F:G \rightarrow C
F:G→C
F
(
α
)
=
∑
x
∈
G
(
f
(
x
)
∏
j
=
1
b
θ
j
α
j
x
j
)
F(\alpha) = \sum_{x \in G} ( f(x) \prod_{j=1}^{b} \theta_{j}^{\alpha_j x_j} )
F(α)=x∈G∑(f(x)j=1∏bθjαjxj)
IDFT
反离散傅里叶变换公式:
f
(
x
)
=
1
p
1
p
2
…
p
b
∑
α
∈
G
(
F
(
α
)
∏
j
=
1
b
θ
j
−
α
j
x
j
)
f(x) = \frac{1}{p_1p_2 \dots p_b} \sum_{\alpha \in G} ( F(\alpha) \prod_{j=1}^{b} \theta_{j}^{ - \alpha_j x_j} )
f(x)=p1p2…pb1α∈G∑(F(α)j=1∏bθj−αjxj)
容易验证,上式是正确的。
由于
θ
j
0
=
1
\theta_j^{0} = 1
θj0=1,且
θ
j
0
+
θ
j
1
+
⋯
+
θ
j
p
j
−
1
=
0
\theta_j^0+\theta_j^1+ \dots + \theta_j^{p_j-1} = 0
θj0+θj1+⋯+θjpj−1=0,因此:
∑
α
∈
G
(
∏
j
=
1
b
θ
j
α
j
(
x
j
−
x
j
′
)
)
=
{
∣
G
∣
x
=
x
′
0
x
≠
x
′
\sum_{\alpha \in G}( \prod_{j=1}^{b} \theta_{j}^{ \alpha_j (x_j-x_j')} ) = \left\{ \begin{aligned} |G| && x = x'\\ 0 && x \not = x'\\ \end{aligned} \right.
α∈G∑(j=1∏bθjαj(xj−xj′))={∣G∣0x=x′x=x′
其中
∣
G
∣
=
p
1
p
2
…
p
b
|G| = p_1p_2 \dots p_b
∣G∣=p1p2…pb
FFT
将 f ( x ) f(x) f(x)和 F ( α ) F(\alpha) F(α)视作形状是 p 1 × p 2 × ⋯ × p b p_1 \times p_2 \times \cdots \times p_b p1×p2×⋯×pb的阵列,阵列元素属于复数域 C C C。而 x , α x,\alpha x,α就是阵列的坐标。
直接计算 F ( α ) = ∑ x ∈ G ( f ( x ) ∏ j = 1 b θ p j α j x j ) F(\alpha) = \sum_{x \in G} ( f(x) \prod_{j=1}^{b} \theta_{p_j}^{\alpha_j x_j} ) F(α)=∑x∈G(f(x)∏j=1bθpjαjxj)的复杂度是: O ( p 1 p 2 . . . p b ⋅ p 1 p 2 . . . p b ) = O ( p 1 2 p 2 2 . . . p b 2 ) O(p_1p_2...p_b \cdot p_1p_2...p_b) = O(p_1^2p_2^2...p_b^2) O(p1p2...pb⋅p1p2...pb)=O(p12p22...pb2)
假设
p
1
,
p
2
,
.
.
.
,
p
b
p_1,p_2,...,p_b
p1,p2,...,pb都是2的幂次 (若不是,那可以将
G
G
G扩充,并对
f
(
x
)
f(x)
f(x)补零),那么
θ
p
j
2
\theta_{p_j}^2
θpj2是
p
j
2
\dfrac{p_j}{2}
2pj次单位根。使用分治算法:
F
(
α
)
=
∑
x
∈
G
a
n
d
x
1
≡
0
(
m
o
d
2
)
f
(
x
)
(
θ
p
1
2
α
1
)
x
1
2
∏
j
=
2
b
θ
p
j
α
j
x
j
+
θ
p
1
∑
x
∈
G
a
n
d
x
1
≡
1
(
m
o
d
2
)
f
(
x
)
(
θ
p
1
2
α
1
)
x
1
−
1
2
∏
j
=
2
b
θ
p
j
α
j
x
j
\begin{aligned} F(\alpha) = && \sum_{x \in G\, and\,x_1 \equiv 0 \pmod{2}} f(x) (\theta_{p_1}^{2 \alpha_1})^{\frac{x_1}{2}} \prod_{j=2}^{b} \theta_{p_j}^{\alpha_j x_j} \\ + && \theta_{p_1} \sum_{x \in G\, and\,x_1 \equiv 1 \pmod{2}} f(x) (\theta_{p_1}^{2 \alpha_1})^{\frac{x_1 - 1}{2}} \prod_{j=2}^{b} \theta_{p_j}^{\alpha_j x_j}\\ \end{aligned}
F(α)=+x∈Gandx1≡0(mod2)∑f(x)(θp12α1)2x1j=2∏bθpjαjxjθp1x∈Gandx1≡1(mod2)∑f(x)(θp12α1)2x1−1j=2∏bθpjαjxj
定义:
F
0
(
α
)
=
∑
x
∈
G
a
n
d
x
1
≡
0
(
m
o
d
2
)
f
(
x
)
(
θ
p
1
2
α
1
)
x
1
2
∏
j
=
2
b
θ
p
j
α
j
x
j
F
1
(
α
)
=
∑
x
∈
G
a
n
d
x
1
≡
1
(
m
o
d
2
)
f
(
x
)
(
θ
p
1
2
α
1
)
x
1
−
1
2
∏
j
=
2
b
θ
p
j
α
j
x
j
\begin{aligned} F_0(\alpha) = \sum_{x \in G\, and\,x_1 \equiv 0 \pmod{2}} f(x) (\theta_{\frac{p_1}{2}}^{\alpha_1})^{\frac{x_1}{2}} \prod_{j=2}^{b} \theta_{p_j}^{\alpha_j x_j} \\ F_1(\alpha) = \sum_{x \in G\, and\,x_1 \equiv 1 \pmod{2}} f(x) (\theta_{\frac{p_1}{2}}^{\alpha_1})^{\frac{x_1 - 1}{2}} \prod_{j=2}^{b} \theta_{p_j}^{\alpha_j x_j} \\ \end{aligned}
F0(α)=x∈Gandx1≡0(mod2)∑f(x)(θ2p1α1)2x1j=2∏bθpjαjxjF1(α)=x∈Gandx1≡1(mod2)∑f(x)(θ2p1α1)2x1−1j=2∏bθpjαjxj
其实,这里我们把阵列
f
(
x
)
f(x)
f(x)根据
x
1
x_1
x1的奇偶性,对半分到了两个子问题中,并希望分别求得两个阵列
F
0
,
F
1
F_0,F_1
F0,F1
由于
θ
p
1
2
p
1
2
=
1
,
θ
p
1
p
1
2
=
−
1
\theta_{\frac{p_1}{2}}^{\frac{p_1}{2}} = 1,\,\,\theta_{p_1}^{\frac{p_1}{2}} = -1
θ2p12p1=1,θp12p1=−1因此:
F
(
α
)
=
F
0
(
α
)
+
θ
p
1
F
1
(
α
)
,
F
(
α
+
(
p
1
2
,
0
,
.
.
.
,
0
)
)
=
F
0
(
α
)
−
θ
p
1
F
1
(
α
)
.
\begin{aligned} F(\alpha) = F_0(\alpha) + \theta_{p_1} F_1(\alpha),\\ F(\alpha + (\frac{p_1}{2},0,...,0)) = F_0(\alpha) - \theta_{p_1} F_1(\alpha).\\ \end{aligned}
F(α)=F0(α)+θp1F1(α),F(α+(2p1,0,...,0))=F0(α)−θp1F1(α).
也就是说,只需要求解一半的坐标
α
\alpha
α上的两个小阵列
F
0
,
F
1
F_0,F_1
F0,F1,那么就可以得到全部的坐标
α
\alpha
α上的阵列
F
F
F的值。
那么原本需要对 p 1 p 2 . . . p b p_1p_2...p_b p1p2...pb个 α ∈ G \alpha \in G α∈G,计算1个关于 x ∈ G x \in G x∈G的含 p 1 p 2 . . . p b p_1p_2...p_b p1p2...pb个单项的和函数 F ( α ) F(\alpha) F(α),复杂度 O ( p 1 2 p 2 2 . . . p b 2 ) O(p_1^2p_2^2...p_b^2) O(p12p22...pb2)
转换后,需要对 p 1 p 2 . . . p b 2 \dfrac{p_1p_2...p_b}{2} 2p1p2...pb个 α ∈ G \alpha \in G α∈G,计算2个关于 x ∈ G x \in G x∈G的含 p 1 p 2 . . . p b 2 \dfrac{p_1p_2...p_b}{2} 2p1p2...pb个单项的和函数 F 0 ( α ) , F 1 ( α ) F_0(\alpha),\,F_1(\alpha) F0(α),F1(α),复杂度 O ( p 1 2 p 2 2 . . . p b 2 2 ) O(\frac{p_1^2p_2^2...p_b^2}{2}) O(2p12p22...pb2)
由于 p 1 , p 2 , . . . , p b p_1,p_2,...,p_b p1,p2,...,pb都是2的幂次,可反复运用上述方法分而治之,将阵列 f ( x ) f(x) f(x)对半分到两个子问题中,求解一半的 α \alpha α的阵列值。最终的极小子问题有 p 1 p 2 . . . p b p_1p_2...p_b p1p2...pb个,也就是关于 x ∈ G x \in G x∈G的 F 0 o r 1 ( α ) = f ( x ) θ 1 s = f ( x ) F_{0\,or\,1}(\alpha) = f(x) \theta_1^{s} = f(x) F0or1(α)=f(x)θ1s=f(x),然后相邻的子问题两两归并,得到 F ( α ) F(\alpha) F(α)的值。
最终的复杂度为: O ( p 1 p 2 . . . p b log p 1 log p 2 ⋯ log p b ) = O ( ∏ j = 1 b p j log p j ) O(p_1p_2...p_b\log{p_1}\log{p_2} \cdots \log{p_b}) = O(\prod_{j=1}^{b} p_j \log{p_j)} O(p1p2...pblogp1logp2⋯logpb)=O(∏j=1bpjlogpj)
理解
傅里叶变换思路:将随时间变化的周期函数f,分解到若干两两正交的函数(如:某频率的不同倍数的三角函数)上,记录它们各自的振幅。这样我们就把随时间变化的函数,变成了不随时间变化的各频率的振幅。如果函数f不是周期的,就视作它的周期为无穷大。
例如,观察b=1时的IDFT公式,
f
(
x
)
=
1
p
∑
α
∈
Z
p
F
(
α
)
(
θ
p
−
α
)
x
f(x) = \frac{1}{p} \sum_{\alpha \in Z_p} F(\alpha) (\theta_{p}^{ - \alpha})^{x}
f(x)=p1∑α∈ZpF(α)(θp−α)x,关于
α
∈
Z
p
\alpha \in Z_p
α∈Zp的p个函数
(
θ
p
−
α
)
x
(\theta_{p}^{ - \alpha})^{x}
(θp−α)x两两正交(在一个周期上两函数的卷积为0):
∑
x
=
0
p
−
1
(
θ
−
α
1
)
x
(
θ
−
α
2
)
p
−
x
=
∑
x
=
0
p
−
1
θ
(
α
2
−
α
1
)
x
=
0
,
α
1
≠
α
2
\sum_{x=0}^{p-1} (\theta^{-\alpha_1})^x (\theta^{-\alpha_2})^{p-x} = \sum_{x=0}^{p-1} \theta^{(\alpha_2 - \alpha_1)x} =0,\, \alpha_1 \not = \alpha_2
x=0∑p−1(θ−α1)x(θ−α2)p−x=x=0∑p−1θ(α2−α1)x=0,α1=α2
在离散傅里叶变换中,将时域函数 f : G → C f:G \rightarrow C f:G→C 和频域函数 F : G → C F:G \rightarrow C F:G→C 都看做b维数组,将 x , α x,\alpha x,α 看做坐标点。那么DFT和IDFT就只是两个b维数组之间的双射。
应用
-
图像处理:二维图像,设置b=2,用于滤波:可以很方便的找到高频分量(包含图像精细结构的信息)和低频分量(只包含平缓结构信息,但占据绝大多数能量);另外,可以对复数计算"谱"(包含灰度信息)和"相角"(包含形状信息)
-
波形分析:可以从频谱图中清晰地看到波形特征。比如,声纹识别
-
多项式计算:将多项式乘法(其实就是卷积)复杂度降低到 O ( n ) O(n) O(n),利用FFT变换的复杂度是 O ( n l o g n ) O(n log\,n) O(nlogn)
将两个n-1度多项式 g ( x ) , h ( x ) g(x),h(x) g(x),h(x) 的系数取出来,视作一维数组 v g , v h ∈ C n v_g, v_h \in C^n vg,vh∈Cn ,分别做DFT得到n长的一维数组 V g , V h ∈ C n V_g, V_h \in C^n Vg,Vh∈Cn。
假如多项式系数不属于 C C C 而是属于有限域 G F ( q ) GF(q) GF(q),将系数取出来视作一维数组 v g , v h ∈ G F ( q ) n v_g, v_h \in GF(q)^n vg,vh∈GF(q)n 。 假如 ∃ m , n ∣ q m − 1 \exist m,\, n | q^m-1 ∃m,n∣qm−1,取 o r d ( θ ) = n ord(\theta)=n ord(θ)=n 的单位根 θ ∈ G F ( q m ) \theta \in GF(q^m) θ∈GF(qm)。分别做DFT得到n长的一维数组 V g , V h ∈ G F ( q m ) n V_g, V_h \in GF(q^m)^n Vg,Vh∈GF(qm)n。
容易发现,计算乘积 V a [ j ] = V g [ j ] ⋅ V h [ j ] V_a[j] = V_g[j] \cdot V_h[j] Va[j]=Vg[j]⋅Vh[j],做IDFT后得到以数组 v a v_a va为系数的多项式 a ( x ) a(x) a(x);由于 v a v_a va等于循环卷积 v g ∗ v h v_g * v_h vg∗vh,因此: a ( x ) = g ( x ) h ( x ) m o d x n − 1 a(x) = g(x) h(x) \,\,mod\,\, x^{n}-1 a(x)=g(x)h(x)modxn−1。如果想在 C [ x ] C[x] C[x] 或者 G F ( q ) [ x ] GF(q)[x] GF(q)[x] 上计算 g ( x ) h ( x ) g(x)h(x) g(x)h(x),只需要略作修改使得 d e g ( g ) + d e g ( h ) ≤ n − 1 deg(g) + deg(h) \le n-1 deg(g)+deg(h)≤n−1 即可。