浅谈离散傅里叶变换和快速算法

这是一篇FFT的学习笔记兼作业
本来想发到lofter上
但lofter不支持markdown
只好发到这里了
文章的引用部分是作业题部分
和全文有的时候没什么关系
各位读者忽略就好
转载请注明出处

一年半后再看,本篇分析完全是从数学角度出发讨论如何优化的
所以对数学公式的表述非常密集
希望不要引起食用不适

文章目录

    • 1 离散傅里叶变换(DFT)
      • 1.1 $Z$变换
      • 1.2 离散傅里叶变换(DFT)与逆变换(IDFT)
      • 1.3 DFT矩阵与IDFT矩阵
      • 1.4 DFT与IDFT的性质
    • 2 快速傅里叶变换(FFT)和逆变换(IFFT)
      • 2.1 $r$进制自然数和两种划分
      • 2.2 基-$r$DIT-FFT/IFFT算法
      • 2.3 基-$r$DIF-FFT/IFFT算法
      • 2.4 $r$进制下的逆序和程序实现
        • 2.4.1 基$r$-DIT-FFT与二进制下的逆序
        • 2.4.2 基$2$-DIT-FFT的程序实现
      • 2.5 复杂度分析
        • 2.5.1 主定理(Master Theorem)
        • 2.5.2 基-$r$DIT/DFT-FFT的复杂度
    • 3 几个实例
      • 3.1 基-$2$DIT-FFT/IFFT
      • 3.2 基-$3$DIT-FFT/IFFT
      • 3.3 基-$7$DIT-FFT/IFFT
      • 3.4 N点FFT
    • 4 分段光滑函数$f(x)$的展开周期
    • 附录1: FFT源代码
    • 参考文献

1 离散傅里叶变换(DFT)

1.1 Z Z Z变换

给定一个有 N N N个样点序列 { x ( n ) } \{x(n)\} {x(n)},其 Z Z Z变换 { X ( z ) } \{X(z)\} {X(z)}定义为 X ( x ) = ∑ n = 0 N − 1 x ( n ) z − n X(x)=\sum_{n=0}^{N-1}x(n)z^{-n} X(x)=n=0N1x(n)zn.令 f s = 1 T f_s=\frac{1}{T} fs=T1(采样速率),或者 T = 1 f s T=\frac{1}{f_s} T=fs1(采样间隔), 则 X ( e i ω T ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π f n f s X(e^{i\omega T})=\sum_{n=0}^{N-1}x(n)e^{-\frac{i2\pi fn}{f_s}} X(eiωT)=n=0N1x(n)efsi2πfn i 2 = − 1 , ω = 2 π f i^2=-1,\omega=2\pi f i2=1,ω=2πf,这里及后文出现的 i i i都表示虚数单位.此时表示了 X ( z ) X(z) X(z) z z z平面以原点为中心的单位圆上的取值.若对单位圆等间隔取样,则有 X F ( k ) = ∑ n = 0 N − 1 x ( n ) e − i 2 π k n N , k = 0 , 1 , ⋯   , N − 1 X^F(k)=\sum_{n=0}^{N-1}x(n)e^{-\frac{i2\pi kn}{N}},k=0,1,\cdots,N-1 XF(k)=n=0N1x(n)eNi2πkn,k=0,1,,N1,此式有 k = N f f s k=\frac{Nf}{f_s} k=fsNf.将变换 X F ( k ) X^F(k) XF(k)称为离散傅里叶变换(DFT).可以看出,DFT其实是 Z Z Z变换在单位圆上的等间隔采样.这是从 Z Z Z变换的角度来定义的DFT.

1.2 离散傅里叶变换(DFT)与逆变换(IDFT)

事实上,以下关于DFT的定义更常见. X F ( k ) = ∑ n = 0 N − 1 x ( n ) W N k n , k = 0 , 1 , ⋯   , N − 1 X^F(k)=\sum_{n=0}^{N-1}x(n)W_N^{kn},k=0,1,\cdots,N-1 XF(k)=n=0N1x(n)WNkn,k=0,1,,N1 W N = e − i 2 π N , W N k n = e − i 2 π k n N W_N=e^{-\frac{i2\pi}{N}},W_N^{kn}=e^{-\frac{i2\pi kn}{N}} WN=eNi2π,WNkn=eNi2πknIDFT定义为 x ( n ) = 1 N ∑ k = 0 N − 1 X F ( k ) W N − k n , n = 0 , 1 , ⋯   , N − 1 x(n)=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)W_N^{-kn},n=0,1,\cdots,N-1 x(n)=N1k=0N1XF(k)WNkn,n=0,1,,N1 ( W N k n ) ∗ = W N − k n = e i 2 π n k N (W_N^{kn})^*=W_N^{-kn}=e^{\frac{i2\pi nk}{N}} (WNkn)=WNkn=eNi2πnk这里的 ∗ * 表示复共轭运算.
1 N \frac{1}{N} N1为归一化因子.归一化因子可以平均地分配在DFT和IDFT中, 即归一化DFT,正变换和逆变换定义如下 X F ( k ) = 1 N ∑ n = 0 N − 1 x ( n ) W N k n , k = 0 , 1 , ⋯   , N − 1 X^F(k)=\frac{1}{\sqrt{N}}\sum_{n=0}^{N-1}x(n)W_N^{kn},k=0,1,\cdots,N-1 XF(k)=N 1n=0N1x(n)WNkn,k=0,1,,N1 x ( n ) = 1 N ∑ k = 0 N − 1 X F ( k ) W N − k n , n = 0 , 1 , ⋯   , N − 1 x(n)=\frac{1}{\sqrt{N}}\sum_{k=0}^{N-1}X^F(k)W_N^{-kn},n=0,1,\cdots,N-1 x(n)=N 1k=0N1XF(k)WNkn,n=0,1,,N1归一化因子也可以完全置于DFT中,即 X F ( k ) = 1 N ∑ n = 0 N − 1 x ( n ) W N k n , k = 0 , 1 , ⋯   , N − 1 X^F(k)=\frac{1}{N}\sum_{n=0}^{N-1}x(n)W_N^{kn},k=0,1,\cdots,N-1 XF(k)=N1n=0N1x(n)WNkn,k=0,1,,N1 x ( n ) = ∑ k = 0 N − 1 X F ( k ) W N − k n , n = 0 , 1 , ⋯   , N − 1 x(n)=\sum_{k=0}^{N-1}X^F(k)W_N^{-kn},n=0,1,\cdots,N-1 x(n)=k=0N1XF(k)WNkn,n=0,1,,N1这三种定义是等价的,为方便起见,选用第一种定义.
DFT的变换对可以用下式表示 x ( n ) ⇔ X F ( k ) x(n)\Leftrightarrow X^F(k) x(n)XF(k)可以注意到 ( W N ) N = 1 , ∑ k = 0 N − 1 W N k = 0 (W_N)^N=1,\sum_{k=0}^{N-1}W_N^k=0 (WN)N=1,k=0N1WNk=0 W N W_N WN为复平面上 1 1 1 N N N次单位根,并且这 N N N个根均匀分布在以原点为中心的单位圆上.

1.3 DFT矩阵与IDFT矩阵

