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

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

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

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 &gt; 1 ) r(r\in N^*,r&gt;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 &lt; r , i = 0 , 1 , ⋯ &ThinSpace; , s n=a_0r^0+a_1r^1+\cdots+a_sr^s,s\in N^*,a_j\in N^*,0\le a_j&lt;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 &gt; 1 ) N=r^m(r,m\in N^*,r,m&gt;1) N=rm(r,mN,r,m>1)元集 A N = { 0 , 1 , ⋯ &ThinSpace; , 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 , ⋯ &ThinSpace; , ( 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 , ⋯ &ThinSpace; , 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 , ⋯ &ThinSpace; , 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 , ⋯ &ThinSpace; , N r − 1 , j = 0 , 1 , ⋯ &ThinSpace; , r − 1 x_j(n&#x27;)=x(n&#x27;r+j)=x(n),n&#x27;=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 , ⋯ &ThinSpace; , N r − 1 , s = 0 , 1 , ⋯ &ThinSpace; , r − 1 k=k&#x27;+s\frac{N}{r},k&#x27;=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 , ⋯ &ThinSpace; , N − 1 \begin{aligned}X^F(k)&amp;=\sum_{n=0}^{N-1}x(n)W_N^{kn}\\&amp;=\sum_{j=0}^{r-1}\sum_{n&#x27;=0}^{\frac{N}{r}-1}x_j(n&#x27;)W_N^{(k&#x27;+s\frac{N}{r})(n&#x27;r+j)}\\&amp;=\sum_{j=0}^{r-1}W_N^{kj}\sum_{n&#x27;=0}^{\frac{N}{r}-1}x_j(n&#x27;)W_N^{k&#x27;n&#x27;r+sn&#x27;N}\\&amp;=\sum_{j=0}^{r-1}W_N^{k&#x27;j}W_r^{js}\sum_{n&#x27;=0}^{\frac{N}{r}-1}x_j(n&#x27;)W_{\frac{N}{r}}^{k&#x27;n&#x27;}\\k&amp;=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&#x27;=0}^{\frac{N}{r}-1}x_j(n&#x27;)W_{\frac{N}{r}}^{k&#x27;n&#x27;} n=0rN1xj(n)WrNkn可以看做一个对于 N r \frac{N}{r} rN点子序列 { x j ( n ′ ) } \{x_j(n&#x27;)\} {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&#x27;)=X^F(k&#x27;r+j)=X^F(k),n=n&#x27;+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 , ⋯ &ThinSpace; , N − 1 \begin{aligned}x(n)&amp;=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)W_N^{-nk}\\&amp;=\frac{1}{N}\sum_{j=0}^{r-1}\sum_{k&#x27;=0}^{\frac{N}{r}-1}X_j^F(k&#x27;)W_N^{-(n&#x27;+s\frac{N}{r})(k&#x27;r+j)}\\&amp;=\frac{1}{N}\sum_{j=0}^{r-1}W_N^{-nj}\sum_{k&#x27;=0}^{\frac{N}{r}-1}X_j^F(k&#x27;)W_N^{-n&#x27;k&#x27;r-sk&#x27;N}\\&amp;=\frac{1}{r}\sum_{j=0}^{r-1}W_N^{-n&#x27;j}W_r^{-js}\frac{r}{N}\sum_{k&#x27;=0}^{\frac{N}{r}-1}X_j^F(k&#x27;)W_{\frac{N}{r}}^{-k&#x27;n&#x27;}\\n&amp;=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&#x27;)\} {xj(n)} x j ( n ′ ) = x ( n ′ + j N r ) = x ( n ) , n ′ = 0 , 1 , ⋯ &ThinSpace; , N r − 1 , j = 0 , 1 , ⋯ &ThinSpace; , r − 1 x_j(n&#x27;)=x(n&#x27;+j\frac{N}{r})=x(n),n&#x27;=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 , ⋯ &ThinSpace; , N r − 1 , s = 0 , 1 , ⋯ &ThinSpace; , r − 1 k=k&#x27;r+s,k&#x27;=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 , ⋯ &ThinSpace; , N − 1 \begin{aligned}X^F(k)&amp;=\sum_{n=0}^{N-1}x(n)W_N^{kn}\\&amp;=\sum_{n&#x27;=0}^{\frac{N}{r}-1}\sum_{j=0}^{r-1}x_j(n&#x27;)W_N^{(k&#x27;r+s)(n&#x27;+j\frac{N}{r})}\\&amp;=\sum_{n&#x27;=0}^{\frac{N}{r}-1}W_N^{(k&#x27;r+s)n&#x27;}\sum_{j=0}^{r-1}x_j(n&#x27;)W_N^{k&#x27;jN+sj\frac{N}{r}}\\X^F(k&#x27;r+s)&amp;=\sum_{n&#x27;=0}^{\frac{N}{r}-1}\left(W_N^{sn&#x27;}\sum_{j=0}^{r-1}x_j(n&#x27;)W_r^{sj}\right)W_{\frac{N}{r}}^{k&#x27;n&#x27;}\\k&amp;=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&#x27;r+s)=\sum_{n&#x27;=0}^{\frac{N}{r}-1}\left(W_N^{sn&#x27;}\sum_{j=0}^{r-1}x_j(n&#x27;)W_r^{sj}\right)W_{\frac{N}{r}}^{k&#x27;n&#x27;} 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&#x27;)=X^F(k&#x27;+j\frac{N}{r})=X^F(k),n=n&#x27;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 , ⋯ &ThinSpace; , N − 1 \begin{aligned}x(n)&amp;=\frac{1}{N}\sum_{k=0}^{N-1}X^F(k)W_N^{-nk}\\&amp;=\frac{1}{N}\sum_{k&#x27;=0}^{\frac{N}{r}-1}\sum_{j=0}^{r-1}X^F_j(k&#x27;)W_N^{-(n&#x27;r+s)(k&#x27;+j\frac{N}{r})}\\&amp;=\frac{1}{N}\sum_{k&#x27;=0}^{\frac{N}{r}-1}W_N^{-(n&#x27;r+s)k&#x27;}\sum_{j=0}^{r-1}X^F_j(k&#x27;)W_N^{-n&#x27;jN-sj\frac{N}{r}}\\x(n&#x27;r+s)&amp;=\frac{r}{N}\sum_{k&#x27;=0}^{\frac{N}{r}-1}\left(\frac{W_N^{-sk&#x27;}}{r}\sum_{j=0}^{r-1}X^F_j(k&#x27;)W_r^{-sj}\right)W_{\frac{N}{r}}^{-n&#x27;k&#x27;}\\k&amp;=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层结果最终结果
0x(0)a(0)+a(1)a(0)+a(2)a(0)+a(4)X^F(0)
1x(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)
2x(2)a(2)+a(3)a(0)-a(2)a(2)+ W 8 2 W_8^2 W82a(6)X^F(2)
3x(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)
4x(1)a(4)+a(5)a(4)+a(6)a(0)-a(4)X^F(4)
5x(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)
6x(3)a(6)+a(7)a(4)-a(6)a(2)- W 8 2 W_8^2 W82a(6)X^F(6)
7x(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层结果最终结果
0X^F(0)a(0)+a(1)a(0)+a(2)a(0)+a(4)x(0)
1X^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)
2X^F(2)a(2)+a(3)a(0)-a(2)a(2)+ W 8 − 2 W_8^{-2} W82a(6)x(2)
3X^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)
4X^F(1)a(4)+a(5)a(4)+a(6)a(0)-a(4)x(4)
5X^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)
6X^F(3)a(6)+a(7)a(4)-a(6)a(2)- W 8 − 2 W_8^{-2} W82a(6)x(6)
7X^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<n;i++) Y[i]=X[h[i]];
    \\进行逆二进制序变换,h[i]表示实现处理好的逆二进制序下第i个数 
    for(int t=0;t<m;t++)
    {
        for(int i=0;i<n;i+=(1<<(t+1)))
        {
            for(int j=0;j<(1<<t);j++)
            if(j&&t)\\函数epq(a,b)返回复数W^(a\b)
            {
                X[i+j]=Y[i+j]+epq(p*j,1<<(t+1))*Y[i+j+(1<<t)];
                X[i+j+(1<<t)]=Y[i+j]-epq(p*j,1<<(t+1))*Y[i+j+(1<<t)];
            }
            else\\用来简化不必要的复数乘法运算
            {
                X[i+j]=Y[i+j]+Y[i+j+(1<<t)];
                X[i+j+(1<<t)]=Y[i+j]-Y[i+j+(1<<t)];
            }                
        }
        for(int i=0;i<n;i++) Y[i]=X[i];
    }  
    if(!(~p)) for(int i=0;i<n;i++) X[i]=X[i]/n;\\IFFT的缩放
    return;
}

