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冻结的主要内容,如果未能解决你的问题,请参考以下文章