我有一个MATLAB程序,经常使用fftifft。现在,我想将其转换为C ++进行生产。我使用了OpenCV,但是我注意到OpenCV的fft的实现比MATLAB的慢5倍。然后我尝试了犰狳,但是它甚至更慢。它比MATLAB慢10倍。现在我想知道是否有足够快的C ++中的fft实现可以与MATLAB竞争?

评论

取决于处理器,处理器数量,高速缓存,内存系统,数据类型和FFT大小。但是请看一下fftw和Accelerate / vDSP入门。

还取决于您可以或想要使用哪个许可证和/或您是否愿意支付。 FFTW已通过GPL认证,但也可以购买商业许可证。

#1 楼

Matlab的fft函数全部基于FFTW(已在此处确认),因此我想对您来说显而易见的选择应该是FFTW。 FFTW与硬件无关,但是可以利用某些特定于硬件的功能。

评论


$ \ begingroup $
我要补充一点,FFTW确实非常快,但是您必须使用适当的选项对其进行编译才能利用所有优化。像SSE指令一样,OpenMP和MPI支持以及其他一些支持。
$ \ endgroup $
–Loufylouf
15年6月26日在8:29

#2 楼

我也在寻找可以从C ++使用的快速FFT库。
让我分享我认为2019年的情况。

FFTW是最受欢迎的FFT库。它具有丰富的功能,通常用作参考点,但是许多其他库具有可比或更好的性能。

英特尔MKL库(现在可以自由重新分发)了比FFTW更快。我很好奇在非Intel处理器上是否也是如此,但是我没有一个要检查的。与FFTW一样,它具有丰富的功能。

KFR声称比FFTW更快。在最新版本中,它是混合基数实现。这是唯一用C ++编写的代码,其他通常是用C语言编写的。

据报道,FFTS(South)和
FFTE(East)比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,它是最简单但也是最慢的库。 PocketFFT,numpy.fft的传入版本将基于该版本。由于不使用SIMD指令,因此速度较慢。但是在某些情况下,它们值得考虑。例如,当要将代码编译为始终不支持SIMD的WebAssembly时。

我在这里(但数量有限)的基准测试中写下了数字:https://github.com/project- gemmi / benchmarking-fft /

评论


$ \ begingroup $
我很好奇为什么没有FFTN?
$ \ endgroup $
–分歧
19年4月4日在0:47

#3 楼

我第二个建议。 fftw的一个不错的功能之一就是“智慧”。也就是说,如果您多次调用相同的傅立叶变换(具有相同的数组大小),则可以要求fftw寻找最快的方法,然后它将用于代码中的所有以下计算。

#4 楼

还有FFTS(虽然是用C编写,不是用C ++编写),但它具有一些令人印象深刻的基准:

https://github.com/anthonix/ffts

我编译了它在Linux下运行,但还没有机会使用它。

#5 楼

我最常使用的两个是:

Ooura FFT:http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html

IPP:https://software.intel.com/zh-cn/intel-ipp

您必须支付IPP许可证(英特尔性能基元)的费用,但这将是商业产品的选择。 Ooura FFT具有良好的全面性能和许可许可证。在MAC上,我认为Apple具有免费的FFT例程,其性能可与IPP / FFTW媲美。

请注意,依靠基准测试可能会过时或过分关注某些可能会或可能不会的某些用例适用于您的用例。