可以用矩阵乘法的形式来表达IDFT和DFT. [ X F ( 0 ) X F ( 1 ) ⋮ X F ( k ) ⋮ X F ( N − 1 ) ] = [ W N 0 × 0 W N 0 × 1 ⋯ W N 0 × n ⋯ W N 0 × ( N − 1 ) W N 1 × 0 W N 1 × 1 ⋯ W N 1 × n ⋯ W N 1 × ( N − 1 ) ⋮ ⋮ ⋮ ⋮ W N k × 0 W N k × 1 ⋯ W N k × n ⋯ W N k × ( N − 1 ) ⋮ ⋮ ⋮ ⋮ W N ( N − 1 ) × 0 W N ( N − 1 ) × 1 ⋯ W N ( N − 1 ) × n ⋯ W N ( N − 1 ) × ( N − 1 ) ] N N [ x ( 0 ) x ( 1 ) ⋮ x ( n ) ⋮ x ( N − 1 ) ] \begin{bmatrix}X^F(0)\\X^F(1)\\\vdots\\X^F(k)\\\vdots\\X^F(N-1)\end{bmatrix}=\begin{bmatrix}W_N^{0\times0}&W_N^{0\times1}&\cdots&W_N^{0\times n}&\cdots&W_N^{0\times(N-1)}\\W_N^{1\times0}&W_N^{1\times1}&\cdots&W_N^{1\times n}&\cdots&W_N^{1\times(N-1)}\\\vdots&\vdots&&\vdots&&\vdots\\W_N^{k\times0}&W_N^{k\times1}&\cdots&W_N^{k\times n}&\cdots&W_N^{k\times(N-1)}\\\vdots&\vdots&&\vdots&&\vdots\\W_N^{(N-1)\times0}&W_N^{(N-1)\times1}&\cdots&W_N^{(N-1)\times n}&\cdots&W_N^{(N-1)\times(N-1)}\end{bmatrix}_{NN}\begin{bmatrix}x(0)\\x(1)\\\vdots\\x(n)\\\vdots\\x(N-1)\end{bmatrix} XF(0)XF(1)XF(k)XF(N1)=WN0×0WN1×0WNk×0WN(N1)×0WN0×1WN1×1WNk×1WN(N1)×1WN0×nWN1×nWNk×nWN(N1)×nWN0×(N1)WN1×(N1)WNk×(N1)WN(N1)×(N1)NNx(0)x(1)x(n)x(N1)则DFT简记为
[ X F ( k ) ] = [ F ] [ x ( n ) ] [X^F(k)]=[F][x(n)] [XF(k)]=[F][x(n)]对于IDFT,有 [ x ( 0 ) x ( 1 ) ⋮ x ( n ) ⋮ x ( N − 1 ) ] = 1 N [ W N − 0 × 0 W N − 0 × 1 ⋯ W N − 0 × k ⋯ W N − 0 × ( N − 1 ) W N − 1 × 0 W N − 1 × 1 ⋯ W N − 1 × k ⋯ W N − 1 × ( N − 1 ) ⋮ ⋮ ⋮ ⋮ W N − n × 0 W N − n × 1 ⋯ W N − n × k ⋯ W N − n × ( N − 1 ) ⋮ ⋮ ⋮ ⋮ W N − ( N − 1 ) × 0 W N − ( N − 1 ) × 1 ⋯ W N − ( N − 1 ) × k ⋯ W N − ( N − 1 ) × ( N − 1 ) ] N N [ X F ( 0 ) X F ( 1 ) ⋮ X F ( k ) ⋮ X F ( N − 1 ) ] \begin{bmatrix}x(0)\\x(1)\\\vdots\\x(n)\\\vdots\\x(N-1)\end{bmatrix}=\frac{1}{N}\begin{bmatrix}W_N^{-0\times0}&W_N^{-0\times1}&\cdots&W_N^{-0\times k}&\cdots&W_N^{-0\times(N-1)}\\W_N^{-1\times0}&W_N^{-1\times1}&\cdots&W_N^{-1\times k}&\cdots&W_N^{-1\times(N-1)}\\\vdots&\vdots&&\vdots&&\vdots\\W_N^{-n\times0}&W_N^{-n\times1}&\cdots&W_N^{-n\times k}&\cdots&W_N^{-n\times(N-1)}\\\vdots&\vdots&&\vdots&&\vdots\\W_N^{-(N-1)\times0}&W_N^{-(N-1)\times1}&\cdots&W_N^{-(N-1)\times k}&\cdots&W_N^{-(N-1)\times(N-1)}\end{bmatrix}_{NN}\begin{bmatrix}X^F(0)\\X^F(1)\\\vdots\\X^F(k)\\\vdots\\X^F(N-1)\end{bmatrix} x(0)x(1)x(n)x(N1)=N1WN0×0WN1×0WNn×0WN(N1)×0WN0×1WN1×1WNn×1WN(N1)×1WN0×kWN1×kWNn×kWN(N1)×kWN0×(N1)WN1×(N1)WNn×(N1)WN(N1)×(N1)NNXF(0)XF(1)XF(k)XF(N1)则IDFT简记为 [ x ( n ) ] = 1 N [ F ] ∗ [ X F ( k ) ] [x(n)]=\frac{1}{N}[F]^*[X^F(k)] [x(n)]=N1[F][XF(k)]这里的 ∗ ^* 表示矩阵的共轭转置运算.可以注意到 ( 1 N [ F ] ∗ ) ( 1 N [ F ] ) = [ I N ] \left(\frac{1}{\sqrt{N}}[F]^*\right)\left(\frac{1}{\sqrt{N}}[F]\right)=[I_N] (N 1[F])(N 1[F])=[IN]其中 [ I N ] [I_N] [IN] N × N N\times N N×N单位矩阵.
对于DFT矩阵 [ F ] [F] [F],满足

  1. [ F ] [F] [F] N 2 N^2 N2个元素中,只有 N N N个不同的值.单位根构成了一个 N N N元循环群.
  2. [ F ] [F] [F]是对称的,即 [ F ] = [ F ] T [F]=[F]^T [F]=[F]T.
  3. [ F ] [F] [F]的每一行(列)都是一个基向量.
  4. 1 N [ F ] \frac{1}{N}[F] N1[F] 1 N [ F ] ∗ \frac{1}{N}[F]^* N1[F]是酉矩阵,即 [ F ] [ F ] ∗ = N [ I N ] [F][F]^*=N[I_N] [F][F]=N[IN], 则 [ F ] − 1 = 1 N [ F ] ∗ [F]^{-1}=\frac{1}{N}[F]^* [F]1=N1[F].
    对于IDFT矩阵 [ F ] ∗ [F]^* [F],满足同样的结论

