(高维)离散傅里叶变换DFT 和 快速傅里叶变换FFT

本文详细介绍了离散傅立叶变换(DFT)的概念、群论基础、IDFT公式,以及快速傅立叶变换(FFT)的分治策略。重点讲解了如何通过FFT降低多项式乘法复杂度,并展示了在图像处理、波形分析和多项式计算中的实际应用。
摘要由CSDN通过智能技术生成

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=e2π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 p1p2pb个元素的群。

对于 x ∈ G x \in G xG,我们简单记做: ( 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),xjZpj

函数 f : G → C f:G \rightarrow C f:GC 离散傅里叶变换是 F : G → C F:G \rightarrow C F:GC
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(α)=xG(f(x)j=1bθ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)=p1p2pb1αG(F(α)j=1bθ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++θjpj1=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=1bθjαj(xjxj))={G0x=xx=x
​ 其中 ∣ G ∣ = p 1 p 2 … p b |G| = p_1p_2 \dots p_b G=p1p2pb

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(α)=xG(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...pbp1p2...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(α)=+xGandx10(mod2)f(x)(θp12α1)2x1j=2bθpjαjxjθp1xGandx11(mod2)f(x)(θp12α1)2x11j=2bθ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(α)=xGandx10(mod2)f(x)(θ2p1α1)2x1j=2bθpjαjxjF1(α)=xGandx11(mod2)f(x)(θ2p1α1)2x11j=2bθ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 xG的含 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 xG的含 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 xG 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...pblogp1logp2logpb)=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=0p1(θα1)x(θα2)px=x=0p1θ(α2α1)x=0,α1=α2

在离散傅里叶变换中,将时域函数 f : G → C f:G \rightarrow C f:GC 和频域函数 F : G → C F:G \rightarrow C F:GC 都看做b维数组,将 x , α x,\alpha x,α 看做坐标点。那么DFTIDFT就只是两个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,vhCn ,分别做DFT得到n长的一维数组 V g , V h ∈ C n V_g, V_h \in C^n Vg,VhCn

假如多项式系数不属于 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,vhGF(q)n 。 假如 ∃ m ,   n ∣ q m − 1 \exist m,\, n | q^m-1 m,nqm1,取 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,VhGF(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 vgvh,因此: 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)modxn1。如果想在 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)n1 即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值