python - 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 的 convolve 函数或 scipy 的 fftconvolve 或 firfilter 来执行此操作?最终,我想比当前版本更快地执行上面的代码片段。
任何想法或想法将不胜感激!
解决方案
尽管您的滤波器原则上是无限脉冲响应 (IIR) 滤波器,但此特定滤波器的脉冲响应衰减非常快。您可以通过使用 lfilter like 运行脉冲来计算脉冲响应lfilter(b, a, [1] + [0]*99)
。这是我得到的:
如您所见,样本 20 左右的抽头几乎为零。因此,您可以对脉冲响应的前 20 个样本进行准确的截断 FIR 近似。从那里,您可以将该 FIR 近似值与任何 FIR 滤波函数一起应用,例如 np.convolve、scipy.signal.convolve 或 scipy.signal.fftconvolve。
另一个想法:使用这些过滤功能中的任何一个,您都可以尝试将所有参数转换为 np.float32。他们可能会在内部切换到比 64 位浮点实现更快的 32 位浮点实现。
推荐阅读
- python - 使用多处理将数组添加到全局数组
- c++ - 为什么我在使用 Qt5 时会出现奇怪的崩溃,这取决于我创建应用程序实例的方式?
- wordpress - 升级到 Wordpress 5.7 后,对后期缩略图的主题支持停止工作
- python - 如何将工厂男孩实例转换为 json
- r - 为 S 形残差(正弦波曲线)选择哪种非线性回归
- openid-connect - 如何使遗留身份提供者与联合登录标准兼容?
- spring - 在实体中嵌入复杂对象
- git - 如何在 git 中获取子模块的当前提交 ID?
- typescript - 将自己的 vpc 添加到 ec2 实例的 Pulumi 代码
- python - 将列表合并为一个列表