1.4 DFT与IDFT的性质

  1. 线性性
    x 1 ( n ) ⇔ X 1 F ( k ) x_1(n)\Leftrightarrow X_1^F(k) x1(n)X1F(k) x 2 ( n ) ⇔ X 2 F ( k ) x_2(n)\Leftrightarrow X_2^F(k) x2(n)X2F(k), 则 [ a x 1 ( n ) + b x 2 ( n ) ] ⇔ [ a X 1 F ( k ) + b X 2 F ( k ) ] [ax_1(n)+bx_2(n)]\Leftrightarrow[aX_1^F(k)+bX_2^F(k)] [ax1(n)+bx2(n)][aX1F(k)+bX2F(k)] a , b a,b a,b均为常数.
  2. 复共轭定理
    对于 N N N点DFT,当 { X ( n ) } \{X(n)\} {X(n)}为实序列时,有 X F ( N 2 + k ) = [ X F ( N 2 − k ) ] ∗ , k = 0 , 1 , ⋯   , N 2 X^F\left(\frac{N}{2}+k\right)=\left[X^F\left(\frac{N}{2}-k\right)\right]^*,k=0,1,\cdots,\frac{N}{2} XF(2N+k)=[XF(2Nk)],k=0,1,,2N
  3. 帕斯瓦尔(Parseval)定理
    ∑ n = 0 N − 1 x ( n ) [ x ( n ) ] ∗ = 1 N ∑ k = 0 N − 1 X F ( k ) [ X F ( k ) ] ∗ \sum_{n=0}^{N-1}x(n)[x(n)]^*=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)[X^F(k)]^* n=0N1x(n)[x(n)]=N1k=0N1XF(k)[XF(k)]该定理对于所有的酉变换都成立.
  4. 循环移位
    x ( n ) ⇔ X F ( k ) x(n)\Leftrightarrow X^F(k) x(n)XF(k),则 x ( n + h ) ⇔ X F ( k ) W N − h k x(n+h)\Leftrightarrow X^F(k)W_N^{-hk} x(n+h)XF(k)WNhk { x ( n + h ) } \{x(n+h)\} {x(n+h)}表示序列 ( x h , x h + 1 , ⋯   , x N − 1 , x 0 , x 1 , ⋯   , x h − 1 ) (x_h,x_{h+1},\cdots,x_{N-1},x_0,x_1,\cdots,x_{h-1}) (xh,xh+1,,xN1,x0,x1,,xh1).
  5. 卷积定理
    对两个周期序列在时域/空域进行循环卷积相当于两者在DFT域相乘.令 x ( n ) x(n) x(n) y ( n ) y(n) y(n)为两个序列(实复皆可),则循环卷积 z c o n ( m ) = 1 N ∑ n = 0 N − 1 x ( n ) y ( m − n ) = x ( n ) ∗ y ( n ) , m = 0 , 1 , ⋯   , N − 1 z_{con}(m)=\frac{1}{N}\sum_{n=0}^{N-1}x(n)y(m-n)=x(n)*y(n),m=0,1,\cdots,N-1 zcon(m)=N1n=0N1x(n)y(mn)=x(n)y(n),m=0,1,,N1 x ( n ) ⇔ X F ( k ) , y ( n ) ⇔ Y F ( k ) , z c o n ( m ) ⇔ Z c o n F ( k ) x(n)\Leftrightarrow X^F(k),y(n)\Leftrightarrow Y^F(k),z_{con}(m)\Leftrightarrow Z_{con}^F(k) x(n)XF(k),y(n)YF(k),zcon(m)ZconF(k) Z c o n F ( k ) = 1 N X F ( k ) Y F ( k ) Z_{con}^F(k)=\frac{1}{N}X^F(k)Y^F(k) ZconF(k)=N1XF(k)YF(k)

2 快速傅里叶变换(FFT)和逆变换(IFFT)

2.1 r r r进制自然数和两种划分

任何一个自然数 n ( n ∈ N ∗ ) n(n\in N^*) n(nN)都有唯一的 r ( r ∈ N ∗ , r > 1 ) r(r\in N^*,r>1) r(rN,r>1)进制表示,满足 n = a 0 r 0 + a 1 r 1 + ⋯ + a s r s , s ∈ N ∗ , a j ∈ N ∗ , 0 ≤ a j < r , i = 0 , 1 , ⋯   , s n=a_0r^0+a_1r^1+\cdots+a_sr^s,s\in N^*,a_j\in N^*,0\le a_j<r,i=0,1,\cdots,s n=a0r0+a1r1++asrs,sN,ajN,0aj<r,i=0,1,,s则可记为 ( n ) 10 = ( a s a s − 1 ⋯ a 1 a 0 ) r (n)_{10}=(a_sa_{s-1}\cdots a_1a_0)_r (n)10=(asas1a1a0)r考虑自然数的 N = r m ( r , m ∈ N ∗ , r , m > 1 ) N=r^m(r,m\in N^*,r,m>1) N=rm(r,mN,r,m>1)元集 A N = { 0 , 1 , ⋯   , N − 1 } A_N=\{0,1,\cdots,N-1\} AN={0,1,,N1}有两种划分方式可以将其划分为 r r r个子集 B N [ j ] = { 0 + j N r , 1 + j N r , ⋯   , ( N r − 1 ) + j N r } B_N[j]=\{0+j\frac{N}{r},1+j\frac{N}{r},\cdots,(\frac{N}{r}-1)+j\frac{N}{r}\} BN[j]={0+jrN,1+jrN,,(rN1)+jrN} C N [ j ] = { j + 0 ⋅ r , j + 1 ⋅ r , ⋯   , j + ( N r − 1 ) r } C_N[j]=\{j+0\cdot r,j+1\cdot r,\cdots,j+(\frac{N}{r}-1)r\} CN[j]={j+0r,j+1r,,j+(rN1)r} j = 0 , 1 , ⋯   , r − 1 j=0,1,\cdots,r-1 j=0,1,,r1满足 ⋃ j = 0 r − 1 B N [ j ] = ⋃ j = 0 r − 1 C N [ j ] = A N \bigcup_{j=0}^{r-1}B_N[j]=\bigcup_{j=0}^{r-1}C_N[j]=A_N j=0r1BN[j]=j=0r1CN[j]=AN B N [ j ] ⋂ B N [ s ] = ∅ ,   C N [ j ] ⋂ C N [ s ] = ∅ ,   j ≠ s B_N[j]\bigcap B_N[s]=\emptyset,\ C_N[j]\bigcap C_N[s]=\emptyset,\ j\neq s BN[j]BN[s]=, CN[j]CN[s]=, j̸=s

2.2 基- r r rDIT-FFT/IFFT算法

