族谱网 头条 人物百科

库利-图基快速傅里叶变换算法

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:615
转发:0
评论:0
复杂度离散傅立叶变换的复杂度为O(n2){displaystyle{mathcal{O}}(n^{2})}(可参考大O符号)快速傅立叶变换的复杂度为O(Nlog⁡⁡-->N){displa

复杂度

离散傅立叶变换的复杂度为O(n2){\displaystyle {\mathcal {O}}(n^{2})}(可参考大O符号)

快速傅立叶变换的复杂度为O(Nlog⁡ ⁡ -->N){\displaystyle {\mathcal {O}}(N\log N)},分析可见下方架构图部分,级数为log⁡ ⁡ -->N{\displaystyle \log N}而每一级的复杂度为N{\displaystyle N},故复杂度为O(Nlog⁡ ⁡ -->N){\displaystyle {\mathcal {O}}(N\log N)}

时域/频域抽取法

在FFT算法中,针对输入做不同方式的分组会造成输出顺序上的不同。如果我们使用时域抽取(Decimation-in-time),那么输入的顺序将会是位元反转排列(bit-reversed order),输出将会依序排列。但若我们采取的是频域抽取(Decimation-in-frequency),那么输出与输出顺序的情况将会完全相反,变为依序排列的输入与位元反转排列的输出。

时域抽取法

我们可以将DFT公式中的项目在时域上重新分组,这样就叫做时域抽取(Decimation-in-time),在这里e− − -->j(2π π -->nkN){\displaystyle e^{-j(2\pi {\frac {nk}{N}})}}将会被代换为旋转因子(twiddle factor)WNnk{\displaystyle W_{N}^{nk}}。

X[k]=∑ ∑ -->n=0N− − -->1x[n]e− − -->j(2π π -->nkN)k=0,1,… … -->,N− − -->1{\displaystyle X[k]=\sum _{n=0}^{N-1}x[n]e^{-j(2\pi {\frac {nk}{N}})}\qquad k=0,1,\ldots ,N-1}

=∑ ∑ -->n evenx[n]WNnk+∑ ∑ -->n oddx[n]WNnk{\displaystyle =\sum _{n\ even}x[n]W_{N}^{nk}+\sum _{n\ odd}x[n]W_{N}^{nk}}

=∑ ∑ -->r=0(N/2)− − -->1x[2r]WN2rk+∑ ∑ -->r=0(N/2)− − -->1x[2r+1]WN(2r+1)k{\displaystyle =\sum _{r=0}^{(N/2)-1}x[2r]W_{N}^{2rk}+\sum _{r=0}^{(N/2)-1}x[2r+1]W_{N}^{(2r+1)k}}

=∑ ∑ -->r=0(N/2)− − -->1x[2r]WN2rk+WNk∑ ∑ -->r=0(N/2)− − -->1x[2r+1]WN2rk{\displaystyle =\sum _{r=0}^{(N/2)-1}x[2r]W_{N}^{2rk}+W_{N}^{k}\sum _{r=0}^{(N/2)-1}x[2r+1]W_{N}^{2rk}}

=∑ ∑ -->r=0(N/2)− − -->1x[2r]WN/2rk+WNk∑ ∑ -->r=0(N/2)− − -->1x[2r+1]WN/2rk{\displaystyle =\sum _{r=0}^{(N/2)-1}x[2r]W_{N/2}^{rk}+W_{N}^{k}\sum _{r=0}^{(N/2)-1}x[2r+1]W_{N/2}^{rk}}

=G[k]+WNkH[k]{\displaystyle =G[k]+W_{N}^{k}H[k]}

在这边我们要注意的是,我们所替换的G[k]与H[k]具有周期性:

{G[k+N2]=G[k]H[k+N2]=H[k]{\displaystyle {\begin{cases}G[k+{\frac {N}{2}}]=G[k]\\H[k+{\frac {N}{2}}]=H[k]\end{cases}}}

上述的推导可以划成下面的图:

划红框处所示的N2{\displaystyle {\frac {N}{2}}}点DFT架构如下图所示:

划红框处所示的N4{\displaystyle {\frac {N}{4}}}点DFT架构如下图所示:

下图是一个8点DIT FFT的完整架构图。

频域抽取法

我们可以将DFT公式中的项目在频域上重新分组,这样就叫做频域抽取(Decimation-in-frquency)。

首先先观察在频域上偶数项的部分:

X[2r]=∑ ∑ -->n=0N− − -->1x[n]WNn(2r) r=0,1,⋯ ⋯ -->,N2− − -->1{\displaystyle X[2r]=\sum _{n=0}^{N-1}x[n]W_{N}^{n(2r)}\ r=0,1,\cdots ,{\frac {N}{2}}-1}

=∑ ∑ -->n=0N2− − -->1x[n]WN2nr+∑ ∑ -->n=N2N− − -->1x[n]WN2nr{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{2nr}+\sum _{n={\frac {N}{2}}}^{N-1}x[n]W_{N}^{2nr}}

=∑ ∑ -->n=0N2− − -->1x[n]WN2nr+∑ ∑ -->n=0N2− − -->1x[n+N2]WN2r[n+N2]{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{2nr}+\sum _{n=0}^{{\frac {N}{2}}-1}x[n+{\frac {N}{2}}]W_{N}^{2r[n+{\frac {N}{2}}]}}

∵ ∵ -->WN2r[n+N2]=WN2rnWNrN=WN2rn{\displaystyle {\color {Gray}\because W_{N}^{2r[n+{\frac {N}{2}}]}=W_{N}^{2rn}W_{N}^{rN}=W_{N}^{2rn}}}

=∑ ∑ -->n=0N2− − -->1x[n]WN2rn+∑ ∑ -->n=0N2− − -->1x[n+N2]WN2rn{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{2rn}+\sum _{n=0}^{{\frac {N}{2}}-1}x[n+{\frac {N}{2}}]W_{N}^{2rn}}

=∑ ∑ -->n=0N2− − -->1(x[n]+x[n+N2])WN2rn{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}(x[n]+x[n+{\frac {N}{2}}])W_{\frac {N}{2}}^{rn}}

=∑ ∑ -->n=0N2− − -->1g[n]WN2rn{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}g[n]W_{\frac {N}{2}}^{rn}}

