这是一篇FFT的学习笔记兼作业
本来想发到lofter上
但lofter不支持markdown
只好发到这里了
文章的引用部分是作业题部分
和全文有的时候没什么关系
各位读者忽略就好
转载请注明出处
一年半后再看,本篇分析完全是从数学角度出发讨论如何优化的
所以对数学公式的表述非常密集
希望不要引起食用不适
给定一个有 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=0∑N−1x(n)z−n.令 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=0∑N−1x(n)e−fsi2π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=0∑N−1x(n)e−Ni2πkn,k=0,1,⋯,N−1,此式有 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.
事实上,以下关于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=0∑N−1x(n)WNkn,k=0,1,⋯,N−1 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=e−Ni2π,WNkn=e−Ni2π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=0∑N−1XF(k)WN−kn,n=0,1,⋯,N−1 ( 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)∗=WN−kn=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)=N1n=0∑N−1x(n)WNkn,k=0,1,⋯,N−1 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)=N1k=0∑N−1XF(k)WN−kn,n=0,1,⋯,N−1归一化因子也可以完全置于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=0∑N−1x(n)WNkn,k=0,1,⋯,N−1 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=0∑N−1XF(k)WN−kn,n=0,1,⋯,N−1这三种定义是等价的,为方便起见,选用第一种定义.
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=0∑N−1WNk=0即 W N W_N WN为复平面上 1 1 1的 N N N次单位根,并且这 N N N个根均匀分布在以原点为中心的单位圆上.
可以用矩阵乘法的形式来表达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(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡WN0×0WN1×0⋮WNk×0⋮WN(N−1)×0WN0×1WN1×1⋮WNk×1⋮WN(N−1)×1⋯⋯⋯⋯WN0×nWN1×n⋮WNk×n⋮WN(N−1)×n⋯⋯⋯⋯WN0×(N−1)WN1×(N−1)⋮WNk×(N−1)⋮WN(N−1)×(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤NN⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡x(0)x(1)⋮x(n)⋮x(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤则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(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤=N1⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡WN−0×0WN−1×0⋮WN−n×0⋮WN−(N−1)×0WN−0×1WN−1×1⋮WN−n×1⋮WN−(N−1)×1⋯⋯⋯⋯WN−0×kWN−1×k⋮WN−n×k⋮WN−(N−1)×k⋯⋯⋯⋯WN−0×(N−1)WN−1×(N−1)⋮WN−n×(N−1)⋮WN−(N−1)×(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤NN⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡XF(0)XF(1)⋮XF(k)⋮XF(N−1)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤则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] (N1[F]∗)(N1[F])=[IN]其中 [ I N ] [I_N] [IN]为 N × N N\times N N×N单位矩阵.
对于DFT矩阵 [ F ] [F] [F],满足
任何一个自然数 n ( n ∈ N ∗ ) n(n\in N^*) n(n∈N∗)都有唯一的 r ( r ∈ N ∗ , r > 1 ) r(r\in N^*,r>1) r(r∈N∗,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,s∈N∗,aj∈N∗,0≤aj<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=(asas−1⋯a1a0)r考虑自然数的 N = r m ( r , m ∈ N ∗ , r , m > 1 ) N=r^m(r,m\in N^*,r,m>1) N=rm(r,m∈N∗,r,m>1)元集 A N = { 0 , 1 , ⋯   , N − 1 } A_N=\{0,1,\cdots,N-1\} AN={0,1,⋯,N−1}有两种划分方式可以将其划分为 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,⋯,(rN−1)+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+0⋅r,j+1⋅r,⋯,j+(rN−1)r} j = 0 , 1 , ⋯   , r − 1 j=0,1,\cdots,r-1 j=0,1,⋯,r−1满足 ⋃ 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=0⋃r−1BN[j]=j=0⋃r−1CN[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
对于一个 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=rm−1个元素,对子列 { 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(n′r+j)=x(n),n′=0,1,⋯,rN−1,j=0,1,⋯,r−1这和自然数集 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,⋯,rN−1,s=0,1,⋯,r−1此时来考虑对于一个 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=0∑N−1x(n)WNkn=j=0∑r−1n′=0∑rN−1xj(n′)WN(k′+srN)(n′r+j)=j=0∑r−1WNkjn′=0∑rN−1xj(n′)WNk′n′r+sn′N=j=0∑r−1WNk′jWrjsn′=0∑rN−1xj(n′)WrNk′n′=0,1,⋯,N−1 ∑ 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′=0rN−1xj(n′)WrNk′n′可以看做一个对于 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(k′r+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=0∑N−1XF(k)WN−nk=N1j=0∑r−1k′=0∑rN−1XjF(k′)WN−(n′+srN)(k′r+j)=N1j=0∑r−1WN−njk′=0∑rN−1XjF(k′)WN−n′k′r−sk′N=r1j=0∑r−1WN−n′jWr−jsNrk′=0∑rN−1XjF(k′)WrN−k′n′=0,1,⋯,N−1
接下来来讨论另外一种子数据点列的划分方式.对于一个 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=rm−1个元素,对子列 { 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,⋯,rN−1,j=0,1,⋯,r−1此时选取的 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=k′r+s,k′=0,1,⋯,rN−1,s=0,1,⋯,r−1此时再来考虑对于一个 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(k′r+s)k=n=0∑N−1x(n)WNkn=n′=0∑rN−1j=0∑r−1xj(n′)WN(k′r+s)(n′+jrN)=n′=0∑rN−1WN(k′r+s)n′j=0∑r−1xj(n′)WNk′jN+sjrN=n′=0∑rN−1(WNsn′j=0∑r−1xj(n′)Wrsj)WrNk′n′=0,1,⋯,N−1 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(k′r+s)=∑n′=0rN−1(WNsn′∑j=0r−1xj(n′)Wrsj)WrNk′n′意味着原 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=n′r+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(n′r+s)k=N1k=0∑N−1XF(k)WN−nk=N1k′=0∑rN−1j=0∑r−1XjF(k′)WN−(n′r+s)(k′+jrN)=N1k′=0∑rN−1WN−(n′r+s)k′j=0∑r−1XjF(k′)WN−n′jN−sjrN=Nrk′=0∑rN−1(rWN−sk′j=0∑r−1XjF(k′)Wr−sj)WrN−n′k′=0,1,⋯,N−1
(这一段真的没什么,输入序列需要进行反序)
出于计算机实现的操作性,这里的程序选择的是基 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} WN−kn,有
位置编号 | 初始序列 | 第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} W4−1a(3) | a(1)+ W 8 − 1 W_8^{-1} W8−1a(5) | x(1) |
2 | X^F(2) | a(2)+a(3) | a(0)-a(2) | a(2)+ W 8 − 2 W_8^{-2} W8−2a(6) | x(2) |
3 | X^F(6) | a(2)-a(3) | a(1)- W 4 − 1 W_4^{-1} W4−1a(3) | a(3)+ W 8 − 3 W_8^{-3} W8−3a(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} W4−1a(7) | a(1)- W 8 − 1 W_8^{-1} W8−1a(5) | x(5) |
6 | X^F(3) | a(6)+a(7) | a(4)-a(6) | a(2)- W 8 − 2 W_8^{-2} W8−2a(6) | x(6) |
7 | X^F(7) | a(6)-a(7) | a(5)- W 4 − 1 W_4^{-1} W4−1a(7) | a(3)- W 8 − 3 W_8^{-3} W8−3a(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中给出.
递归方程 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)是同阶无穷大.
需要预处理 W N 1 , W N 2 , ⋯   , W N N − 1 W_N^1,W_N^2,\cdots,W_N^{N-1} WN1,WN2,⋯,WNN−1的值,其中 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(r−1)次复数乘法和 N ( r − 1 ) N(r-1) N(r−1)次复数加法将其转化为 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)=r∗T(rN)+2(r−1)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(r−1)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) N→∞limN1logb0N2(r−1)N=2(r−1)则基- 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(m∈N∗,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的分析基本是平行的,这里不再赘述.
在具体实例中,根据单位根的性质,存在一些具体的优化.下举若干例来说明.
对于离散信号列 { x ( n ) } n = 0 2 N − 1 \{x(n)\}_{n=0}^{2^N-1} {x(n)}n=02N−1, 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=0∑1W2Nk′jW2jsn′=0∑2N−1−1xj(n′)W2N−1k′n′=0,1,⋯,2N−1记 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=0∑2N−1−1x0(n)W2N−1nk=n=0∑2N−1−1x(2n)W2N−1nk=n=0∑2N−1−1x1(n)W2N−1nk=n=0∑2N−1−1x(2n+1)W2N−1nk=0,1,⋯,2N−1−1则 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,⋯,2N−1−1IFFT则有 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)=2N−11k=0∑2N−1−1X0F(k)W2N−1−nk=2N−11k=0∑2N−1−1XF(2k)W2N−1−nk=2N−11k=0∑2N−1−1X1F(k)W2N−1−nk=2N−11k=0∑2N−1−1XF(2k+1)W2N−1−nk 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+2N−1)n=21[x0(n)+W2N−nx1(n)]=21[x0(n)−W2N−nx1(n)]=0,1,⋯,2N−1−1
在实际计算中需要注意到当 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)i≈−12.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 (−24−82)−(40−402)i≈−35.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 (−24−82)+(40−402)i≈−35.313708−16.568542i |
6 | 49 | − 32 − 40 i -32-40i −32−40i |
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)i≈−12.686291−96.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,−300≤x≤300,采样点选取 [ − 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=25050≈4.44×10−14可以看出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=0∑23n2xn,n=0∑24nxn ( 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=0∑250n2xn,n=0∑220nxn利用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=0∑23n2xn⎠⎞⎝⎛n=0∑24nxn⎠⎞1024x24+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+17≤32.实际上此时的计算复杂度,主要是两个序列长度和所影响的.
对于问题(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 |
对于离散信号列 { x ( n ) } n = 0 3 N − 1 \{x(n)\}_{n=0}^{3^N-1} {x(n)}n=03N−1, 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=0∑2W3Nk′jW3jsn′=0∑3N−1−1xj(n′)W3N−1k′n′=0,1,⋯,3N−1记 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=0∑3N−1−1x0(n)W3N−1nk=n=0∑3N−1−1x(3n)W3N−1nk=n=0∑3N−1−1