【问题标题】:Numpy fft.pack vs FFTW vs Implement DFT on your ownNumpy fft.pack vs FFTW vs 自己实现 DFT
【发布时间】:2015-02-26 20:28:36
【问题描述】:

我目前需要对 1024 个采样点信号运行 FFT。到目前为止,我已经在 python 中实现了我自己的 DFT 算法,但是速度很慢。如果我使用 NUMPY fftpack,甚至转向 C++ 并使用 FFTW,你们认为会更好吗?

【问题讨论】:

  • 是的。 (此括号内的声明仅在此评论中包含超过 15 个字符。)
  • 是的...它会更容易维护(因为这不是你的责任)并使用更优化的实现(因为它的成熟时间要长得多)。只要您同意需要额外的依赖项,那么几乎没有理由构建自己的:-)
  • 但是你推荐哪一个,python 中的 numpy 或 fftw 或 c++ 中的 fftw。
  • 从 numpy 开始,所以你不必从头开始实现任何东西。看看它是否满足您的需求。

标签: python numpy fft fftw


【解决方案1】:

如果您完全在 Python 中实现 DFFT,您的代码运行速度将比您提到的任何一个包慢几个数量级。不仅因为这些库是用低得多的语言编写的,而且(尤其是 FFTW)它们编写得非常优化,充分利用了缓存局部性、向量单元以及书中的所有技巧,所以这并不奇怪如果他们以 10,000 倍于简单 Python 实现的速度运行。即使你在你的实现中使用了 numpy,它仍然会相形见绌。

所以是的;使用numpy的fftpack。如果这还不够快,您可以尝试 FFTW (PyFFTW) 的 python 绑定,但从 fftpack 到 fftw 的加速不会那么显着。我真的怀疑是否有必要仅仅为了 FFT 而使用 C++——它们是 Python 绑定的理想案例。

【讨论】:

    【解决方案2】:

    如果您需要速度,那么您想选择 FFTW,请查看pyfftw 项目。 为了使用处理器SIMD 指令,您需要对齐数据,而在numpy 中没有一个简单的方法可以做到这一点。此外,pyfftw 允许您使用真正的多线程,相信我,它会快得多。

    【讨论】:

    • 你知道pyfftw大约比fftpack快多少吗?
    【解决方案3】:

    如果您希望坚持使用 Python(处理和维护自定义 C++ 绑定可能很耗时),您可以选择使用 FFT 的 OpenCV's 实现。

    我整理了一个玩具示例,比较了 Python(Intel(R) Core(TM) i7-3930K CPU)中 OpenCV 的 dft() 和 numpy 的 fft2 函数。

    samplesFreq_cv2 = [
            cv2.dft(samples[iS])
            for iS in xrange(nbSamples)]
    
    samplesFreq_np = [
            np.fft.fft2(samples[iS])
            for iS in xrange(nbSamples)]
    

    按顺序将 20000 个不同分辨率的图像块从 20x20 转换为 60x60 的结果:
    Numpy 的 fft2:1.709100 秒
    OpenCV 的 dft:0.621239 秒

    这可能不如绑定到像 fftw 这样的专用 C++ 库那么快,但它是一个相当容易实现的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2017-12-02
      • 2017-09-08
      相关资源
      最近更新 更多