快速傅里叶变换(FFT):蝶形算法(CT蝴蝶、GS蝴蝶)

参考文献:

  1. 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.
  2. 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=0n1xlwnkl,k=0,1,,n1xl=n1k=0n1Xkwnkl,l=0,1,,n1

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=0n1xlwnkll=0n/21x2lwnk(2l)+l=0n/21x2l+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=0n/21x2lwn/2kll=0n/21x2l+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=GkwnkHk
并且, 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} GkHkwnkXkXk+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=0L1ai2i):=i=0L1ai2Li1

令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} 2Lj个基本块。
  • 在每个块里,上半部分是 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=0n1xlwnkll=0n/21xlwnkl+l=0n/21xl+n/2wnk(l+n/2)l=0n/21(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=0n/21(xl+xln/2)wn2mll=0n/21[(xlxln/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(xlxln/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=0n/21ylwn2mll=0n/21zlwn2ml
并且, 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/2ylwnlzl

定义比特反序 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=0L1ai2i):=i=0L1ai2Li1

令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} 2Lj 2 j 2^j 2j个基本块。
  • 在每个块里,利用CT蝴蝶,计算 y l y_l yl z l z_l zl (这只是中间结果)
  • 排成 2 L − j 2^{L-j} 2Lj长序列, { 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}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FFT(Fast Fourier Transform)是一种基于蝶形算法快速傅里叶变换方法,用于将时域信号转换为频域表示。它是一种高效计算离散傅里叶变换(DFT)的算法蝶形算法FFT的关键部分,它通过分治策略将DFT问题分解为规模更小的子问题。具体而言,蝶形算法将DFT的计算任务分为奇偶两组,每组包含一半的信号点。然后,它通过递归调用自身来分别计算这两组的DFT。通过这种方式,FFT可以显著减少计算复杂性。 蝶形算法的核心是蝶形运算。它是一种简单的计算,涉及两个复数的乘法和加法。蝶形运算需要两个输入值(称为蝶形输入),分别乘以一个旋转系数(通常通过旋转因子计算得到),然后相加得到两个输出值(称为蝶形输出)。这个运算重复进行,直到计算出所有输出值。 FFT的过程可以用一个蝶形图来表示,其中每个节点代表一次蝶形运算。蝶形图按照二叉树的形式组织,上层节点代表更高频率的DFT,下层节点代表更低频率的DFT。通过在蝶形图上按照特定顺序进行计算,FFT可以以线性时间复杂度完成整个DFT过程。 总结起来,FFT快速傅里叶变换的核心是蝶形算法,它通过分治策略将DFT问题分解为规模更小的子问题,然后通过蝶形运算来计算这些子问题。FFT以其高效的计算能力,广泛应用于信号处理、图像处理、通信等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值