需要:Python 中的 FFT 实现使用预分配的缓冲区来存储结果

needed: FFT implememtatin in Python using preallocated buffer to store results

我正在编写一个 python 应用程序,它将进行大量 FFT 转换(音频分析),我的采样音频存储在 float32 numpy 数组中。 起初,我认为找到一个开箱即用的 FFT 函数会很直接,比如这个:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.fft.rfft.html#numpy.fft.rfft

但是,我没有找到任何需要预分配数组来存储 FFT 结果(频域)的函数

A 假设这意味着每次我 运行 fft,它将分配另一部分内存来存储频谱,我认为这是一个问题,考虑到它必须 运行.

我真正需要的是一个 FFT 实现,我将能够提供一个预分配的数组来填充结果,使内存消耗更易于管理。

你有什么想法吗?

这些内存问题真的有这么大的问题吗? (如果是的话,我想,标准库将不得不以某种方式解决它)。

那里有一些我可以使用的 C 库,但首先我想真正找到一种本机且无障碍的 python 方法来实现这一点。

谢谢!

不用担心内存消耗。一旦没有对它的引用,先前分配的内存将被释放。与进行 FFT 所需的时间相比,进行分配-解除分配的时间可以忽略不计。

这是一个快速测试 我调用 1000 次 FFT 并测量内存使用情况。没有增加。

import psutil, os

process = psutil.Process(os.getpid())

print process.get_memory_info()[0] / float(2 ** 20)# print memory usage
for _ in range(10):
    FFTSize=2**np.random.randint(16,20)
    A=np.fft.fft(np.exp(2j * np.pi * np.arange(FFTSize) / FFTSize))
    A=A*2
    B=np.exp(A)
    C=np.log(B)

print process.get_memory_info()[0] / float(2 ** 20)

内存应该不是问题。尽管在 Python 中释放内存的确切方式有点复杂,但出于实用目的,如果您 del 数组不再需要它时,您就不必再担心它了。

但是,可以将 FFT 写入现有数组(尽管它可能必须存储中间值,但这些值将很快被释放)。你可以这样做:

>>> import numpy as np
>>> inarray = np.random.random(1000)
>>> targarray = np.empty(len(inarray)//2+1, dtype='complex')
>>> testarray = targarray  # just for checking the array wasn't overwritten
>>> targarray[:] = np.fft.rfft(inarray)
>>> targarray is testarray
True

如果你真的想直接写入一个选定的数组,你可以使用pyfftw:

>>> import numpy as np
>>> import pyfftw
>>> inarray = np.random.random(1000)
>>> targarray = np.empty(len(inarray)//2+1, dtype='complex')
>>> testarray = targarray  # just for checking the array wasn't overwritten
>>> pyfftw.FFTW(inarray, targarray).execute()
>>> targarray is testarray
True