划分NumPy数组时出现MemoryError

时间:2018-12-16 10:49:03

标签: python numpy pyaudio

我正在尝试计算信号的脉冲响应。这是代码:

def impulse_response(self):
    # Inverse filter:
    T = self.recorded_data.shape[0] / self.samplerate
    t = np.arange(0, T*self.samplerate - 1) / self.samplerate
    R = np.log(20/20000)
    k = np.exp(t*R/T).astype(np.float32)
    f = self.recorded_data[::-1] / k  # Gives an MemoryError
    # Impulse response:
    return sig.fftconvolve(self.recorded_data, f, mode="same")

计算过滤器f时的除法给出MemoryError。 self.recorded_data是15秒的正弦扫描,其采样率为44100Hz,其大小为2822400字节。 k的大小为2822396字节(两个数组均为32位浮点数)。我认为这些数组没有那么大,所以划分它们并不是问题。分割的方式有问题吗?也许有一种更有效的方法来做到这一点?还是应该使用其他数据类型?

我使用https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.nbytes.html

找到的数组大小

在我的transfer_function()函数中划分NumPY数组时,我得到了相同的错误,所以我猜它是同样的问题。

我从https://dsp.stackexchange.com/questions/41696/calculating-the-inverse-filter-for-the-exponential-sine-sweep-method那里获得了代码

顺便说一句,我的计算机有8GB的RAM。

谢谢您的回答!

1 个答案:

答案 0 :(得分:0)

我现在通过从-1中删除t = np.arange(0, T*self.samplerate - 1) / self.samplerate使它工作。看我从中复制的代码,我不知道它是怎么到达那里的! k不应比self.recorded_data短1个样本,所以我得到了这个错误:ValueError: operands could not be broadcast together with shapes (661500,) (661499,)。我必须更加小心地仔细检查正在使用的数据的维度...