如果我的 FFT 不使用 2 点的幂,我会得到不太准确的结果吗?

信息处理 fft
2022-02-14 23:16:47

我听说用零填充主要是为了效率和速度,除此之外,使用 fft(signal) 而不是 fft(signal, N) 是否有缺点,其中 N 是 2 的幂,假设信号长度不是幂2. 谢谢

2个回答

假设一个正确的实现,并丢弃你通过执行不同的操作序列得到的小的舍入差异,不,如果你稍微将你的 DFT 长度填充到 2 的下一个幂,那么准确性并没有实质性下降。它是否结束然而,实际上是否更快取决于您的实施。这是为什么?

一个非常常见的误解是,只有一个快速傅里叶变换算法,并且您必须使用 2 的幂才能获得最佳性能。如果您查找 FFT 算法的描述,您会经常看到对 radix-2 时间抽取或频率抽取技术的解释,可能是因为它们最容易说明。然而,即使是开创性的 FFT 技术,Cooley-Tukey 算法,通常也将 FFT 大小分解为更小的数字,而不仅仅是 2 的幂。

使用良好的 FFT 库,如果您的 FFT 大小可以分解为许多小的素因子,您将获得最佳性能。然后,FFT 库将为这些素数中的每一个优化 DFT 内核的实现,然后可以适当地重新组合以产生完整的 DFT 输出集。正如我在对另一个问题的评论中提到的那样,现代图书馆通常会为所有约 13 及以下的主要因素提供良好的性能。

话虽如此,您可能会发现通过填充到 2 的下一个幂,您的变换可能会变慢如果您已经在使用您的库实现非常适合的 FFT 大小,那么您只是通过填充大小来为自己添加额外的工作。判断这一点的最佳方法是对一些候选尺寸进行基准测试,看看哪个在您的平台上表现最好。如果您必须自动选择一个好的 FFT 大小,那么根据您的库支持的基数的特征,您可以选择具有适当质因数集的下一个大小。

好吧,我想我可以为这个问题给出一个合适的答案,因为我正在处理 LTE 3ggp 中的一项任务,其中我必须计算 1536 的 FFT,这不是 2 的幂。如果您的输入长度是 2 的幂意味着您可以轻松地使用 radix2 fft 算法来计算 dft。但是,如果您的长度不是任何数字的倍数,例如在我的情况下是 1536,则您不能使用一种算法,您必须将其拆分并使用多种算法,是的,它可能会增加计算成本。你必须仔细寻找它。如果你真的感兴趣,我建议你去看看这个文档,因为它理解起来非常耗时,而且用 C 编程更麻烦。 http://www.freescale.com/files/dsp/doc/app_note/ AN3680.pdf