为了账号安全,请及时绑定邮箱和手机立即绑定

scipy.lfilter 的替代品

scipy.lfilter 的替代品

凤凰求蛊 2024-01-12 10:41:34
有没有办法在 scipy 中替代 lfilter 的实现?我想使用 cusignal 库,但目前不支持 lfilter。这是我当前想要加速的代码:from scipy import signalimport numpy as npdata = 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 的 convolve 函数或 scipy 的 fftconvolve 或 firfilter 来执行此操作?最终,我希望比当前版本更快地执行上面的代码片段。任何想法或想法将不胜感激!
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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

https://img1.sycdn.imooc.com/65a0a7470001e55606430395.jpg

正如您所看到的,在样本 20 左右以上,抽头几乎为零。因此,您可以获取脉冲响应的前 20 个样本来进行精确的截断 FIR 近似。从那里,您可以将 FIR 近似与任何 FIR 滤波函数一起应用,例如 np.convolve、scipy.signal.convolve 或 scipy.signal.fftconvolve。

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


查看完整回答
反对 回复 2024-01-12
  • 1 回答
  • 0 关注
  • 30 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信