再观察在频域上奇数项的部分:

X[2r+1]=∑ ∑ -->n=0N− − -->1x[n]WNn(2r+1) r=0,1,⋯ ⋯ -->,N2− − -->1{\displaystyle X[2r+1]=\sum _{n=0}^{N-1}x[n]W_{N}^{n(2r+1)}\ r=0,1,\cdots ,{\frac {N}{2}}-1}

=∑ ∑ -->n=0N2− − -->1x[n]WNn(2r+1)+∑ ∑ -->n=N2N− − -->1x[n]WNn(2r+1){\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{n(2r+1)}+\sum _{n={\frac {N}{2}}}^{N-1}x[n]W_{N}^{n(2r+1)}}

=∑ ∑ -->n=0N2− − -->1x[n]WNn(2r+1)+∑ ∑ -->n=0N2− − -->1x[n+N2]WN(2r+1)[n+N2]{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{n(2r+1)}+\sum _{n=0}^{{\frac {N}{2}}-1}x[n+{\frac {N}{2}}]W_{N}^{(2r+1)[n+{\frac {N}{2}}]}}

∵ ∵ -->WN(2r+1)[n+N2]=WN(2r+1)nWN(2r+1)N2=− − -->WN(2r+1)n{\displaystyle {\color {Gray}\because W_{N}^{(2r+1)[n+{\frac {N}{2}}]}=W_{N}^{(2r+1)n}W_{N}^{(2r+1){\frac {N}{2}}}=-W_{N}^{(2r+1)n}}}

=∑ ∑ -->n=0N2− − -->1x[n]WN(2r+1)n− − -->∑ ∑ -->n=0N2− − -->1x[n+N2]WN(2r+1)n{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}x[n]W_{N}^{(2r+1)n}-\sum _{n=0}^{{\frac {N}{2}}-1}x[n+{\frac {N}{2}}]W_{N}^{(2r+1)n}}

