我正试图计算信号的脉冲响应。这是代码:
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,)
。我必须更加小心地仔细检查我正在处理的数据的二元数。。。