替代 scipy.lfilter

Alternative to 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.164334519492245,0.054778173164082]

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

有没有办法可以使用 numpy 的卷积函数或 scipy 的 fftconvolve 或 firfilter 来执行此操作?最后,我想比当前版本更快地执行上面的代码片段。

如有任何想法或想法,我们将不胜感激!

尽管原则上您的滤波器是无限脉冲响应 (IIR) 滤波器,但此特定滤波器的脉冲响应衰减得非常快。您可以通过 运行 脉冲响应和 lfilter 来计算脉冲响应,例如 lfilter(b, a, [1] + [0]*99)。这是我得到的:

如您所见,样本 20 左右的抽头几乎为零。因此,您可以采用脉冲响应的前 20 个样本来进行准确的截断 FIR 近似。从那里,您可以将 FIR 近似值应用于任何 FIR 滤波函数,例如 np.convolve、scipy.signal.convolve 或 scipy.signal.fftconvolve.

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