\\调用FFT
FFTcal(X,n,m,1)
\\调用IFFT
FFTcal(X,n,m,-1)

详细的全部代码将在附录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))
其中 ϵ &gt; 0 \epsilon&gt;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 , ⋯ &ThinSpace; , W N N − 1 W_N^1,W_N^2,\cdots,W_N^{N-1} WN1,WN2,,WNN1的值,其中 N = r , r 2 , ⋯ &ThinSpace; , 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 &gt; N ) r(r&gt;N) r(r>N)的划分是没有意义的.因而 r r r的取值集合是 { 2 , 3 , ⋯ &ThinSpace; , 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 &gt; 1 ) N=r^m(m\in N^*,m&gt;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 , ⋯ &ThinSpace; , 2 N − 1 \begin{aligned}X^F(k)&amp;=\sum_{j=0}^1W_{2^N}^{k&#x27;j}W_2^{js}\sum_{n&#x27;=0}^{2^{N-1}-1}x_j(n&#x27;)W_{2^{N-1}}^{k&#x27;n&#x27;}\\k&amp;=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 , ⋯ &ThinSpace; , 2 N − 1 − 1 \begin{aligned}X^F_0(k)&amp;=\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)&amp;=\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&amp;=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 , ⋯ &ThinSpace; , 2 N − 1 − 1 \begin{aligned}X^F(k)&amp;=X^F_0(k)+W_{2^N}^kX^F_1(k)\\X^F(k+2^N)&amp;=X^F_0(k)-W_{2^N}^kX^F_1(k)\\k&amp;=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)&amp;=\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)&amp;=\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 , ⋯ &ThinSpace; , 2 N − 1 − 1 \begin{aligned}x(n)&amp;=\frac{1}{2}\left[x_0(n)+W_{2^N}^{-n}x_1(n)\right]\\x(n+2^{N-1})&amp;=\frac{1}{2}\left[x_0(n)-W_{2^N}^{-n}x_1(n)\right]\\n&amp;=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=220
2 2 2^{2} 22=482
2 3 2^{3} 23=82410
2 5 2^{5} 25=3216098
2 8 2^{8} 28=25620481538
2 10 2^{10} 210=1024102408194
2 13 2^{13} 213=819210649690114
2 15 2^{15} 215=32768491520425986
2 18 2^{18} 218=26214447185924194306
2 20 2^{20} 220=10485762097152018874370
2 22 2^{22} 222=41943049227468883886082
2 25 2^{25} 225=33554432838860800771751938
2 26 2^{26} 226=6710886417448304641610612738
2 28 2^{28} 228=26843545675161927686979321858
2 30 2^{30} 230=10737418243221225472030064771074

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

例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)
01 204 204 204
14 ( − 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
29 − 32 + 40 i -32+40i 32+40i
316 ( − 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
425 − 36 -36 36
536 ( − 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
649 − 32 − 40 i -32-40i 3240i
764 ( − 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<na;i++) X[i].set(1.0*i*i,0);
    for(int i=0;i<nb;i++) Z[i].set(1.0*i,0);
    n=na+nb-1;
    init();
    FFTcal(X,n,m,1);
    FFTcal(Z,n,m,1);
    for(int i=0;i<n;i++) X[i]=X[i]*Z[i];
    FFTcal(X,n,m,-1);

对于问题(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}&amp;\left(\sum_{n=0}^{2^3}n^2x^n\right)\left(\sum_{n=0}^{2^4}nx^n\right)\\=&amp;1024x^{24}+1744x^{23}+2207x^{22}+2458x^{21}+2540x^{20}+2494x^{19}\\+&amp;2359x^{18}+2172x^{17}+1968x^{16}+1764x^{15}+1560x^{14}+1356x^{13}\\+&amp;1152x^{12}+948x^{11}+744x^{10}+540x^{9}+336x^{8}+196x^{7}\\+&amp;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 &lt; 9 + 17 ≤ 32 n=2^5,16&lt;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=4246
2 1 2^{1} 21=2 2 2 2^{2} 22=4 2 3 2^{3} 23=87230
2 3 2^{3} 23=8 2 3 2^{3} 23=8 2 4 2^{4} 24=16192102
2 4 2^{4} 24=16 2 4 2^{4} 24=16 2 5 2^{5} 25=32480294
2 7 2^{7} 27=128 2 10 2^{10} 210=1024 2 11 2^{11} 211=20486758455302
2 10 2^{10} 210=1024 2 10 2^{10} 210=1024 2 11 2^{11} 211=20486758455302
2 12 2^{12} 212=4096 2 12 2^{12} 212=4096 2 13 2^{13} 213=8192319488270342
2 15 2^{15} 215=32768 2 15 2^{15} 215=32768 2 16 2^{16} 216=6553631457282752518
2 18 2^{18} 218=262144 2 18 2^{18} 218=262144 2 19 2^{19} 219=5242882988441626738694
2 20 2^{20} 220=1048576 2 20 2^{20} 220=1048576 2 21 2^{21} 221=2097152132120576119537670
2 25 2^{25} 225=33554432 2 25 2^{25} 225=33554432 2 26 2^{26} 226=6710886452344913924831838214
2 28 2^{28} 228=268435456 2 28 2^{28} 228=268435456 2 29 2^{29} 229=5368709124670776934443486543878

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 , ⋯ &ThinSpace; , 3 N − 1 \begin{aligned}X^F(k)&amp;=\sum_{j=0}^2W_{3^N}^{k&#x27;j}W_3^{js}\sum_{n&#x27;=0}^{3^{N-1}-1}x_j(n&#x27;)W_{3^{N-1}}^{k&#x27;n&#x27;}\\k&amp;=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 , ⋯ &ThinSpace; , 3 N − 1 − 1 \begin{aligned}X^F_0(k)&amp;=\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)&amp;=\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)&amp;=\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&amp;=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=03N11x1(n)W3N1nk=n=03N11x(3n+1)W3N1nk=n=03N11x2(n)W3N1nk=n=03N11x(3n+2)W3N1nk=0,1,,3N11 X F ( k ) = X 0 F ( k ) + W 3 N k X 1 F ( k ) + W 3 N 2 k X 2 F ( k ) X F ( k + 3 N − 1 ) = X 0 F ( k ) + W 3 1 W 3 N k X 1 F ( k ) + W 3 2 W 3 N 2 k X 2 F ( k ) X F ( k + 2 ⋅ 3 N − 1 ) = X 0 F ( k ) + W 3 2 W 3 N k X 1 F ( k ) + W 3 1 W 3 N 2 k X 2 F ( k ) k = 0 , 1 , ⋯ &ThinSpace; , 3 N − 1 − 1 \begin{aligned}X^F(k)&amp;=X^F_0(k)+W_{3^N}^kX^F_1(k)+W_{3^N}^{2k}X^F_2(k)\\X^F(k+3^{N-1})&amp;=X^F_0(k)+W_3^1W_{3^N}^kX^F_1(k)+W_3^2W_{3^N}^{2k}X^F_2(k)\\X^F(k+2\cdot3^{N-1})&amp;=X^F_0(k)+W_3^2W_{3^N}^kX^F_1(k)+W_3^1W_{3^N}^{2k}X^F_2(k)\\k&amp;=0,1,\cdots,3^{N-1}-1\end{aligned} XF(k)XF(k+3N1)XF(k+23N1)k=X0F(k)+W3NkX1F(k)+W3N2kX2F(k)=X0F(k)+W31W3NkX1F(k)+W32W3N2kX2F(k)=X0F(k)+W32W3NkX1F(k)+W31W3N2kX2F(k)=0,1,,3N11IFFT x 0 ( n ) = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X 0 F ( k ) W 3 N − 1 − n k = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X F ( 3 k ) W 3 N − 1 − n k x 1 ( n ) = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X 1 F ( k ) W 3 N − 1 − n k = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X F ( 3 k + 1 ) W 3 N − 1 − n k x 2 ( n ) = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X 2 F ( k ) W 3 N − 1 − n k = 1 3 N − 1 ∑ k = 0 3 N − 1 − 1 X F ( 3 k + 2 ) W 3 N − 1 − n k \begin{aligned}x_0(n)&amp;=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F_0(k)W_{3^{N-1}}^{-nk}=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F(3k)W_{3^{N-1}}^{-nk}\\x_1(n)&amp;=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F_1(k)W_{3^{N-1}}^{-nk}=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F(3k+1)W_{3^{N-1}}^{-nk}\\x_2(n)&amp;=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F_2(k)W_{3^{N-1}}^{-nk}=\frac{1}{3^{N-1}}\sum_{k=0}^{3^{N-1}-1}X^F(3k+2)W_{3^{N-1}}^{-nk}\end{aligned} x0(n)x1(n)x2(n)=3N11k=03N11X0F(k)W3N1nk=3N11k=03N11XF(3k)W3N1nk=3N11k=03N11X1F(k)W3N1nk=3N11k=03N11XF(3k+1)W3N1nk=3N11k=03N11X2F(k)W3N1nk=3N11k=03N11XF(3k+2)W3N1nk x ( n ) = 1 3 [ x 0 ( n ) + W 3 N − n x 1 ( n ) + W 3 N − 2 n x 2 ( n ) ] x ( n + 3 N − 1 ) = 1 3 [ x 0 ( n ) + W 3 2 W 3 N − n x 1 ( n ) + W 3 1 W 3 N − 2 n x 2 ( n ) ] x ( n + 2 ⋅ 3 N − 1 ) = 1 3 [ x 0 ( n ) + W 3 1 W 3 N − n x 1 ( n ) + W 3 2 W 3 N − 2 n x 2 ( n ) ] n = 0 , 1 , ⋯ &ThinSpace; , 3 N − 1 − 1 \begin{aligned}x(n)&amp;=\frac{1}{3}\left[x_0(n)+W_{3^N}^{-n}x_1(n)+W_{3^N}^{-2n}x_2(n)\right]\\x(n+3^{N-1})&amp;=\frac{1}{3}\left[x_0(n)+W_3^2W_{3^N}^{-n}x_1(n)+W_3^1W_{3^N}^{-2n}x_2(n)\right]\\x(n+2\cdot3^{N-1})&amp;=\frac{1}{3}\left[x_0(n)+W_3^1W_{3^N}^{-n}x_1(n)+W_3^2W_{3^N}^{-2n}x_2(n)\right]\\n&amp;=0,1,\cdots,3^{N-1}-1\end{aligned} x(n)x(n+3N1)x(n+23N1)n=31[x0(n)+W3Nnx1(n)+W3N2nx2(n)]=31[x0(n)+W32W3Nnx1(n)+W31W3N2nx2(n)]=31[x0(n)+W31W3Nnx1(n)+W32W3N2nx2(n)]=0,1,,3N11复杂度如下表所示

N加法次数乘法次数
3 1 3^{1} 31=364
3 2 3^{2} 32=93628
3 3 3^{3} 33=27162136
3 6 3^{6} 36=72987488020
3 10 3^{10} 310=5904911809801121932
3 12 3^{12} 312=5314411275458412223144
3 15 3^{15} 315=14348907430467210416118304
3 18 3^{18} 318=3874204891394713760413559717116
3 19 3^{19} 319=11622614674416593574643003674280

3.3 基- 7 7 7DIT-FFT/IFFT

对于离散信号列 { x ( n ) } n = 0 7 N − 1 \{x(n)\}_{n=0}^{7^N-1} {x(n)}n=07N1, X F ( k ) = ∑ j = 0 6 W 7 N k ′ j W 7 j s ∑ n ′ = 0 7 N − 1 − 1 x j ( n ′ ) W 7 N − 1 k ′ n ′ X^F(k)=\sum_{j=0}^6W_{7^N}^{k&#x27;j}W_7^{js}\sum_{n&#x27;=0}^{7^{N-1}-1}x_j(n&#x27;)W_{7^{N-1}}^{k&#x27;n&#x27;} XF(k)=j=06W7NkjW7jsn=07N11xj(n)W7N1kn k = 0 , 1 , ⋯ &ThinSpace; , 7 N − 1 k=0,1,\cdots,7^N-1 k=0,1,,7N1 X j F ( k ) = ∑ n = 0 7 N − 1 − 1 x j ( n ) W 7 N − 1 n k = ∑ n = 0 7 N − 1 − 1 x ( 7 n + j ) W 7 N − 1 n k X^F_j(k)=\sum_{n=0}^{7^{N-1}-1}x_j(n)W_{7^{N-1}}^{nk}=\sum_{n=0}^{7^{N-1}-1}x(7n+j)W_{7^{N-1}}^{nk} XjF(k)=n=07N11xj(n)W7N1nk=n=07N11x(7n+j)W7N1nk k = 0 , 1 , ⋯ &ThinSpace; , 7 N − 1 − 1 ,   j = 0 , 1 , ⋯ &ThinSpace; , 6 k=0,1,\cdots,7^{N-1}-1,\ j=0,1,\cdots,6 k=0,1,,7N11, j=0,1,,6 X F ( k + s ⋅ 7 N − 1 ) = ∑ j = 0 6 W 7 j s W 7 N k j X j F ( k ) = ∑ j = 0 6 W 7 N ( k + s ⋅ 7 N − 1 ) j X j F ( k ) X^F(k+s\cdot7^{N-1})=\sum_{j=0}^6W_7^{js}W_{7^N}^{kj}X^F_j(k)=\sum_{j=0}^6W_{7^N}^{(k+s\cdot7^{N-1})j}X^F_j(k) XF(k+s7N1)=j=06W7jsW7NkjXjF(k)=j=06W7N(k+s7N1)jXjF(k) k = 0 , 1 , ⋯ &ThinSpace; , 7 N − 1 − 1 , s = 0 , 1 , ⋯ &ThinSpace; , 6 k=0,1,\cdots,7^{N-1}-1,s=0,1,\cdots,6 k=0,1,,7N11,s=0,1,,6IFFT x j ( n ) = 1 7 N − 1 ∑ k = 0 7 N − 1 − 1 X j F ( k ) W 7 N − 1 − n k = 1 7 N − 1 ∑ k = 0 7 N − 1 − 1 X F ( 7 k + j ) W 7 N − 1 − n k x_j(n)=\frac{1}{7^{N-1}}\sum_{k=0}^{7^{N-1}-1}X^F_j(k)W_{7^{N-1}}^{-nk}=\frac{1}{7^{N-1}}\sum_{k=0}^{7^{N-1}-1}X^F(7k+j)W_{7^{N-1}}^{-nk} xj(n)=7N11k=07N11XjF(k)W7N1nk=7N11k=07N11XF(7k+j)W7N1nk x ( n + s ⋅ 7 N − 1 ) = 1 7 ∑ j = 0 6 W 7 − j s W 7 N − j n x j ( n ) = 1 7 ∑ j = 0 6 W 7 N − ( n + s ⋅ 7 N − 1 ) j x j ( n ) x(n+s\cdot7^{N-1})=\frac{1}{7}\sum_{j=0}^6W_7^{-js}W_{7^N}^{-jn}x_j(n)=\frac{1}{7}\sum_{j=0}^6W_{7^N}^{-(n+s\cdot7^{N-1})j}x_j(n) x(n+s7N1)=71j=06W7jsW7Njnxj(n)=71j=06W7N(n+s7N1)jxj(n) n = 0 , 1 , ⋯ &ThinSpace; , 7 N − 1 − 1 ,   s = 0 , 1 , ⋯ &ThinSpace; , 6 n=0,1,\cdots,7^{N-1}-1,\ s=0,1,\cdots,6 n=0,1,,7N11, s=0,1,,6其复杂度如下表

N加法次数乘法次数
7 1 7^{1} 71=74236
7 2 7^{2} 72=49588540
7 3 7^{3} 73=34361745832
7 4 7^{4} 74=24015762455224
7 5 7^{5} 75=16807504210487404
7 6 7^{6} 76=11764942353644117716
7 7 7^{7} 77=8235433458880633765264
7 8 7^{8} 78=5764801276710448270945648
7 9 7^{9} 79=4035360721790947782138741172
7 10 7^{10} 710=2824752491694851494016666039692
7 11 7^{11} 711=1977326743130503565038128526238296

3.4 N点FFT

对于离散信号列 { x ( n ) } n = 0 N \{x(n)\}_{n=0}^N {x(n)}n=0N,FFT的算法是多种多样的,在这里给出两种分析方法.
分析1 基于质因数分解的FFT
自然数的质因数分解具有唯一形式.记 N = p 1 a 1 p 2 a 2 ⋯ p d a d N=p_1^{a_1}p_2^{a_2}\cdots p_d^{a_d} N=p1a1p2a2pdad.那么在每一层的计算中可以采取不同的基,层层分解然后得到最终结果.以 N = 12 N=12 N=12为例,有如下的划分
{ x ( 0 ) , x ( 1 ) , ⋯ &ThinSpace; , x ( 11 ) } = { { x ( 0 ) , x ( 3 ) , x ( 6 ) , x ( 9 ) } { { x ( 0 ) , x ( 6 ) } { x ( 3 ) , x ( 9 ) } { x ( 1 ) , x ( 4 ) , x ( 7 ) , x ( 10 ) } { { x ( 1 ) , x ( 7 ) } { x ( 4 ) , x ( 10 ) } { x ( 2 ) , x ( 5 ) , x ( 8 ) , x ( 11 ) } { { x ( 2 ) , x ( 8 ) } { x ( 5 ) , x ( 11 ) } \{x(0),x(1),\cdots,x(11)\}=\begin{cases}\{x(0),x(3),x(6),x(9)\}\begin{cases}\{x(0),x(6)\}\\\{x(3),x(9)\}\end{cases}\\\{x(1),x(4),x(7),x(10)\}\begin{cases}\{x(1),x(7)\}\\\{x(4),x(10)\}\end{cases}\\\{x(2),x(5),x(8),x(11)\}\begin{cases}\{x(2),x(8)\}\\\{x(5),x(11)\}\end{cases}\end{cases} {x(0),x(1),,x(11)}={x(0),x(3),x(6),x(9)}{{x(0),x(6)}{x(3),x(9)}{x(1),x(4),x(7),x(10)}{{x(1),x(7)}{x(4),x(10)}{x(2),x(5),x(8),x(11)}{{x(2),x(8)}{x(5),x(11)} N N N的素因子的幂的次数较高时这种分解方法可行.例如当 N = 2 a 1 3 a 2 N=2^{a_1}3^{a_2} N=2a13a2,其中 a 1 a_1 a1 a 2 a_2 a2都有比较客观的取值时这种处理较优.但是,在某些情况下这样的做法是不明智的.例如当 N N N是一个素数,或者是很少个数素数的乘积,采取这种方法的算法会有比较严重的退化,未必会有很好的效果.不妨另作考虑.

分析2 强制补零的基- 2 2 2-FFT
一定存在一个 m , m ∈ N ∗ , m &gt; 1 m,m\in N^*,m&gt;1 m,mN,m>1使得 2 m − 1 &lt; N ≤ 2 m 2^{m-1}&lt;N\le2^m 2m1<N2m,则在序列 { x ( n ) } \{x(n)\} {x(n)}的末尾补零,得到一个新的序列,对这个序列进行基- 2 2 2-FFT,进行FFT变换.需要注意的是,补零的个数不会超过原序列的长度 N N N;此时的FFT的结果与原序列FFT的结果是不一样的.虽然这改变了FFT直接运算的结果,但是考虑到FFT变换的稀疏性和实际在工程领域中的应用,通过增添和原数据列长度相比很有限的零,可以大大减小DFT的时间复杂度,得到的结果经过适当的压缩,传输的数据量大大减少,而再解压后与原数据列的差异并不大这一事实,可以知道补零再变换的处理方法在实际应用中是有意义的.仍可以认为其复杂度为 Θ ( N log ⁡ N ) \Theta(N\log N) Θ(NlogN).

4 分段光滑函数 f ( x ) f(x) f(x)的展开周期

这类问题需要合理补充 f ( x ) f(x) f(x)的定义,下面举例说明.

例1 f ( x ) f(x) f(x)为定义在 [ a , b ) [a,b) [a,b) ( a , b ] (a,b] (a,b]的分段光滑函数,可以以 2 l = b − a 2l=b-a 2l=ba为周期展开.
f ( x ) f(x) f(x)可以在 R R R上以 2 l 2l 2l为周期延拓成函数而不产生任何矛盾,则其可以展成傅里叶级数,即 f ( x − 0 ) + f ( x + 0 ) 2 = a 0 2 + ∑ n = 1 ∞ ( a n cos ⁡ n π x l + b n sin ⁡ n π x l ) , x ∈ R \frac{f(x-0)+f(x+0)}{2}=\frac{a_0}{2}+\sum_{n=1}^\infty(a_n\cos\frac{n\pi x}{l}+b_n\sin\frac{n\pi x}{l}),x\in R 2f(x0)+f(x+0)=2a0+n=1(ancoslnπx+bnsinlnπx),xR其中, a n = 1 l ∫ a b f ( x ) cos ⁡ n π x l d x , b n = 1 l ∫ a b f ( x ) sin ⁡ n π x l d x a_n=\frac{1}{l}\int_a^bf(x)\cos\frac{n\pi x}{l}dx, b_n=\frac{1}{l}\int_a^bf(x)\sin\frac{n\pi x}{l}dx an=l1abf(x)coslnπxdx,bn=l1abf(x)sinlnπxdx
例2 f ( x ) f(x) f(x)为定义在 [ a , b ) [a,b) [a,b) ( a , b ] (a,b] (a,b] [ a , b ] [a,b] [a,b]的分段光滑函数,可以以 2 l ( 2 l &gt; b − a ) 2l(2l&gt;b-a) 2l(2l>ba)为周期展开
∀ 2 l = b − a \forall 2l=b-a 2l=ba, 记 2 l = b − a + 2 ϵ 2l=b-a+2\epsilon 2l=ba+2ϵ,则可以对三种情况补充定义, f 1 ( x ) = { 0 , a − ϵ ≤ x &lt; a f ( x ) , a ≤ x &lt; b 0 , b ≤ x &lt; b + ϵ f 2 ( x ) = { 0 , a − ϵ ≤ x ≤ a f ( x ) , a &lt; x ≤ b 0 , b &lt; x &lt; b + ϵ f 3 ( x ) = { 0 , a − ϵ ≤ x &lt; a f ( x ) , a ≤ x ≤ b 0 , b &lt; x &lt; b + ϵ f_1(x)=\begin{cases}0&amp;,a-\epsilon\le x&lt; a\\f(x)&amp;,a\le x&lt; b\\0&amp;,b\le x&lt;b+\epsilon\end{cases} f_2(x)=\begin{cases}0&amp;,a-\epsilon\le x\le a\\f(x)&amp;,a&lt;x\le b\\0&amp;,b&lt;x&lt;b+\epsilon\end{cases} f_3(x)=\begin{cases}0&amp;,a-\epsilon\le x&lt; a\\f(x)&amp;,a\le x\le b\\0&amp;,b&lt; x&lt;b+\epsilon\end{cases} f1(x)=0f(x)0,aϵx<a,ax<b,bx<b+ϵf2(x)=0f(x)0,aϵxa,a<xb,b<x<b+ϵf3(x)=0f(x)0,aϵx<a,axb,b<x<b+ϵ f 1 ( x ) , f 2 ( x ) , f 3 ( x ) f_1(x),f_2(x),f_3(x) f1(x),f2(x),f3(x)仍有有限个间断点,因而为定义在 [ a − ϵ , b + ϵ ) [a-\epsilon,b+\epsilon) [aϵ,b+ϵ)的分段光滑函数,可以以 2 l = b − a + 2 ϵ 2l=b-a+2\epsilon 2l=ba+2ϵ为周期展开成傅里叶级数.

附录1: FFT源代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

using namespace std;
const int maxn=1<<22;
const double pi=3.1415926535;
const double eps=0.0000005;

double check0(double x)
{
    return x<eps && x>-eps?0:x;
}    

struct complex \\自定义复数数据类型
{
    double a,b;
    complex(){}
    complex(double aa,double bb):a(aa),b(bb){}
    friend complex operator +(const complex &x,const complex &y)
    {
        return complex(x.a+y.a,x.b+y.b);
    }
    friend complex operator -(const complex &x,const complex &y)
    {
        return complex(x.a-y.a,x.b-y.b);
    }
    friend complex operator *(const complex &x,const complex &y)
    {
        return complex(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);
    }
    friend complex operator /(const complex &x,const double &y)
    {
        return complex(x.a/y,x.b/y);
    }
    friend int operator <(const complex &x,const complex &y)
    {
        return x.a*x.a+x.b*x.b<y.a*y.a+y.b*y.b;
    }
    friend int operator >(const complex &x,const complex &y)
    {
        return x.a*x.a+x.b*x.b>y.a*y.a+y.b*y.b;
    }
    void set(double aa,double bb)
    {
        a=aa,b=bb;
        return;
    }
    void output()
    {
        printf("(%.6lf,%.6lf)",check0(a),check0(b));
        return;
    }
};

complex epq(int p,int q) \\计算复数单位根
{
    return complex(cos(2.0*pi*p/q),sin(-2.0*pi*p/q));
}

double xa[maxn],xb[maxn];
complex X[maxn],Y[maxn];
int n,m,h[maxn];
long long plus=0,times=0;

void init() \\数据补零及逆二进制序计算
{
    memset(h,0,sizeof(h));
    for(m=0;(1<<m)<n;m++);
    n=(1<<m);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++) h[i]=(h[i]<<1)|(((1<<j)&i)||0);
    return;
}

void FFTcal(complex X[],int n,int m,int p) \\计算FFT和IFFT
{
    for(int i=0;i<n;i++) Y[i]=X[h[i]]; 
    for(int t=0;t<m;t++)
    {
        for(int i=0;i<n;i+=(1<<(t+1)))
        {
            for(int j=0;j<(1<<t);j++)
            if(j&&t)
            {
                X[i+j]=Y[i+j]+epq(p*j,1<<(t+1))*Y[i+j+(1<<t)];
                X[i+j+(1<<t)]=Y[i+j]-epq(p*j,1<<(t+1))*Y[i+j+(1<<t)];
                plus+=2,times+=2;
            }
            else
            {
                X[i+j]=Y[i+j]+Y[i+j+(1<<t)];
                X[i+j+(1<<t)]=Y[i+j]-Y[i+j+(1<<t)];
                plus+=2;
            }                
        }
        for(int i=0;i<n;i++) Y[i]=X[i];
    }  
    if(!(~p)) for(int i=0;i<n;i++) X[i]=X[i]/n;
    if(~p) printf("n=%d\n",n);
    else printf("k=%d\n",n);
    for(int i=0;i<n;i++)
    {
        X[i].output();
        printf("\n");
    }
    return;
}

int main()
{
    freopen("in.txt","r",stdin); \\初始数据为复数点列,以二元数形式读入
    freopen("out.txt","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf%lf",xa+i,xb+i);
    memset(X,0,sizeof(X));
    memset(Y,0,sizeof(Y));
    for(int i=0;i<n;i++) X[i].set(xa[i],xb[i]);
    init();
    FFTcal(X,n,m,1);
    FFTcal(X,n,m,-1);
    return 0;
}

参考文献

  1. (美)K.R.Rao,D.N.Kim,(韩)J.J.Hwang著;万帅,杨付正译.快速傅里叶变换:算法与应用[M].北京:机械工业出版社,2013:4-15,37-42
  2. (美)罗纳德·N·布雷斯韦尔著;殷勤业,张建国译.傅里叶变换及其应用:第三版.西安:西安交通大学出版社,2005:4-5,203-227
  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值