=∑ ∑ -->n=0N2− − -->1(x[n]− − -->x[n+N2])WNn(2r+1){\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}(x[n]-x[n+{\frac {N}{2}}])W_{N}^{n(2r+1)}}

=∑ ∑ -->n=0N2− − -->1(x[n]− − -->x[n+N2])WNnWN2nr{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}(x[n]-x[n+{\frac {N}{2}}])W_{N}^{n}W_{\frac {N}{2}}^{nr}}

=∑ ∑ -->n=0N2− − -->1(h[n]WNn)WN2rn{\displaystyle =\sum _{n=0}^{{\frac {N}{2}}-1}(h[n]W_{N}^{n})W_{\frac {N}{2}}^{rn}}

上述的推导可以画成下面的图:

更进一步的拆解N2{\displaystyle {\frac {N}{2}}}-point DFT的架构

下图为8点FFT下N4{\displaystyle {\frac {N}{4}}}-point DFT的架构

总结上述架构,完整的8点DIF FFT架构图为

单一基底

利用库利-图基算法进行离散傅立叶拆解时,能够依需求而以2, 4, 8…等2的幂次方为单位进行拆解,不同的拆解方法会产生不同层数快速傅里叶变换的架构,基底越大则层数越少,复数乘法器也越少,但是每级的蝴蝶形架构则会越复杂,因此常见的架构为2基底、4基底与8基底这三种设计。

2基底

2基底-快速傅立叶算法(Radix-2 FFT)是最广为人知的一种库利-图基快速傅立叶算法分支。此方法不断地将N点的FFT拆解成两个"N/2"点的FFT,利用旋转因子Wnk,WN2{\displaystyle W^{nk},W^{\frac {N}{2}}}的对称性借此来降低DFT的计算复杂度,达到加速的功效。

而其实前述有关时域抽取或是频域抽取的方法介绍,即为2基底的快速傅立叶转换法。以下展示其他种2基底快速傅立叶算法的连线方法,此种不规则的连线方法可以让输出与输入都为循序排列,但是连线的复杂度却大大的增加。

4基底

4基底快速傅立叶变换算法则是承接2基底的概念,在此里用时域抽取的技巧,将原本的DFT公式拆解为四个一组的形式:

X[k]=∑ ∑ -->n=0N− − -->1x[n]e− − -->j(2π π -->nkN)k=0,1,… … -->,N− − -->1{\displaystyle X[k]=\sum _{n=0}^{N-1}x[n]e^{-j(2\pi {\frac {nk}{N}})}\qquad k=0,1,\ldots ,N-1}

=∑ ∑ -->n=0N4− − -->1x[4n+0]WN(4n+0)k+∑ ∑ -->n=0N4− − -->1x[4n+1]WN(4n+1)k{\displaystyle =\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+0]W_{N}^{(4n+0)k}+\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+1]W_{N}^{(4n+1)k}}

+∑ ∑ -->n=0N4− − -->1x[4n+2]WN(4n+2)k+∑ ∑ -->n=0N4− − -->1x[4n+3]WN(4n+3)k{\displaystyle +\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+2]W_{N}^{(4n+2)k}+\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+3]W_{N}^{(4n+3)k}}

=WN0∑ ∑ -->n=0N4− − -->1x[4n+0]WN4nk+WN1k∑ ∑ -->n=0N4− − -->1x[4n+1]WN4nk{\displaystyle =W_{N}^{0}\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+0]W_{\frac {N}{4}}^{nk}+W_{N}^{1k}\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+1]W_{\frac {N}{4}}^{nk}}

+WN2k∑ ∑ -->n=0N4− − -->1x[4n+2]WN4nk+WN3k∑ ∑ -->n=0N4− − -->1x[4n+3]WN4nk{\displaystyle +W_{N}^{2k}\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+2]W_{\frac {N}{4}}^{nk}+W_{N}^{3k}\sum _{n=0}^{{\frac {N}{4}}-1}x[4n+3]W_{\frac {N}{4}}^{nk}}

