分割NumPy数组时出现MemoryError



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

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的内存。

谢谢你的回答!

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

最新更新