我正在尝试计算信号的脉冲响应。这是代码:
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数组时,我得到了相同的错误,所以我猜它是同样的问题。
顺便说一句,我的计算机有8GB的RAM。
谢谢您的回答!
答案 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,)
。我必须更加小心地仔细检查正在使用的数据的维度...