对于一个 N = r m N=r^m N=rm个点的序列 { x ( n ) } \{x(n)\} {x(n)}.我们知道, 这 N N N个点可以划分成 r r r个互不相交的子列,并且每一个子列均有 N r = r m − 1 \frac{N}{r}=r^{m-1} rN=rm1个元素,对子列 { x j ( n ) } \{x_j(n)\} {xj(n)}
x j ( n ′ ) = x ( n ′ r + j ) = x ( n ) , n ′ = 0 , 1 , ⋯   , N r − 1 , j = 0 , 1 , ⋯   , r − 1 x_j(n')=x(n'r+j)=x(n),n'=0,1,\cdots,\frac{N}{r}-1,j=0,1,\cdots,r-1 xj(n)=x(nr+j)=x(n),n=0,1,,rN1,j=0,1,,r1这和自然数集 A N A_N AN的划分有着相似的思想.
k = k ′ + s N r , k ′ = 0 , 1 , ⋯   , N r − 1 , s = 0 , 1 , ⋯   , r − 1 k=k'+s\frac{N}{r},k'=0,1,\cdots,\frac{N}{r}-1,s=0,1,\cdots,r-1 k=k+srN,k=0,1,,rN1,s=0,1,,r1此时来考虑对于一个 N N N点序列的DFT X F ( k ) = ∑ n = 0 N − 1 x ( n ) W N k n = ∑ j = 0 r − 1 ∑ n ′ = 0 N r − 1 x j ( n ′ ) W N ( k ′ + s N r ) ( n ′ r + j ) = ∑ j = 0 r − 1 W N k j ∑ n ′ = 0 N r − 1 x j ( n ′ ) W N k ′ n ′ r + s n ′ N = ∑ j = 0 r − 1 W N k ′ j W r j s ∑ n ′ = 0 N r − 1 x j ( n ′ ) W N r k ′ n ′ k = 0 , 1 , ⋯   , N − 1 \begin{aligned}X^F(k)&=\sum_{n=0}^{N-1}x(n)W_N^{kn}\\&=\sum_{j=0}^{r-1}\sum_{n'=0}^{\frac{N}{r}-1}x_j(n')W_N^{(k'+s\frac{N}{r})(n'r+j)}\\&=\sum_{j=0}^{r-1}W_N^{kj}\sum_{n'=0}^{\frac{N}{r}-1}x_j(n')W_N^{k'n'r+sn'N}\\&=\sum_{j=0}^{r-1}W_N^{k'j}W_r^{js}\sum_{n'=0}^{\frac{N}{r}-1}x_j(n')W_{\frac{N}{r}}^{k'n'}\\k&=0,1,\cdots,N-1\end{aligned} XF(k)k=n=0N1x(n)WNkn=j=0r1n=0rN1xj(n)WN(k+srN)(nr+j)=j=0r1WNkjn=0rN1xj(n)WNknr+snN=j=0r1WNkjWrjsn=0rN1xj(n)WrNkn=0,1,,N1 ∑ n ′ = 0 N r − 1 x j ( n ′ ) W N r k ′ n ′ \sum_{n'=0}^{\frac{N}{r}-1}x_j(n')W_{\frac{N}{r}}^{k'n'} n=0rN1xj(n)WrNkn可以看做一个对于 N r \frac{N}{r} rN点子序列 { x j ( n ′ ) } \{x_j(n')\} {xj(n)}的DFT.
事实上,这里将求解 1 1 1 N N N点DFT问题转化为求解 r r r N r \frac{N}{r} rN点的DFT,再将得到的结果乘以相应的复系数再组合得解的问题.显而易见,这样处理缩小了求解DFT的规模(样点的个数 N N N即为问题的规模),而当 N = 1 N=1 N=1时,其DFT就是自身,不必再次划分.算法的有穷性得到了保证.正确性在推理过程中可以得到保证.同时,由于基选取的特殊性,导致某些子列点的DFT乘以某些复系数后再相加时可以将一次乘法与一次加法简化成一次加法,这是由单位根的性质所决定的.在普通意义下讨论时不考虑这种优化,这种优化可以在后文的实例讨论中看到.
在基- r r rDIT-FFT算法中划分数据点列对于 n n n采取了 C N [ j ] C_N[j] CN[j]的方式而对于 k k k采取了 B N [ s ] B_N[s] BN[s]的方式,对于 n n n来说采取了模 r r r的同余类划分,也就是说在每一个子数据点列中任意两个数据点的距离(称为抽样间隔)是不变的,也即频域分辨率不变.这就是时域抽取法(DIT)的由来.
对于逆变换基- r r rDIT-IFFT,同理 X j F ( k ′ ) = X F ( k ′ r + j ) = X F ( k ) , n = n ′ + s N r X^F_j(k')=X^F(k'r+j)=X^F(k),n=n'+s\frac{N}{r} XjF(k)=XF(kr+j)=XF(k),n=n+srN x ( n ) = 1 N ∑ k = 0 N − 1 X F ( k ) W N − n k = 1 N ∑ j = 0 r − 1 ∑ k ′ = 0 N r − 1 X j F ( k ′ ) W N − ( n ′ + s N r ) ( k ′ r + j ) = 1 N ∑ j = 0 r − 1 W N − n j ∑ k ′ = 0 N r − 1 X j F ( k ′ ) W N − n ′ k ′ r − s k ′ N = 1 r ∑ j = 0 r − 1 W N − n ′ j W r − j s r N ∑ k ′ = 0 N r − 1 X j F ( k ′ ) W N r − k ′ n ′ n = 0 , 1 , ⋯   , N − 1 \begin{aligned}x(n)&=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)W_N^{-nk}\\&=\frac{1}{N}\sum_{j=0}^{r-1}\sum_{k'=0}^{\frac{N}{r}-1}X_j^F(k')W_N^{-(n'+s\frac{N}{r})(k'r+j)}\\&=\frac{1}{N}\sum_{j=0}^{r-1}W_N^{-nj}\sum_{k'=0}^{\frac{N}{r}-1}X_j^F(k')W_N^{-n'k'r-sk'N}\\&=\frac{1}{r}\sum_{j=0}^{r-1}W_N^{-n'j}W_r^{-js}\frac{r}{N}\sum_{k'=0}^{\frac{N}{r}-1}X_j^F(k')W_{\frac{N}{r}}^{-k'n'}\\n&=0,1,\cdots,N-1\end{aligned} x(n)n=N1k=0N1XF(k)WNnk=N1j=0r1k=0rN1XjF(k)WN(n+srN)(kr+j)=N1j=0r1WNnjk=0rN1XjF(k)WNnkrskN=r1j=0r1WNnjWrjsNrk=0rN1XjF(k)WrNkn=0,1,,N1

2.3 基- r r rDIF-FFT/IFFT算法

接下来来讨论另外一种子数据点列的划分方式.对于一个 N = r m N=r^m N=rm个点的序列 { x ( n ) } \{x(n)\} {x(n)}.
我们知道, 这 N N N个点可以划分成 r r r个互不相交的子列,并且每一个子列均有 N r = r m − 1 \frac{N}{r}=r^{m-1} rN=rm1个元素,对子列 { x j ( n ′ ) } \{x_j(n')\} {xj(n)} x j ( n ′ ) = x ( n ′ + j N r ) = x ( n ) , n ′ = 0 , 1 , ⋯   , N r − 1 , j = 0 , 1 , ⋯   , r − 1 x_j(n')=x(n'+j\frac{N}{r})=x(n),n'=0,1,\cdots,\frac{N}{r}-1,j=0,1,\cdots,r-1 xj(n)=x(n+jrN)=x(n),n=0,1,,rN1,j=0,1,,r1此时选取的 n n n是按照连续 N r \frac{N}{r} rN个的形式来划分的.
k = k ′ r + s , k ′ = 0 , 1 , ⋯   , N r − 1 , s = 0 , 1 , ⋯   , r − 1 k=k'r+s,k'=0,1,\cdots,\frac{N}{r}-1,s=0,1,\cdots,r-1 k=kr+s,k=0,1,,rN1,s=0,1,,r1此时再来考虑对于一个 N N N点序列的DFT X F ( k ) = ∑ n = 0 N − 1 x ( n ) W N k n = ∑ n ′ = 0 N r − 1 ∑ j = 0 r − 1 x j ( n ′ ) W N ( k ′ r + s ) ( n ′ + j N r ) = ∑ n ′ = 0 N r − 1 W N ( k ′ r + s ) n ′ ∑ j = 0 r − 1 x j ( n ′ ) W N k ′ j N + s j N r X F ( k ′ r + s ) = ∑ n ′ = 0 N r − 1 ( W N s n ′ ∑ j = 0 r − 1 x j ( n ′ ) W r s j ) W N r k ′ n ′ k = 0 , 1 , ⋯   , N − 1 \begin{aligned}X^F(k)&=\sum_{n=0}^{N-1}x(n)W_N^{kn}\\&=\sum_{n'=0}^{\frac{N}{r}-1}\sum_{j=0}^{r-1}x_j(n')W_N^{(k'r+s)(n'+j\frac{N}{r})}\\&=\sum_{n'=0}^{\frac{N}{r}-1}W_N^{(k'r+s)n'}\sum_{j=0}^{r-1}x_j(n')W_N^{k'jN+sj\frac{N}{r}}\\X^F(k'r+s)&=\sum_{n'=0}^{\frac{N}{r}-1}\left(W_N^{sn'}\sum_{j=0}^{r-1}x_j(n')W_r^{sj}\right)W_{\frac{N}{r}}^{k'n'}\\k&=0,1,\cdots,N-1\end{aligned} XF(k)XF(kr+s)k=n=0N1x(n)WNkn=n=0rN1j=0r1xj(n)WN(kr+s)(n+jrN)=n=0rN1WN(kr+s)nj=0r1xj(n)WNkjN+sjrN=n=0rN1(WNsnj=0r1xj(n)Wrsj)WrNkn=0,1,,N1 X F ( k ′ r + s ) = ∑ n ′ = 0 N r − 1 ( W N s n ′ ∑ j = 0 r − 1 x j ( n ′ ) W r s j ) W N r k ′ n ′ X^F(k'r+s)=\sum_{n'=0}^{\frac{N}{r}-1}\left(W_N^{sn'}\sum_{j=0}^{r-1}x_j(n')W_r^{sj}\right)W_{\frac{N}{r}}^{k'n'} XF(kr+s)=n=0rN1(WNsnj=0r1xj(n)Wrsj)WrNkn意味着原 N N N点数据序列的DFT中的一个子列,可以看做是 1 1 1个经过原数据点乘以相应的复系数重新组合后的有 N r \frac{N}{r} rN的数据点序列的DFT.
同样地, 求解DFT的规模(样点的个数 N N N)得到了缩小,即将求解 1 1 1 N N N点DFT的问题转化为求解 r r r个将原数据点乘以相应的复系数组合后,对新的数据列求解 N r \frac{N}{r} rN点DFT的问题.而当 N = 1 N=1 N=1时,其DFT就是自身,不必再次划分.
在基- r r rDIF-FFT算法中划分数据点列对于 n n n采取了 B N [ j ] B_N[j] BN[j]的方式而对于 k k k采取了 C N [ s ] C_N[s] CN[s]的方式,对于 k k k来说采取了模 r r r的同余类划分.此时,时域分辨率保持不变,这就是频域抽取法(DIF)的由来.
由于引进了DFT的矩阵表示,这两种FFT的方法都有其对应的矩阵表示.利用矩阵分解也可以描述这两种算法优化,这里就不再展开了.算法的原理描述已经给出,具体流程图就不再给出.详细的流程可以在具体的应用实例中看到.为方便起见,后文的计算均采用DIT(时域抽取法).
对于逆变换基- r r rDIF-IFFT,同理 X j F ( k ′ ) = X F ( k ′ + j N r ) = X F ( k ) , n = n ′ r + s X^F_j(k')=X^F(k'+j\frac{N}{r})=X^F(k),n=n'r+s XjF(k)=XF(k+jrN)=XF(k),n=nr+s x ( n ) = 1 N ∑ k = 0 N − 1 X F ( k ) W N − n k = 1 N ∑ k ′ = 0 N r − 1 ∑ j = 0 r − 1 X j F ( k ′ ) W N − ( n ′ r + s ) ( k ′ + j N r ) = 1 N ∑ k ′ = 0 N r − 1 W N − ( n ′ r + s ) k ′ ∑ j = 0 r − 1 X j F ( k ′ ) W N − n ′ j N − s j N r x ( n ′ r + s ) = r N ∑ k ′ = 0 N r − 1 ( W N − s k ′ r ∑ j = 0 r − 1 X j F ( k ′ ) W r − s j ) W N r − n ′ k ′ k = 0 , 1 , ⋯   , N − 1 \begin{aligned}x(n)&=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)W_N^{-nk}\\&=\frac{1}{N}\sum_{k'=0}^{\frac{N}{r}-1}\sum_{j=0}^{r-1}X^F_j(k')W_N^{-(n'r+s)(k'+j\frac{N}{r})}\\&=\frac{1}{N}\sum_{k'=0}^{\frac{N}{r}-1}W_N^{-(n'r+s)k'}\sum_{j=0}^{r-1}X^F_j(k')W_N^{-n'jN-sj\frac{N}{r}}\\x(n'r+s)&=\frac{r}{N}\sum_{k'=0}^{\frac{N}{r}-1}\left(\frac{W_N^{-sk'}}{r}\sum_{j=0}^{r-1}X^F_j(k')W_r^{-sj}\right)W_{\frac{N}{r}}^{-n'k'}\\k&=0,1,\cdots,N-1\end{aligned} x(n)x(nr+s)k=N1k=0N1XF(k)WNnk=N1k=0rN1j=0r1XjF(k)WN(nr+s)(k+jrN)=N1k=0rN1WN(nr+s)kj=0r1XjF(k)WNnjNsjrN=Nrk=0rN1(rWNskj=0r1XjF(k)Wrsj)WrNnk=0,1,,N1

2.4 r r r进制下的逆序和程序实现

2.4.1 基 r r r-DIT-FFT与二进制下的逆序

(这一段真的没什么,输入序列需要进行反序)

2.4.2 基 2 2 2-DIT-FFT的程序实现

出于计算机实现的操作性,这里的程序选择的是基 2 2 2-FFT.下以 N = 8 N=8 N=8来展示算法的计算形式.用 a ( n ) a(n) a(n)表示上一层计算中第 n n n个位置上的结果,初始时 a ( n ) = x ( n ) a(n)=x(n) a(n)=x(n).需要注意的是,某些不必要的复数乘法直接改成了加减法.

位置编号 初始序列 第0层结果 第1层结果 第2层结果 最终结果
0 x(0) a(0)+a(1) a(0)+a(2) a(0)+a(4) X^F(0)
1 x(4) a(0)-a(1) a(1)+ W 4 1 W_4^1 W41a(3) a(1)+ W 8 1 W_8^1 W81a(5) X^F(1)
2 x(2) a(2)+a(3) a(0)-a(2) a(2)+ W 8 2 W_8^2 W82a(6) X^F(2)
3 x(6) a(2)-a(3) a(1)- W 4 1 W_4^1 W41a(3) a(3)+ W 8 3 W_8^3 W83a(7) X^F(3)
4 x(1) a(4)+a(5) a(4)+a(6) a(0)-a(4) X^F(4)
5 x(5) a(4)-a(5) a(5)+ W 4 1 W_4^1 W41a(7) a(1)- W 8 1 W_8^1 W81a(5) X^F(5)
6 x(3) a(6)+a(7) a(4)-a(6) a(2)- W 8 2 W_8^2 W82a(6) X^F(6)
7 x(7) a(6)-a(7) a(5)- W 4 1 W_4^1 W41a(7) a(3)- W 8 3 W_8^3 W83a(7) X^F(7)

对于基 2 2 2-IFFT,根据前文公式分析,需要修改 W N k n W_N^{kn} WNkn W N − k n W_N^{-kn} WNkn,有

位置编号 初始序列 第0层结果 第1层结果 第2层结果 最终结果
0 X^F(0) a(0)+a(1) a(0)+a(2) a(0)+a(4) x(0)
1 X^F(4) a(0)-a(1) a(1)+ W 4 − 1 W_4^{-1} W41a(3) a(1)+ W 8 − 1 W_8^{-1} W81a(5) x(1)
2 X^F(2) a(2)+a(3) a(0)-a(2) a(2)+ W 8 − 2 W_8^{-2} W82a(6) x(2)
3 X^F(6) a(2)-a(3) a(1)- W 4 − 1 W_4^{-1} W41a(3) a(3)+ W 8 − 3 W_8^{-3} W83a(7) x(3)
4 X^F(1) a(4)+a(5) a(4)+a(6) a(0)-a(4) x(4)
5 X^F(5) a(4)-a(5) a(5)+ W 4 − 1 W_4^{-1} W41a(7) a(1)- W 8 − 1 W_8^{-1} W81a(5) x(5)
6 X^F(3) a(6)+a(7) a(4)-a(6) a(2)- W 8 − 2 W_8^{-2} W82a(6) x(6)
7 X^F(7) a(6)-a(7) a(5)- W 4 − 1 W_4^{-1} W41a(7) a(3)- W 8 − 3 W_8^{-3} W83a(7) x(7)

为了更快一步, W N k n W_N^{kn} WNkn数据可以预处理出结果.
那么,我们有核心代码段如下,程序由C++语言给出.

\\complex表示自定义数据类型复数,支持复数加减乘法
void FFTcal(complex X[],int n,int m,int p)
\\表示输入数据列X[],数据点列长度n=2^m,p=1时为FFT,P=-1时为IFFT
{
    for(int i=0;i

详细的全部代码将在附录1中给出.

2.5 复杂度分析

2.5.1 主定理(Master Theorem)

递归方程 T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n) T ( 1 ) = 1 T(1)=1 T(1)=1的解分为三种情况.记 p = log ⁡ b a p=\log_ba p=logba, 则
情况1: f ( n ) = O ( n p − ϵ ) f(n)=O(n^{p-\epsilon}) f(n)=O(npϵ), 则 T ( n ) = Θ ( n p ) T(n)=\Theta(n^p) T(n)=Θ(np)
情况2: f ( n ) = O ( n p log ⁡ k n ) f(n)=O(n^p\log^kn) f(n)=O(nplogkn), 则 T ( n ) = Θ ( n p log ⁡ ( k + 1 ) n ) T(n)=\Theta(n^p\log^{(k+1)}n) T(n)=Θ(nplog(k+1)n)
情况3: f ( n ) = O ( n p + ϵ ) f(n)=O(n^{p+\epsilon}) f(n)=O(np+ϵ), 则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))
其中 ϵ > 0 \epsilon>0 ϵ>0,大 O O O记号 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n))表示函数 f ( n ) f(n) f(n)和函数 g ( n ) g(n) g(n)是同阶无穷大.

2.5.2 基- r r rDIT/DFT-FFT的复杂度

需要预处理 W N 1 , W N 2 , ⋯   , W N N − 1 W_N^1,W_N^2,\cdots,W_N^{N-1} WN1,WN2,,WNN1的值,其中 N = r , r 2 , ⋯   , r m N=r,r^2,\cdots,r^m N=r,r2,,rm.
对于一个规模为 N N N的数据( N N N点序列),经过 N ( r − 1 ) N(r-1) N(r1)次复数乘法和 N ( r − 1 ) N(r-1) N(r1)次复数加法将其转化为 r r r个规模为 N r \frac{N}{r} rN的子问题.设该算法求解一个规模为 N N N的数据( N N N点序列)的复杂度为 T ( N ) T(N) T(N),计算一次复数乘法或者加法的复杂度都视为一个常数,不妨设为 1 1 1,则 T ( N ) = r ∗ T ( N r ) + 2 ( r − 1 ) N T(N)=r*T(\frac{N}{r})+2(r-1)N T(N)=rT(rN)+2(r1)N T ( 1 ) = 1 T(1)=1 T(1)=1得到一个递归方程.根据主定理,可知 a = r , b = r , f ( N ) = 2 ( r − 1 ) N , p = log ⁡ b a = 1 a=r,b=r,f(N)=2(r-1)N,p=\log_ba=1 a=r,b=r,f(N)=2(r1)N,p=logba=1符合情况2,即 lim ⁡ N → ∞ 2 ( r − 1 ) N N 1 log ⁡ b 0 N = 2 ( r − 1 ) \lim_{N\to\infty}\frac{2(r-1)N}{N^1\log_b^0N}=2(r-1) NlimN1logb0N2(r1)N=2(r1)则基- r r rDIT-FFT算法的复杂度为 T ( N ) = Θ ( N log ⁡ N ) T(N)=\Theta(N\log N) T(N)=Θ(NlogN)主定理给出的复杂度只是一个数量级上估计.具体的计算复杂度一般是可以计算的.
实际上,对于一个初始有 N N N个点的序列,我们选取 r ( r > N ) r(r>N) r(r>N)的划分是没有意义的.因而 r r r的取值集合是 { 2 , 3 , ⋯   , N } \{2,3,\cdots,N\} {2,3,,N}当取 r = N r=N r=N时,符合主定理的情况1, 算法的复杂度为 Θ ( N 2 ) \Theta(N^2) Θ(N2),而事实上算法退化为直接进行DFT(直接矩阵乘法),需要进行 N 2 N^2 N2次复数加法和 N 2 N^2 N2次复数乘法.
对于一个初始有 N = r m ( m ∈ N ∗ , m > 1 ) N=r^m(m\in N^*,m>1) N=rm(mN,m>1)个样点的序列,普通情况下我们需要 N m Nm Nm次复数加法运算和 N m Nm Nm次复数乘法运算.复杂度可以认为是 2 N m 2Nm 2Nm.
同时,基的长度的选择和数据点的个数有关,例如当 N N N 2 2 2的幂(或者近似为 2 2 2的幂,通过增添少量的零来补齐长度)选择以 2 2 2为基是合适的;当 N N N 7 7 7的幂,选择以 7 7 7为基是更为合理的.如果 N N N为一个合数,还可以选择混合基,每一次划分(递归)根据当前数据点列的长度选择合适的基,例如求一个 12 12 12点的DFT,在第一层划分选择基- 3 3 3,将其分为求解3个 4 4 4点的DFT问题;第二层选择基- 2 2 2,能更快地求出答案.
IFFT的分析基本是平行的,这里不再赘述.

3 几个实例

在具体实例中,根据单位根的性质,存在一些具体的优化.下举若干例来说明.

3.1 基- 2 2 2DIT-FFT/IFFT

对于离散信号列 { x ( n ) } n = 0 2 N − 1 \{x(n)\}_{n=0}^{2^N-1} {x(n)}n=02N1, X F ( k ) = ∑ j = 0 1 W 2 N k ′ j W 2 j s ∑ n ′ = 0 2 N − 1 − 1 x j ( n ′ ) W 2 N − 1 k ′ n ′ k = 0 , 1 , ⋯   , 2 N − 1 \begin{aligned}X^F(k)&=\sum_{j=0}^1W_{2^N}^{k'j}W_2^{js}\sum_{n'=0}^{2^{N-1}-1}x_j(n')W_{2^{N-1}}^{k'n'}\\k&=0,1,\cdots,2^N-1\end{aligned} XF(k)k=j=01W2NkjW2jsn=02N11xj(n)W2N1kn=0,1,,2N1 X 0 F ( k ) = ∑ n = 0 2 N − 1 − 1 x 0 ( n ) W 2 N − 1 n k = ∑ n = 0 2 N − 1 − 1 x ( 2 n ) W 2 N − 1 n k X 1 F ( k ) = ∑ n = 0 2 N − 1 − 1 x 1 ( n ) W 2 N − 1 n k = ∑ n = 0 2 N − 1 − 1 x ( 2 n + 1 ) W 2 N − 1 n k k = 0 , 1 , ⋯   , 2 N − 1 − 1 \begin{aligned}X^F_0(k)&=\sum_{n=0}^{2^{N-1}-1}x_0(n)W_{2^{N-1}}^{nk}=\sum_{n=0}^{2^{N-1}-1}x(2n)W_{2^{N-1}}^{nk}\\X^F_1(k)&=\sum_{n=0}^{2^{N-1}-1}x_1(n)W_{2^{N-1}}^{nk}=\sum_{n=0}^{2^{N-1}-1}x(2n+1)W_{2^{N-1}}^{nk}\\k&=0,1,\cdots,2^{N-1}-1\end{aligned} X0F(k)X1F(k)k=n=02N11x0(n)W2N1nk=n=02N11x(2n)W2N1nk=n=02N11x1(n)W2N1nk=n=02N11x(2n+1)W2N1nk=0,1,,2N11 X F ( k ) = X 0 F ( k ) + W 2 N k X 1 F ( k ) X F ( k + 2 N ) = X 0 F ( k ) − W 2 N k X 1 F ( k ) k = 0 , 1 , ⋯   , 2 N − 1 − 1 \begin{aligned}X^F(k)&=X^F_0(k)+W_{2^N}^kX^F_1(k)\\X^F(k+2^N)&=X^F_0(k)-W_{2^N}^kX^F_1(k)\\k&=0,1,\cdots,2^{N-1}-1\end{aligned} XF(k)XF(k+2N)k=X0F(k)+W2NkX1F(k)=X0F(k)W2NkX1F(k)=0,1,,2N11IFFT则有 x 0 ( n ) = 1 2 N − 1 ∑ k = 0 2 N − 1 − 1 X 0 F ( k ) W 2 N − 1 − n k = 1 2 N − 1 ∑ k = 0 2 N − 1 − 1 X F ( 2 k ) W 2 N − 1 − n k x 1 ( n ) = 1 2 N − 1 ∑ k = 0 2 N − 1 − 1 X 1 F ( k ) W 2 N − 1 − n k = 1 2 N − 1 ∑ k = 0 2 N − 1 − 1 X F ( 2 k + 1 ) W 2 N − 1 − n k \begin{aligned}x_0(n)&=\frac{1}{2^{N-1}}\sum_{k=0}^{2^{N-1}-1}X^F_0(k)W_{2^{N-1}}^{-nk}=\frac{1}{2^{N-1}}\sum_{k=0}^{2^{N-1}-1}X^F(2k)W_{2^{N-1}}^{-nk}\\x_1(n)&=\frac{1}{2^{N-1}}\sum_{k=0}^{2^{N-1}-1}X^F_1(k)W_{2^{N-1}}^{-nk}=\frac{1}{2^{N-1}}\sum_{k=0}^{2^{N-1}-1}X^F(2k+1)W_{2^{N-1}}^{-nk}\end{aligned} x0(n)x1(n)=2N11k=02N11X0F(k)W2N1nk=2N11k=02N11XF(2k)W2N1nk=2N11k=02N11X1F(k)W2N1nk=2N11k=02N11XF(2k+1)W2N1nk x ( n ) = 1 2 [ x 0 ( n ) + W 2 N − n x 1 ( n ) ] x ( n + 2 N − 1 ) = 1 2 [ x 0 ( n ) − W 2 N − n x 1 ( n ) ] n = 0 , 1 , ⋯   , 2 N − 1 − 1 \begin{aligned}x(n)&=\frac{1}{2}\left[x_0(n)+W_{2^N}^{-n}x_1(n)\right]\\x(n+2^{N-1})&=\frac{1}{2}\left[x_0(n)-W_{2^N}^{-n}x_1(n)\right]\\n&=0,1,\cdots,2^{N-1}-1\end{aligned} x(n)x(n+2N1)n=21[x0(n)+W2Nnx1(n)]=21[x0(n)W2Nnx1(n)]=0,1,,2N11
在实际计算中需要注意到当 N = 2 N=2 N=2时可以将一次复数乘法与一次复数乘法简化成一次复数加法,即 W 2 1 = − 1 W_2^1=-1 W21=1因而完成一次 2 N 2^N 2N点FFT,需要完成的加法次数和乘法次数如下

N 加法次数 乘法次数
2 1 2^{1} 21=2 2 0
2 2 2^{2} 22=4 8 2
2 3 2^{3} 23=8 24 10
2 5 2^{5} 25=32 160 98
2 8 2^{8} 28=256 2048 1538
2 10 2^{10} 210=1024 10240 8194
2 13 2^{13} 213=8192 106496 90114
2 15 2^{15} 215=32768 491520 425986
2 18 2^{18} 218=262144 4718592 4194306
2 20 2^{20} 220=1048576 20971520 18874370
2 22 2^{22} 222=4194304 92274688 83886082
2 25 2^{25} 225=33554432 838860800 771751938
2 26 2^{26} 226=67108864 1744830464 1610612738
2 28 2^{28} 228=268435456 7516192768 6979321858
2 30 2^{30} 230=1073741824 32212254720 30064771074

下举几例来说明实际应用.

例1 给定信号 { n 2 } n = 1 2 3 \{n^2\}_{n=1}^{2^3} {n2}n=123,利用FFT和IFFT,研究信号的传输,并计算其复杂度.
这是一个直接应用的题目,通过分别手动计算和编程计算,可以得到以下结果

n/k x ( n ) x(n) x(n) X F ( k ) X^F(k) XF(k)
0 1 204 204 204
1 4 ( − 24 + 8 2 ) + ( 40 + 40 2 ) i ≈ − 12.686292 + 96.568542 i (-24+8\sqrt{2})+(40+40\sqrt{2})i\approx-12.686292+96.568542i (24+82 )+(40+402 )i12.686292+96.568542i
2 9 − 32 + 40 i -32+40i 32+40i
3 16 ( − 24 − 8 2 ) − ( 40 − 40 2 ) i ≈ − 35.313709 + 16.568542 i (-24-8\sqrt{2})-(40-40\sqrt{2})i\approx-35.313709+16.568542i (2482 )(40402 )i35.313709+16.568542i
4 25 − 36 -36 36
5 36 ( − 24 − 8 2 ) + ( 40 − 40 2 ) i ≈ − 35.313708 − 16.568542 i (-24-8\sqrt{2})+(40-40\sqrt{2})i\approx-35.313708-16.568542i (2482 )+(40402 )i35.31370816.568542i
6 49 − 32 − 40 i -32-40i 3240i
7 64 ( − 24 + 8 2 ) − ( 40 + 40 2 ) i ≈ − 12.686291 − 96.568542 i (-24+8\sqrt{2})-(40+40\sqrt{2})i\approx-12.686291-96.568542i (24+82 )(40+402 )i12.68629196.568542i

其中进行了 24 24 24次复数加法, 10 10 10次复数乘法.

例2 给定连续信号: y = 1000 sin ⁡ x 100 , − 300 ≤ x ≤ 300 y=1000\sin\frac{x}{100},-300\le x\le300 y=1000sin100x,300x300,采样点选取 [ − 300 , 300 ] [-300,300] [300,300]中的 2 50 2^{50} 250个等距点,利用FFT和IFFT研究信号的传输,并分析其复杂度.
如果采用DFT和IDFT直接进行矩阵乘法来计算的话,复杂度为 Θ ( N 2 ) \Theta(N^2) Θ(N2),而若用FFT,其复杂度为 Θ ( N log ⁡ N ) \Theta(N\log N) Θ(NlogN),则复杂度大约是原来的了 N log ⁡ N N 2 = log ⁡ N N = 50 2 50 ≈ 4.44 × 1 0 − 14 \frac{N\log N}{N^2}=\frac{\log N}{N}=\frac{50}{2^{50}}\approx4.44\times10^{-14} N2NlogN=NlogN=250504.44×1014可以看出FFT具有极其强大的简化力量.碍于数据量颇大而计算机器能力和时间有限,具体的计算结果不再给出.

例3 给定多项式: ( 1 ) ∑ n = 0 2 3 n 2 x n , ∑ n = 0 2 4 n x n (1)\sum_{n=0}^{2^3}n^2x^n,\sum_{n=0}^{2^4}nx^n (1)n=023n2xn,n=024nxn ( 2 ) ∑ n = 0 2 50 n 2 x n , ∑ n = 0 2 2 0 n x n (2)\sum_{n=0}^{2^{50}}n^2x^n,\sum_{n=0}^{2^20}nx^n (2)n=0250n2xn,n=0220nxn利用FFT和IFFT实现多项式相乘,并分析算法的复杂度
根据卷积定理,多项式乘法相当于对两个序列 { n 2 } n = 0 a 1 \{n^2\}_{n=0}^{a_1} {n2}n=0a1 { n } n = 0 a 2 \{n\}_{n=0}^{a_2} {n}n=0a2做循环卷积得到的结果,不足的高位补零.这个算法证明略去.那么利用FFT算法,分别对两个序列做一次FFT,然后将得到的FFT序列对应项相乘,在对新序列做一次IFFT即得到最终结果.核心代码段如下

    for(int i=0;i

对于问题(1),计算的结果如下 ( ∑ n = 0 2 3 n 2 x n ) ( ∑ n = 0 2 4 n x n ) = 1024 x 24 + 1744 x 23 + 2207 x 22 + 2458 x 21 + 2540 x 20 + 2494 x 19 + 2359 x 18 + 2172 x 17 + 1968 x 16 + 1764 x 15 + 1560 x 14 + 1356 x 13 + 1152 x 12 + 948 x 11 + 744 x 10 + 540 x 9 + 336 x 8 + 196 x 7 + 105 x 6 + 50 x 5 + 20 x 4 + 6 x 3 + x 2 \begin{aligned}&\left(\sum_{n=0}^{2^3}n^2x^n\right)\left(\sum_{n=0}^{2^4}nx^n\right)\\=&1024x^{24}+1744x^{23}+2207x^{22}+2458x^{21}+2540x^{20}+2494x^{19}\\+&2359x^{18}+2172x^{17}+1968x^{16}+1764x^{15}+1560x^{14}+1356x^{13}\\+&1152x^{12}+948x^{11}+744x^{10}+540x^{9}+336x^{8}+196x^{7}\\+&105x^{6}+50x^{5}+20x^{4}+6x^{3}+x^{2}\end{aligned} =+++n=023n2xnn=024nxn1024x24+1744x23+2207x22+2458x21+2540x20+2494x192359x18+2172x17+1968x16+1764x15+1560x14+1356x131152x12+948x11+744x10+540x9+336x8+196x7105x6+50x5+20x4+6x3+x2其中进行了 480 480 480次复数加法和 294 294 294次复数乘法.注意到这其实是 N = 2 5 N=2^5 N=25时复杂度的三倍,这时调用了两次FFT,调用了一次IFFT,并且每一次的数据数都为 n = 2 5 , 16 < 9 + 17 ≤ 32 n=2^5,16<9+17\le32 n=25,16<9+1732.实际上此时的计算复杂度,主要是两个序列长度和所影响的.
对于问题(2),计算的结果过于庞大,不方便字在作业中给出结果.但是可以给出复杂度的计算结果

序列1数据数 序列2数据数 实际计算序列长度 加法次数 乘法次数
2 1 2^{1} 21=2 2 1 2^{1} 21=2 2 2 2^{2} 22=4 24 6
2 1 2^{1} 21=2 2 2 2^{2} 22=4 2 3 2^{3} 23=8 72 30
2 3 2^{3} 23=8 2 3 2^{3} 23=8 2 4 2^{4} 24=16 192 102
2 4 2^{4} 24=16 2 4 2^{4} 24=16 2 5 2^{5} 25=32 480 294
2 7 2^{7} 27=128 2 10 2^{10} 210=1024 2 11 2^{11} 211=2048 67584 55302
2 10 2^{10} 210=1024 2 10 2^{10} 210=1024 2 11 2^{11} 211=2048 67584 55302
2 12 2^{12} 212=4096 2 12 2^{12} 212=4096 2 13 2^{13} 213=8192 319488 270342
2 15 2^{15} 215=32768 2 15 2^{15} 215=32768 2 16 2^{16} 216=65536 3145728 2752518
2 18 2^{18} 218=262144 2 18 2^{18} 218=262144 2 19 2^{19} 219=524288 29884416 26738694
2 20 2^{20} 220=1048576 2 20 2^{20} 220=1048576 2 21 2^{21} 221=2097152 132120576 119537670
2 25 2^{25} 225=33554432 2 25 2^{25} 225=33554432 2 26 2^{26} 226=67108864 5234491392 4831838214
2 28 2^{28} 228=268435456 2 28 2^{28} 228=268435456 2 29 2^{29} 229=536870912 46707769344 43486543878

3.2 基- 3 3 3DIT-FFT/IFFT

对于离散信号列 { x ( n ) } n = 0 3 N − 1 \{x(n)\}_{n=0}^{3^N-1} {x(n)}n=03N1, X F ( k ) = ∑ j = 0 2 W 3 N k ′ j W 3 j s ∑ n ′ = 0 3 N − 1 − 1 x j ( n ′ ) W 3 N − 1 k ′ n ′ k = 0 , 1 , ⋯   , 3 N − 1 \begin{aligned}X^F(k)&=\sum_{j=0}^2W_{3^N}^{k'j}W_3^{js}\sum_{n'=0}^{3^{N-1}-1}x_j(n')W_{3^{N-1}}^{k'n'}\\k&=0,1,\cdots,3^N-1\end{aligned} XF(k)k=j=02W3NkjW3jsn=03N11xj(n)W3N1kn=0,1,,3N1 X 0 F ( k ) = ∑ n = 0 3 N − 1 − 1 x 0 ( n ) W 3 N − 1 n k = ∑ n = 0 3 N − 1 − 1 x ( 3 n ) W 3 N − 1 n k X 1 F ( k ) = ∑ n = 0 3 N − 1 − 1 x 1 ( n ) W 3 N − 1 n k = ∑ n = 0 3 N − 1 − 1 x ( 3 n + 1 ) W 3 N − 1 n k X 2 F ( k ) = ∑ n = 0 3 N − 1 − 1 x 2 ( n ) W 3 N − 1 n k = ∑ n = 0 3 N − 1 − 1 x ( 3 n + 2 ) W 3 N − 1 n k k = 0 , 1 , ⋯   , 3 N − 1 − 1 \begin{aligned}X^F_0(k)&=\sum_{n=0}^{3^{N-1}-1}x_0(n)W_{3^{N-1}}^{nk}=\sum_{n=0}^{3^{N-1}-1}x(3n)W_{3^{N-1}}^{nk}\\X^F_1(k)&=\sum_{n=0}^{3^{N-1}-1}x_1(n)W_{3^{N-1}}^{nk}=\sum_{n=0}^{3^{N-1}-1}x(3n+1)W_{3^{N-1}}^{nk}\\X^F_2(k)&=\sum_{n=0}^{3^{N-1}-1}x_2(n)W_{3^{N-1}}^{nk}=\sum_{n=0}^{3^{N-1}-1}x(3n+2)W_{3^{N-1}}^{nk}\\k&=0,1,\cdots,3^{N-1}-1\end{aligned} X0F(k)X1F(k)X2F(k)k=n=03N11x0(n)W3N1nk=n=03N11x(3n)W3N1nk=n=03N11

你可能感兴趣的:(杂记)