在 scipy 的 fft 函数中似乎没有任何函数可以执行此操作(请参阅http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html)。
除非您能够为 python 找到定点 FFT 库,否则您想要的函数不太可能存在,因为您的本机硬件浮点格式是 128 位。看起来您确实可以使用 rfft 方法来获取 FFT 的实值分量(无相位),这样可以节省一半的 RAM。
我在交互式 python 中运行了以下命令:
>>> from numpy import *
>>> v = array(10000*random.random([512,512,512]),dtype=int16)
>>> shape(v)
(512, 512, 512)
>>> type(v[0,0,0])
<type 'numpy.int16'>
此时python的RSS(驻留集大小)为265MB。
f = fft.fft(v)
而此时python的RSS为2.3GB。
>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0])
<type 'numpy.complex128'>
>>> v = []
在这一点上,RSS 下降到 2.0GB,因为我已经释放了 v。
使用“fft.rfft(v)”计算实数值只会产生 1.3GB 的 RSS。(几乎一半,正如预期的那样)
正在做:
>>> f = complex64(fft.fft(v))
两全其美,因为它首先计算 complex128 版本(2.3GB),然后将其复制到 complex64 版本(1.3GB),这意味着我机器上的峰值 RSS 为 3.6GB,然后稳定到 1.3GB再次。
我认为如果你有 4GB RAM,这一切都应该很好(就像它对我一样)。有什么问题?