scipy 的 fft 函数中似乎没有任何函数可以执行此操作(请参阅http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html 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(Resident Set Size)为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.1.0。
使用“fft.rfft(v)”计算实值只会产生 1.3GB RSS。 (几乎一半,如预期)
Doing:
>>> f = complex64(fft.fft(v))
是两全其美的,因为它首先计算complex128版本(2.3GB),然后将其复制到complex64版本(1.3GB),这意味着我的机器上的峰值RSS是3.6GB,然后它稳定到1.3GB再次。
我认为如果你有 4GB RAM,这一切应该都可以正常工作(就像对我来说一样)。有什么问题吗?