我正在实现filtfilt过滤器,但遇到了MemoryError。我尝试使用两台不同的计算机,但错误仍然存在。
File "C:\Users\UserName\lib\site-packages\scipy\signal\signaltools.py", line 3129, in filtfilt
zi = lfilter_zi(b, a)
File "C:\Users\UserName\lib\site-packages\scipy\signal\signaltools.py", line 2689, in lfilter_zi
IminusA = np.eye(n - 1) - linalg.companion(a).T
File "C:\Users\UserName\lib\site-packages\numpy\lib\twodim_base.py", line 201, in eye
m = zeros((N, M), dtype=dtype, order=order)
MemoryError
任何提示如何解决这个问题?我的数据不是很大(长度为3011723的一维数组)。我在python win63上使用Pycharm。我将非常感谢您的帮助。
这是发生错误的示例代码:
from numpy import arange, random
from scipy.signal import kaiserord, firwin, filtfilt
fs = 1000
data = random.uniform(size=3011723)
nyq_rate = fs / 2.0
# The desired width of the transition from pass to stop, relative to the Nyquist rate
width = 0.1/nyq_rate
# The desired attenuation in the stop band, in dB.
ripple_db = 100.0
# Compute the order and Kaiser parameter for the FIR filter.
N, beta = kaiserord(ripple_db, width)
# Use firwin with a Kaiser window to create a lowpass FIR filter.
taps = firwin(N, 300/nyq_rate, window=('kaiser', beta), pass_zero=True)
# Use lfilter to filter x with the FIR filter.
filtered_data = filtfilt(taps, 1.0, data)
最好, DTake
答案 0 :(得分:0)
当scipy.signal.filtfilt
尝试计算伴随矩阵时,会发生您的问题。对于中间计算,它将创建一个大小为(3011723, 3011723)
的数组,其大小大约为72563 GB
。显然,它无法放入内存中。
除了缩小样本量之外,我没有其他选择。