fft
我有一个使用ifft
很多的 MATLAB 程序。现在我想将它翻译成 C++ 进行生产。我使用了 OpenCV,但我注意到 OpenCV 的实现fft
比 MATLAB 慢 5 倍。然后我尝试了犰狳,但速度更慢。它比 MATLAB 慢 10 倍。现在我想知道在 C++ 中是否有任何实现fft
速度足以与 MATLAB 竞争?
C++中fft的最快实现?
我还在寻找要在 C++ 中使用的快速 FFT 库。让我分享一下我认为2019年的情况。
FFTW 是最流行的 FFT 库。它具有丰富的功能并且经常被用作参考点,但许多其他库具有相当或更好的性能。
现在可以自由再分发的英特尔 MKL库比 FFTW 快得多。我很好奇在非英特尔处理器上是否也是如此,但我没有要检查的。与 FFTW 一样,它具有丰富的功能。
KFR声称比 FFTW 快。在最新版本中,它是混合基数实现。它是唯一用 C++ 编写的,其他通常是用 C 编写的。
据报道, FFTS(南)和 FFTE(东)比 FFTW 快,至少在某些情况下是这样。FFTE 实际上是在 Fortran 中,但我认为无论如何都值得一提。
muFFT 和pffft 具有与FFTW 相当的性能,同时更简单。性能很大程度上取决于所使用的 SIMD 指令。muFFT 有四个版本:no-SIMD、SSE、SSE3 和 AVX。pffft 还有四种变体:no-SIMD、SSE、AltiVec 和 NEON。这些库不具备 FFTW 和 MKL 的所有功能。muFFT 仅支持大小 2^N,pffft 支持基数 2、3 和 5。
还有一个比较流行的库KissFFT,这里是最简单但也是最慢的一个。以及numpy.fft的传入版本所基于的 PocketFFT。它们速度较慢,因为它们不使用 SIMD 指令。但在某些情况下,它们值得考虑。例如,当代码要编译为 WebAssembly 时,它无论如何都不支持 SIMD。
我在这里写下了我的(相当有限的)基准测试中的数字:
https ://github.com/project-gemmi/benchmarking-fft/
我赞同 fftw 的建议。fftw 的一大优点是“智慧”。也就是说,如果您多次调用相同的傅立叶变换(具有相同的数组大小),您可以要求 fftw 寻找最快的方法来执行此操作,然后它将使用该方法进行代码中的所有后续计算。