首页 > 解决方案 > 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 计算永远不会完成,程序正在冻结。如果我更改14928281492827,它似乎工作。但是,如果我更改14928281492826,它仍然会冻结,这有点奇怪。

这是一个已知的错误?

笔记:

标签: pythonnumpyscipyfftfftpack

解决方案


通常的 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)))

推荐阅读