DFT – Fast algorithms and C implementations - Part3
Radix-3 DFT
我在第一篇博客里分析了Radix-2 DFT的计算原理,并据此写出了Radix-2 DFT的代码,并验证了其有效性。现在我们有信心认为,只要有了公式,就能写出正确的程序,产生正确的结果!
下面我们推导一下Radix-3 DFT的公式,其实非常简单:
设N长序列的DFT为
,且N能被3整除,则:
所以N长序列的DFT被分解成3个N/3长序列的DFT的线性组合。
Mixed Radix-2 & Radix-3 DFT
现在我们考虑一个更加复杂的问题,就是当需要交叉进行Radix-2与Radix-3变换时该怎么做。
比如当N=12时,显然它既不是2的指数倍,也不是3的指数倍,但是我们可以基于Radix-2和Radix-3思想对它进行分解:
上图显示的是先对原序列进行Radix-2分解,再对两个子序列分别使用Radix-3分解。
上图显示的是先对原序列进行Radix-3分解,再对3个子序列分别使用Radix-2分解。
显然,两种分解方式都可以将一个N=12的序列分解成最小长序列(N=1),从而我们可以通过反复运用Radix-2变换和Radix-3变换来求解出原序列的DFT变换。
上述DFT分解过程看起来简单,但如果我们希望像之前一样先对输入序列进行合理排序,然后循环调用Raidx-based DFT算法来获取结果,我们先要解决一个问题:怎样对数据进行重排序?
我在网上找了半天,并没有找到一种类似bit-reversal-ordering这样的通用算法,所以我只能回到最笨的那个方