scipy.fftpack的FFT冻结

问题描述 投票:0回答:1

在计算大小约为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)]
python numpy scipy fft fftpack
1个回答
2
投票

对于具有小素因子的长度,通常的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)))
© www.soinside.com 2019 - 2024. All rights reserved.