计算大小约为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位上使用64位的Python 2.7.15:
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)]
答案 0 :(得分:2)
如here所解释的那样,对于具有小素因子的长度,通常的FFT算法要快得多。
解决方案是将数组填充到下一个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)))