WN0F0(k)+WNkF1(k)+WN2kF2(k)+WN3kF3(k){\displaystyle W_{N}^{0}F_{0}(k)+W_{N}^{k}F_{1}(k)+W_{N}^{2k}F_{2}(k)+W_{N}^{3k}F_{3}(k)}

在这里再利用Wnk+N4=− − -->Wnk+3N4=− − -->jWnk{\displaystyle W^{nk+{\frac {N}{4}}}=-W^{nk+{\frac {3N}{4}}}=-jW^{nk}}的特性来进行与2基数FFT类似的化减方法,以降低算法复杂度。

8基底

在库利-图基算法里,使用的基底(radix)越大,复数的乘法与内存的存取就越少,所带来的好处不言而喻。但是随之而来的就是实数的乘法与实数的加法也会增加,尤其计算单元的设计也就越复杂,对于可应用FFT之点数限制也就越严格。在表中我们可以看到在不同基底下所需的计算成本。

在DFT的公式中,我们重新定义x=[x(0),x(1),…,x(N-1)], X=[X(0),X(1),…,X(N-1)],则DFT可重写为X=FN‧x。FN是一个N×N的DFT矩阵,其元素定义为[FN]ij=WNij(i,j ∈ [0,N-1]),当N=8时,我们可以得到以下的F8矩阵并且进一步将其拆解。

在拆解成三个矩阵相乘之后,我们可以将复数运算的数量从56个降至24个复数的加法。底下是8基底的的SFG。要注意的是所有的输出与输入都是复数的形式,而输出与输入的排序也并非规律排列,此种排列方式是为了要达到接线的最佳化。

混合基底

2/8基底

在2/8基底的算法中,我们可以看到我们对于偶数项的输出会使用2基底的分解法,对于奇数项的输出采用8基底的分解法。这个做法充分利用了2基底与4基底拥有最少乘法数与加法数的特性。当使用了2基底的分解法后,偶数项的输出如下所示。

C2k=∑ ∑ -->n=0N2− − -->1(x2n+xN2+n)W2nk{\displaystyle C_{2k}=\sum _{n=0}^{{\frac {N}{2}}-1}(x_{2n}+x_{{\frac {N}{2}}+n})W^{2nk}}

奇数项的输出则交由8基底分解来处理,如下四式所述。

C8k+1=∑ ∑ -->n=0N8− − -->1{[(xn− − -->xn+N2)− − -->j(xn+N4− − -->xn+3N4)]+WN8[(xn+N8− − -->xn+5N8)− − -->j(xn+3N8− − -->xn+7N8)]}W8nkWn{\displaystyle C_{8k+1}=\sum _{n=0}^{{\frac {N}{8}}-1}{\begin{Bmatrix}[(x_{n}-x_{n+{\frac {N}{2}}})-j(x_{n+{\frac {N}{4}}}-x_{n+{\frac {3N}{4}}})]+W^{\frac {N}{8}}[(x_{n+{\frac {N}{8}}}-x_{n+{\frac {5N}{8}}})-j(x_{n+{\frac {3N}{8}}}-x_{n+{\frac {7N}{8}}})]\end{Bmatrix}}W^{8nk}W^{n}}

C8k+5=∑ ∑ -->n=0N8− − -->1{[(xn− − -->xn+N2)− − -->j(xn+N4− − -->xn+3N4)]− − -->WN8[(xn+N8− − -->xn+5N8)− − -->j(xn+3N8− − -->xn+7N8)]}W8nkW5n{\displaystyle C_{8k+5}=\sum _{n=0}^{{\frac {N}{8}}-1}{\begin{Bmatrix}[(x_{n}-x_{n+{\frac {N}{2}}})-j(x_{n+{\frac {N}{4}}}-x_{n+{\frac {3N}{4}}})]-W^{\frac {N}{8}}[(x_{n+{\frac {N}{8}}}-x_{n+{\frac {5N}{8}}})-j(x_{n+{\frac {3N}{8}}}-x_{n+{\frac {7N}{8}}})]\end{Bmatrix}}W^{8nk}W^{5n}}

