Не похоже, что в функциях fft scipy есть какая-либо функция для этого (см. http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html).
Если вы не можете найти библиотеку FFT с фиксированной точкой для python, маловероятно, что нужная вам функция существует, поскольку ваш собственный аппаратный формат с плавающей запятой составляет 128 бит. Похоже, что вы могли бы использовать метод rfft, чтобы получить только компоненты с действительными значениями (без фазы) БПФ, и это сэкономило бы половину вашей оперативной памяти.
Я выполнил следующее в интерактивном питоне:
>>> 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'>
На данный момент RSS (размер резидентного набора) Python составлял 265 МБ.
f = fft.fft(v)
И на данный момент RSS python 2.3GB.
>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0])
<type 'numpy.complex128'>
>>> v = []
И в этот момент RSS уменьшается до 2,0 ГБ, так как я освободил v.
Использование "fft.rfft(v)" для вычисления действительных значений приводит только к RSS размером 1,3 ГБ. (почти половина, как и ожидалось)
Делает:
>>> f = complex64(fft.fft(v))
Является худшим из обоих миров, поскольку сначала вычисляет версию complex128 (2,3 ГБ), а затем копирует ее в версию complex64 (1,3 ГБ), что означает, что пиковый RSS на моей машине составлял 3,6 ГБ, а затем он снизился до 1,3 ГБ. снова.
Я думаю, что если у вас 4 ГБ ОЗУ, все должно работать нормально (как у меня). В чем проблема?
person
slacy
schedule
06.03.2009