scipy.lfilter的替代

问题描述

是否可以在scipy中使用lfilter的替代实现?我想使用cusignal库,目前不支持lfilter。

这是我当前要加快的代码

from scipy import signal
import numpy as np

data = np.random.rand(192,334)
a = [1,-1.086740193996892,0.649914553946275,-0.124948974636730]
b = [0.054778173164082,0.164334519492245,0.054778173164082]

x[range(0,len(x)),:] = signal.lfilter(b,a,x[range(0,:])

是否可以使用numpy的卷积函数或scipy的fftconvolve或firfilter来执行此操作?最终,我想比当前版本更快地执行上述代码片段。

任何想法或想法都会受到赞赏!

解决方法

即使您的滤波器原则上是无限冲激响应(IIR)滤波器,但该特定滤波器的冲激响应衰减非常快。您可以通过使用lfilter(b,a,[1] + [0]*99)之类的lfilter对其运行脉冲来计算脉冲响应。这是我得到的:

impulse response plot1

如您所见,抽头在样本20左右上方几乎为零。因此,您可以对脉冲响应进行前20个采样,以得出精确的截断FIR近似值。从那里,您可以将FIR近似与任何FIR滤波功能一起应用,例如np.convolve,scipy.signal.convolve或scipy.signal.fftconvolve。

另一个想法:使用这些过滤功能中的任何一个,您都可以尝试将所有args强制转换为np.float32。他们可能会在内部切换到比64位浮点实现快的32位浮点实现。