当信号不是从 0 开始时,低通滤波会反弹

信息处理 低通滤波器
2022-01-28 20:32:52

假设我有一个表示信号的数组,从 30 到 -30 以 1000 为增量,在这些值上有一点噪音。如果我应用任何低通滤波之王(Besset、Butterworth、Savitsky-Golay 等),那么第一个点现在非常接近于零,接下来的几个点在经过一些疯狂的振荡后逐渐达到 +30,具体取决于滤波器及其参数。

自从我上次深入研究 DSP 的数学以来已经有一段时间了(嗯,几十年),所以我有点生疏,想知道我应该怎么做。我认为解决方案是在过滤之前将我的数据窗口化,但它似乎并没有太大变化。

显然,我最终想要的是一个不错的 30 到 -30 的斜坡,并且消除了噪音。

1个回答

问题是由于最初,过滤器内存用零填充(如果没有另外说明)。由于滤波器输出是滤波器内存和输入的加权平均值,因此当初始状态设置为零时,它将在接近零的位置开始输出。

正如 Atul 建议的那样,您可以通过在序列的开头填充 30 来克服这个问题(在实际过滤感兴趣的序列之前填充内存)。但是,填充量取决于滤波器以及它调整到稳定状态的速度(取决于滤波器阶数和例如 Q 因子)

作为更优雅的解决方案,您可以初始化滤波器状态,使其第一个样本已经输出 30。您可以将滤波器状态计算为对于单位步长输入的稳态响应。例如 python 已经内置了这个功能:

signal = np.linspace(30, -30, 1000)
sigma = 1
signal = signal + sigma * np.random.randn(len(signal))

plt.plot(signal)
b, a = scipy.signal.butter(5, 0.1)
zi = scipy.signal.lfilter_zi(b, a)

filtered = scipy.signal.lfilter(b, a, signal, zi=30*zi)[0]
plt.plot(filtered, lw=2)

程序输出