C8k+3=∑ ∑ -->n=0N8− − -->1{[(xn− − -->xn+N2)+j(xn+N4− − -->xn+3N4)]+W3N8[(xn+N8− − -->xn+5N8)+j(xn+3N8− − -->xn+7N8)]}W8nkW3n{\displaystyle C_{8k+3}=\sum _{n=0}^{{\frac {N}{8}}-1}{\begin{Bmatrix}[(x_{n}-x_{n+{\frac {N}{2}}})+j(x_{n+{\frac {N}{4}}}-x_{n+{\frac {3N}{4}}})]+W^{\frac {3N}{8}}[(x_{n+{\frac {N}{8}}}-x_{n+{\frac {5N}{8}}})+j(x_{n+{\frac {3N}{8}}}-x_{n+{\frac {7N}{8}}})]\end{Bmatrix}}W^{8nk}W^{3n}}

C8k+7=∑ ∑ -->n=0N8− − -->1{[(xn− − -->xn+N2)+j(xn+N4− − -->xn+3N4)]− − -->W3N8[(xn+N8− − -->xn+5N8)+j(xn+3N8− − -->xn+7N8)]}W8nkW7n{\displaystyle C_{8k+7}=\sum _{n=0}^{{\frac {N}{8}}-1}{\begin{Bmatrix}[(x_{n}-x_{n+{\frac {N}{2}}})+j(x_{n+{\frac {N}{4}}}-x_{n+{\frac {3N}{4}}})]-W^{\frac {3N}{8}}[(x_{n+{\frac {N}{8}}}-x_{n+{\frac {5N}{8}}})+j(x_{n+{\frac {3N}{8}}}-x_{n+{\frac {7N}{8}}})]\end{Bmatrix}}W^{8nk}W^{7n}}

以上式子就是2/8基底的FFT快速算法。在架构图上可化为L型的蝴蝶运算架构,如下图所示。

而下图表示的是一个64点的FFT使用2/8基底的架构图。虽然2/8基底的算法缩减了WN8,W3N8{\displaystyle W^{\frac {N}{8}},W^{\frac {3N}{8}}}的乘法量,但是这种算法最大的缺点是跟其他固定基底或是混合基底比较起来,他的架构较为不规则。所以在硬件上比4基底或是2基底更难实现。

2/4/8基底

为了改进Radix 2/8在架构上的不规则性,我们在这里做了一些修改,如下图4.。此修改可让架构更加规则,且所使用的加法器与乘法器数量更加减少,如下表所示。

在这里我们最小的运算单元称为PE(Process Element),PE内部包含了2/8基底、2/4基底、2基底的运算,简化过的信号处理流程与蝴蝶型架构图可见下图

2基底

基底的选择越大会造成蝴蝶形架构更加复杂,控制电路也会复杂化。因此Shousheng He和Mats Torkelson在1996提出了一个2^2基底的FFT算法,利用旋转因子的特性:WN4=− − -->j{\displaystyle W_{\frac {N}{4}}=-j}。而–j的乘法基本上只需要将被乘数的实部虚部对调,然后将虚部加上负号即可,这样的负数乘法被定义为"简单乘法",因此可以用很简单的硬件架构来实现。利用上面的特性,2基底FFT能用串接的方式将旋转因子以4为单位对DFT公式进行拆解,将蝴蝶形架构层数降到log4N,大幅减少复数乘法器的用量,而同时却维持了2基底蝴蝶形架构的简单性,在效能上获得改进。2基底DIF FFT算法的拆解方法如下列公式所述:

