为何Scipy Butterworth滤波器无延迟而自定义实现有延迟?
Butterworth滤波延迟问题分析
图表1说明
- 橙色:原始信号(original signal)
- 蓝色:应用Scipy的Butterworth滤波器后的信号
- 灰色:应用自定义实现的Butterworth滤波器后的信号

图表2说明
- 橙色:同一原始信号
- 蓝色:应用另一种自定义实现的Butterworth滤波器后的信号

问题
两种自定义实现的滤波器均存在延迟,但Scipy的实现却无延迟,其实现技巧是什么?
注:自定义实现结果不同是因为二者系数不一致。
解答
Scipy实现无延迟滤波的核心是零相位滤波(Zero-phase filtering),通过scipy.signal.filtfilt函数完成,具体逻辑如下:
- 先对原始信号做正向单次滤波,得到带延迟的中间结果;
- 将中间结果反转后,再做一次反向单次滤波;
- 最后把反向滤波的结果再次反转,得到最终输出。
这种双向滤波的操作会完全抵消滤波器本身的群延迟——正向滤波产生的相位偏移会被反向滤波的偏移完全补偿,最终输出信号和原始信号的相位完全对齐,视觉上就看不到延迟了。
而你自定义实现的应该是单次单向滤波(类似scipy.signal.lfilter的逻辑),这类方法只会对信号做一次单向处理,滤波器固有的群延迟会直接体现在输出中,导致信号滞后。
需要注意的是:零相位滤波相当于对信号应用了两次滤波器,会改变幅值响应;同时这种方法只能用于离线数据处理,无法适配实时流式信号的处理场景。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

