scipy.fftpack的FFT冻结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scipy.fftpack的FFT冻结相关的知识,希望对你有一定的参考价值。

在计算大小约为150万件的数组的FFT时:

import numpy as np
from scipy.fftpack import fft

x0 = np.ones(1492828, dtype=np.int32)
fft(x0)
print 'hello'

FFT计算永远不会完成,程序正在冻结。如果我将1492828改为1492827,它似乎有效。但是,如果我将1492828改为1492826,它仍会冻结,这有点奇怪。

这是一个已知的错误?

注意:

  • CPU保持在25%(正常,我有一个4核CPU),Python进程的RAM使用率保持在~75 MB
  • 我在Windows 7 64位上使用Python 2.7.15 64位: print scipy.__version__ # 1.1.0 print sys.version # 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
答案

对于具有小素因子的长度,通常的FFT算法要快得多,如here所述。

解决方案是将阵列零填充到下一个2的幂:

def zeropad_nextpoweroftwo(A):
    return np.concatenate([A, np.zeros(int(2 ** np.ceil(np.log2(len(A))))-len(A), 
        dtype=A.dtype)])

或者,更简单/更好的解决方案是使用next_fast_len以及fftpack.fft的第二个参数允许自动进行零填充:

fftpack.fft(a, next_fast_len(len(a)))

以上是关于scipy.fftpack的FFT冻结的主要内容,如果未能解决你的问题,请参考以下文章

scipy.fftpack fft

scipy-图片处理

提高 Python 中的 FFT 性能

Matlab fft 和 Scipy fft 的 FFT 结果略有不同

来自近乎完美的正弦曲线的奇怪 FFT 频谱

如何从 2d FFT 计算波数域坐标