N点DFT公式: X(k)=∑ ∑ -->n=0N− − -->1x(n)WNnk,0≦ ≦ -->k<N{\displaystyle X(k)=\sum _{n=0}^{N-1}x(n)W_{N}^{nk},0\leqq k

利用线性映射将n与k映射到三个维度上面

{n=Nk=N{\displaystyle {\begin{cases}n=_{N}\\k=_{N}\end{cases}}}

然后套用Common Factor Algorithm(CFA)

X(k1+2k2+4k3)=∑ ∑ -->n3=0N4− − -->1∑ ∑ -->n2=01∑ ∑ -->n1=01x(N2n1+N4n2+n3)WN(N2n1+N4n2+n3)(k1+2k2+4k3){\displaystyle X(k_{1}+2k_{2}+4k_{3})=\sum _{n_{3}=0}^{{\frac {N}{4}}-1}\sum _{n_{2}=0}^{1}\sum _{n_{1}=0}^{1}x({\frac {N}{2}}n_{1}+{\frac {N}{4}}n_{2}+n_{3})W_{N}^{({\frac {N}{2}}n_{1}+{\frac {N}{4}}n_{2}+n_{3})(k_{1}+2k_{2}+4k_{3})}}

=∑ ∑ -->n3=0N4− − -->1∑ ∑ -->n2=01{BN2k1WN(N4n2+n3)k1}WN(N4n2+n3)(2k2+4k3){\displaystyle =\sum _{n_{3}=0}^{{\frac {N}{4}}-1}\sum _{n_{2}=0}^{1}{\begin{Bmatrix}B_{\frac {N}{2}}^{k_{1}}W_{N}^{({\frac {N}{4}}n_{2}+n_{3})k_{1}}\end{Bmatrix}}W_{N}^{({\frac {N}{4}}n_{2}+n_{3})(2k_{2}+4k_{3})}}

而蝴蝶型架构会变成以下形式

BN2k1=x(N4n2+n3)+(− − -->1)k1x(N4n2+n3+N2){\displaystyle B_{\frac {N}{2}}^{k_{1}}=x({\frac {N}{4}}n_{2}+n_{3})+(-1)^{k_{1}}x({\frac {N}{4}}n_{2}+n_{3}+{\frac {N}{2}})}

利用旋转因子WN4=− − -->j{\displaystyle W_{\frac {N}{4}}=-j}的特性,可以观察出

WN(N4n2+n3)(k1+2k2+4k3)=WNNn2n3WNN4n2(k1+2k2)WNn3(k1+2k2)WN4n3k3{\displaystyle W_{N}^{({\frac {N}{4}}n_{2}+n_{3})(k_{1}+2k_{2}+4k_{3})}=W_{N}^{Nn_{2}n_{3}}W_{N}^{{\frac {N}{4}}n_{2}(k_{1}+2k_{2})}W_{N}^{n_{3}(k_{1}+2k_{2})}W_{N}^{4n_{3}k_{3}}}

=(− − -->j)n2(k1+2k2)WNn3(k1+2k2)WN4n3k3{\displaystyle =(-j)^{n_{2}(k_{1}+2k_{2})}W_{N}^{n_{3}(k_{1}+2k_{2})}W_{N}^{4n_{3}k_{3}}}

再将此公式带入原式中可以得到

X(k1+2k2+4k3)=∑ ∑ -->n3=0N4− − -->1[H(k1,k2,n3)WNn3(k1+2k2)]WN4n3k3{\displaystyle X(k_{1}+2k_{2}+4k_{3})=\sum _{n_{3}=0}^{{\frac {N}{4}}-1}[H(k_{1},k_{2},n_{3})W_{N}^{n_{3}(k_{1}+2k_{2})}]W_{N}^{4n_{3}k_{3}}}

H(k1,k2,n3)=BF2I[x(n3)+(− − -->1)k1(n3+N2)]⏞ ⏞ -->+(− − -->j)k1+2k2BF2I[x(n3+N4)+(− − -->1)k1(n3+3N4)]⏞ ⏞ -->⏟ ⏟ -->BF2II{\displaystyle H(k_{1},k_{2},n_{3})={\begin{matrix}\underbrace {{\begin{matrix}BF2I\\\overbrace {[x(n_{3})+(-1)^{k_{1}}(n_{3}+{\frac {N}{2}})]} \end{matrix}}{\begin{matrix}\\\\+(-j)^{k_{1}+2k_{2}}\end{matrix}}{\begin{matrix}BF2I\\\overbrace {[x(n_{3}+{\frac {N}{4}})+(-1)^{k_{1}}(n_{3}+{\frac {3N}{4}})]} \end{matrix}}} \\BF2II\end{matrix}}}

如上述公式所示,原本的DFT公式会被拆解成多个H(k1,k2,n3){\displaystyle H(k_{1},k_{2},n_{3})},而H(k1,k2,n3){\displaystyle H(k_{1},k_{2},n_{3})}又可分为BF2I与BF2II两个阶层,分别会对应到之后所介绍的两种硬件架构。

一个16点的DFT公式经过一次上面所述之拆解之后可得下面的FFT架构

可以看出上图的架构保留了2基底的简单架构,然而复数乘法却降到每两级才出现一次,也就是log4N{\displaystyle log_{4}N}次。而BF2I以及BF2II所对应的硬件架构下图:

其中BF2II硬件单元中左下角的交叉电路就是用来处理-j的乘法。

一个256点的FFT架构可以由下面的硬件来实现:

其中图下方的为一7位元宽的计数器,而此架构的控制电路相当单纯,只要将计数器的各个位元分别接上BF2I与BF2II单元即可。

下表将2基底、4基底与2基底算法做一比较,可以发现2基底算法所需要的乘法气数量为2基底的一半,加法弃用量是4基底的一半,并维持一样的内存用量和控制电路的简单性。

2基底

如上所述,2算法是将旋转因子WN4=− − -->j{\displaystyle W^{\frac {N}{4}}=-j}视为一个简单乘法,进而由公式以及硬件上的化简获得硬件需求上的改进。而借由相同的概念,Shousheng He和Mats Torkelson进一步将旋转因子WN8=22(1− − -->j){\displaystyle W^{\frac {N}{8}}={\frac {\sqrt {2}}{2}}(1-j)}的乘法化简成一个简单乘法,而化简的方法将会在下面讲解。

22{\displaystyle {\frac {\sqrt {2}}{2}}}乘法化简

在2基数FFT算法中的基本概念是利用旋转因子Wnk,WN2{\displaystyle W^{nk},W^{\frac {N}{2}}}的对称性,4基数算法则是利用 Wnk+N4=− − -->Wnk+3N4=− − -->jWnk{\displaystyle W^{nk+{\frac {N}{4}}}=-W^{nk+{\frac {3N}{4}}}=-jW^{nk}} 的特性。但是我们会发现在这些旋转因子的对称特性中─

WN8=− − -->W5N8=22(1− − -->j),W3N8=− − -->W7N8=− − -->22(1+j){\displaystyle W^{\frac {N}{8}}=-W^{\frac {5N}{8}}={\frac {\sqrt {2}}{2}}(1-j),W^{\frac {3N}{8}}=-W^{\frac {7N}{8}}=-{\frac {\sqrt {2}}{2}}(1+j)}

─并没有被利用到。主要是因为22(1− − -->j){\displaystyle {\frac {\sqrt {2}}{2}}(1-j)}的乘法运算会让整个FFT变得复杂,但是如果借由近似的方法,我们便可以将此一运算化简为12个加法。

22=0.70710678=2− − -->1+2− − -->3+2− − -->4+2− − -->6+2− − -->8+2− − -->9{\displaystyle {\frac {\sqrt {2}}{2}}=0.70710678=2^{-1}+2^{-3}+2^{-4}+2^{-6}+2^{-8}+2^{-9}}

我们可以从上式注意到,22{\displaystyle {\frac {\sqrt {2}}{2}}}可以被近似为五个加法的结果,所以22(1+j){\displaystyle {\frac {\sqrt {2}}{2}}(1+j)}就可以被简化为只有六个加法,再算入实部与虚部的计算,总共只需12个加法器就可以运用到此一简化特性。

经由与2基底类似的推导,并用串接的方式将旋转因子以8为单位对DFT公式进行拆解,2基底FFT算法进一步将复数乘法器的用量缩减到log8N,并同时维持硬件架构的简单性。    推导的方法与2基底相当类似。借由这样的方法,2基底能将乘法器的用量缩减到2基底的1/3,并同时维持一样的内存用量以及控制电路的简单性。

参考资料

Widhe, T., J. Melander, et al. (1997). Design of efficient radix-8 butterfly PEs for VLSI. Cirts and Systems, 1997. ISCAS "97., Proceedings of 1997 IEEE International Symposium on.

Lihong, J., G. Yonghong, et al. (1998). A new VLSI-oriented FFT algorithm and implementation. ASIC Conference 1998. Proceedings. Eleventh Annual IEEE International.

Duhamel, P. and H. Hollmann (1984). "Split-radix FFT algorithm." Electronics Letters 20(1): 14-16.

Vetterli, M. and P. Duhamel (1989). "Split-radix algorithms for length-pm DFT"s." Acoustics, Speech and Signal Processing, IEEE Transactions on 37(1): 57-64.

Richards, M. A. (1988). "On hardware implementation of the split-radix FFT." Acoustics, Speech and Signal Processing, IEEE Transactions on 36(10): 1575-1581.

Shousheng, H. and M. Torkelson (1996). A new approach to pipeline FFT processor. Parallel Processing Symposium, 1996., Proceedings of IPPS "96, The 10th International.

Shousheng, H. and M. Torkelson (1998). Designing pipeline FFT processor for OFDM (de)modulation. Signals, Systems, and Electronics, 1998. ISSSE 98. 1998 URSI International Symposium on.


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 快速傅里叶变换
定义和速度用FFT计算DFT会得到与直接用DFT定义计算相同的结果;最重要的区别是FFT更快。(由于舍入误差的存在,许多FFT算法还会比直接运用定义求值精确很多,后面会讨论到这一点。)令x0,....,xN-1为复数。DFT由下式定义直接按这个定义求值需要O(N)次运算:Xk共有N个输出,每个输出需要N项求和。直接使用DFT运算需使用N个复数乘法(4N个实数乘法)与N-1个复数加法(4N-2个实数加法),因此,计算使用DFT所有N点的值需要N复数乘法与N-N个复数加法。FFT则是能够在O(NlogN)次操作计算出相同结果的任何方法。更准确的说,所有已知的FFT算法都需要O(NlogN)次运算(技术上O只标记上界),虽然还没有已知的证据证明更低的复杂度是不可能的。(JohnsonandFrigo,2007)要说明FFT节省时间的方式,就得考虑复数相乘和相加的次数。直接计算DFT的值涉及到N次...
· 蒂图·库西·尤潘基
参考资料AnIncaAccountoftheConquestofPerubyTituCusiYupanqui,trans.RalphBauerISBN0-87081-821-XAndeanWorldsbyKennethJ.Andrien.ISBN0-8263-2358-8
· 图尔库
姐妹城市
· 杰基·库根
早年生活与电影生涯杰基·库根于1914年10月26日出生在美国加利福尼亚州的洛杉矶。在他仍在婴儿时期时就开始在歌舞杂耍和电影中表演了。后在一次歌舞杂耍中,喜剧大师查理·卓别林发现了他的表演才华。之后卓别林邀请了这位天才小童星和他共同出演,先是在《快乐的一天》(ADay"sPleasure,1919)中杰基扮演了一位小男孩。1921年的《寻子遇仙记》(TheKid)中库根更是将一个调皮可爱又遭不幸的弃儿演绎得近乎完美。他也曾在1922年电影《雾都孤儿》和1930年电影《汤姆·索耶历险记》中分别扮演过孤儿奥利弗和汤姆·索耶。杰基·库根和查理·卓别林在1921年的电影《寻子遇仙记》中他还曾环球旅行,每到一处便受到当地群众的普遍欢迎。可惜的是,他出演过的早期电影大多失传。1935年5月4日,就在21岁生日前夕,库根与他的父亲,还有好友朱尼尔·德金(也是童星出身)在圣迭戈县遭遇严重车祸,库根是唯一幸...
· 科曼·库利巴利
生涯科曼·库利巴利的正职是金融审计,于1999年,他取得了为国际赛事判法的资格。2004年,他首次为非洲国家杯判法,两年后,他再度成为非洲国家杯的主裁判,2008年,他更为当届的非洲杯决赛判法。2010年6月,他为2010年世界杯的小组赛判法,6月18日进行的C组第二轮美国队与斯洛文尼亚队的比赛中,他将美国队的一个进球吹罚无效,引起了国际传媒广泛的争议。最后他亦被禁止执法余下的2010世界杯赛事。

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信