Python 黄油过滤痕迹中的时间延迟,为什么以及如何消除?

Python 黄油过滤痕迹中的时间延迟,为什么以及如何消除?,python,filtering,Python,Filtering,我正在使用scipy.signal中的butter过滤python中的时间跟踪。这里我使用低通滤波器(例如,在以10000点/秒采样的嘈杂的100 Hz正弦上),但以下情况适用于任何滤波器(低、高、频带) 过滤后的跟踪始终相对于原始跟踪有延迟(见图)。该延迟取决于滤波器的参数(频率、阶数) 你有(简单的)解释为什么会有这种延迟吗?有可能通过编程消除它吗?目标是使过滤后的跟踪正好位于原始跟踪的顶部。如果我切掉过滤轨迹的前N个点,这可能没问题,但N作为过滤参数的函数是多少 我使用的代码基于: 信号

我正在使用
scipy.signal
中的
butter
过滤python中的时间跟踪。这里我使用低通滤波器(例如,在以10000点/秒采样的嘈杂的100 Hz正弦上),但以下情况适用于任何滤波器(低、高、频带)

过滤后的跟踪始终相对于原始跟踪有延迟(见图)。该延迟取决于滤波器的参数(频率、阶数)

你有(简单的)解释为什么会有这种延迟吗?有可能通过编程消除它吗?目标是使过滤后的跟踪正好位于原始跟踪的顶部。如果我切掉过滤轨迹的前N个点,这可能没问题,但N作为过滤参数的函数是多少

我使用的代码基于:

信号和滤波器在哪里

ra = .1*randn(10000) + np.sin(2*np.pi*100*arange(10000)/10000.)
lowpass_filter(ra, 200.,  10000., order=4)

我相信你想要的是系统的相位响应波德图。您可以在您的系统上使用,即:

from scipy.signal import bode
w, mag, phase = bode((b, a))
其中
b
a
是您的滤波器系数。令人困惑的是,
w
以rad/s为单位,
phase
以度为单位<代码>阶段是您看到的转变。将时间偏移除以频率(度/秒)。您可能希望将自己的
w
传递给bode,以获得所需的频率范围


有关教程,请参见示例。

这是butterworth过滤的一个众所周知的现象,因此您可能希望在butterworth filter time delay上搜索一些提示,了解为什么会发生这种情况以及如何取消或调整。如果我没有被打败的话,我以后可能会发布一个答案。@MikeSatteson这并不仅仅局限于Butterworth过滤器。。。事实上,几乎没有任何类型的数字或模拟滤波器不引入延迟。诚然,有些人的延迟比其他人短,但事实是,如果你打算基于多个输入样本计算输出,那么根据定义,将引入延迟…@twalberg同意这一点,这一点很重要。我加上巴特沃斯,因为这似乎是在这个案例中应用的过滤器,也许我应该做一个更一般的陈述。感谢您对本讨论的扩展。@MikeSatterson:phase是一个数组。我能否将延迟作为
阶段
中的单个数字获取?我想用
plot(time\u array,signal\u array)
plot(time\u array+delay,signal\u array\u filtered)
来绘制信号。可能吗?谢谢。@fpdx如果你看一下,你会发现它非常灵活。你应该能够传递一个由你感兴趣的频率组成的“数组”,并得到该频率的结果。
from scipy.signal import bode
w, mag, phase = bode((b, a))