Kiss_fft是一个非常简单的 FFT 实现;这几乎是教科书。它通过分解 FFT 大小将较大的 DFT 分解为重复的较小 FFT。它针对基数 2、3、4 和 5 优化了蝶形函数。
2,3 和 5 蝴蝶是小素数,通常在因式分解时发现,但 radix-4 蝴蝶是一种优化的情况,与使用 radix-2 两次*相比,它节省了一些乘法。例如,对于 32 点 FFT,大小 32 被分解为 4x4x2 - 两个阶段kf_bfly4
后跟一个kf_bfly2
但是,这意味着您只能拥有一个kf_bfly2
阶段。如果您的 FFT 大小是 4 的倍数,那么您将不会有两个kf_bfly2
阶段,而是一个kf_bfly4
阶段。这也意味着该kf_bfly2
函数适用于长度为 1 的“数组”。
在代码中,声明是
static void kf_bfly2(kiss_fft_cpx * Fout, const size_t fstride, const kiss_fft_cfg st, int m)
其中Fout
是一个大小为 的“数组” m
,即始终为 1。蝶形循环结束Fout
,编译器当然无法进行数值分析来证明这一点m==1
。但由于这是最后一只蝴蝶,它经常被称为。
Q1)我的分析正确吗?kf_bfly2
确实是只用m==1
?
Q2)假设这确实是一个错过的优化,有两种可能的方法。我们可以直接m
从 中删除参数kf_bfly2
,或者我们可以将因子分析更改为因子 32 为 2x4x4(向前移动kf_bfly2
,对于大小为 4x4=16 的数组在顶层调用一次)。什么是最好的?
[*] radix-4 蝶形最终具有因子 +1、-1、+i 和 -i,它们可以被实现为加法和减法。请参阅为什么 Kiss_fft 的正向和反向 radix-4 计算不同?