如何在python中对信号应用过滤器

Posted

技术标签:

【中文标题】如何在python中对信号应用过滤器【英文标题】:How To apply a filter to a signal in python 【发布时间】:2012-11-24 06:56:23 【问题描述】:

python 中是否有任何准备好的函数来对给定信号应用滤波器(例如巴特沃斯滤波器)? 我在 'scipy.signal' 中寻找这样的功能,但我没有找到比过滤器设计更有用的功能。 实际上我希望这个函数将滤波器与信号进行卷积。

【问题讨论】:

你试过什么? lfilter 可以实现您梦想的任何 LTI 过滤器。 另见:scipy.org/Cookbook/ButterworthBandpass、scipy.org/Cookbook/FiltFilt、scipy.org/Cookbook/FIRFilter、scipy.org/Cookbook/ApplyFIRFilter 【参考方案1】:

是的!有两个:

scipy.signal.filtfilt
scipy.signal.lfilter

还有一些卷积方法(convolvefftconvolve),但这些方法可能不适合您的应用,因为它涉及 IIR 滤波器。

完整代码示例:

b, a = scipy.signal.butter(N, Wn, 'low')
output_signal = scipy.signal.filtfilt(b, a, input_signal)

您可以在文档中阅读有关参数和用法的更多信息。一个问题是Wn 是奈奎斯特频率的一小部分(采样频率的一半)。因此,如果采样率为 1000Hz,而您想要截断 250Hz,则应使用Wn=0.5

顺便说一句,对于大多数应用程序,我强烈建议使用filtfilt 而不是lfilter(在Matlab 中称为filter)。正如documentation 所说:

此函数两次应用线性过滤器,一次向前,一次向后。组合滤波器具有线性相位。

这意味着输出的每个值都是输入中“过去”和“未来”点的函数。因此它不会滞后输入。

相比之下,lfilter 仅使用输入的“过去”值。这不可避免地会引入时间滞后,这将取决于频率。当然有一些应用程序需要这样做(特别是实时过滤),但大多数用户使用filtfilt 会好得多。

【讨论】:

以上是关于如何在python中对信号应用过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA 中对断开连接的 ADODB 记录集应用过滤器

如何在 Mongodb 中对多个数组使用聚合映射和过滤器

如何在Vue中对对象数组进行排序和过滤

Python中的信号过滤

在 python 中逐步过滤/平滑信号(到左边的直线到右边没有过滤)

如何在 React 中对给定的数据进行排序和过滤?