离散傅里叶变换 - 快速计算方法及C实现 - 第三篇

本文探讨了如何使用Radix-3算法进行离散傅里叶变换(DFT),并展示了混合Radix-2与Radix-3的DFT分解方法。通过C语言实现,对数据进行重排序,同时提供了验证程序确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DFT – Fast algorithms and C implementations - Part3


Radix-3 DFT

我在第一篇博客里分析了Radix-2 DFT的计算原理,并据此写出了Radix-2 DFT的代码,并验证了其有效性。现在我们有信心认为,只要有了公式,就能写出正确的程序,产生正确的结果!

下面我们推导一下Radix-3 DFT的公式,其实非常简单:

设N长序列\lbrace x_j \rbrace_{j<N}的DFT为\lbrace X_k \rbrace_{k<N},且N能被3整除,则:

\begin{align} X_k &=\sum_{j<N}{x_jW_N^{jk}} \nonumber \\ &=\sum_{j<N/3}{x_{3j}W_N^{3jk}}+\sum_{j<N/3}{x_{3j+1}W_N^{(3j+1)k}} +\sum_{j<N/3}{x_{3j+2}W_N^{(3j+2)k}}\nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \end{align}

\begin{align} X_{k+N/3} &=\sum_{j<N/3}{x_{3j}W_N^{3j(k+N/3)}}+\sum_{j<N/3}{x_{3j+1}W_N^{(3j+1)(k+N/3)}} +\sum_{j<N/3}{x_{3j+2}W_N^{(3j+2)(k+N/3)}}\nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_3^1W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_3^2 W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \end{align}

\begin{align} X_{k+2N/3} &=\sum_{j<N/3}{x_{3j}W_N^{3j(k+2N/3)}}+\sum_{j<N/3}{x_{3j+1}W_N^{(3j+1)(k+2N/3)}} +\sum_{j<N/3}{x_{3j+2}W_N^{(3j+2)(k+2N/3)}}\nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_3^2W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_3^4 W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \\ &= \sum{x_{3j}W_{N/3}^{jk}} + W_3^2W_N^k \sum{x_{3j+1}W_{N/3}^{jk}} + W_3^1 W_N^{2k} \sum{x_{3j+2}W_{N/3}^{jk}} \nonumber \end{align}

所以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这样的通用算法,所以我只能回到最笨的那个方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值