为什么巴特沃斯滤波器总是从零标记(幅度)开始我的信号?

信息处理 matlab 过滤器 低通滤波器
2022-01-28 00:36:47

我正在尝试使用巴特沃斯低通滤波器过滤我的力信号。在此处输入图像描述

所以这是信号,我必须过滤(噪声频率约为 33 Hz)。因此,当我在 MATLAB 中使用带有以下命令的 Butterworth 滤波器时(六阶):

[B,A]=butter(6,5/100,'low');
forceS=filter(B,A,forceS);

我得到的结果是 在此处输入图像描述

所以问题是滤波后的信号从零标记开始,而不是从 1.5 左右开始。如何从与未过滤信号相同的值开始过滤信号?

谢谢

1个回答

滤波器确实有延迟(滞后),因为它们不会立即对您的信号起作用。此外,时间 0 之前的所有样本都是零,因此通常您将从“零标记”开始,正如您所说(想象一下您的滤波器方程全为零)。

有一些方法可以使过滤器具有零延迟。它是通过所谓的零相位滤波来完成的,也称为前向后向滤波。你这样做的方式是通过两次过滤你的信号 - 向前和向后方向。显然,这仅适用于离线应用程序。在 MATLAB 中,您可以使用filtfilt函数非常轻松地完成此操作。

请在下面找到与您的案例相对应的代码。

fs = 100;
T = 2;
t = 0:1/fs:T;
f = 2;
s = 1.5*cos(2*pi*f*t) + 0.7*sin(2*pi*33*t);

[B,A]=butter(6, 5/fs,'low');
S=filter(B, A, s);
Sff=filtfilt(B, A, s);

plot(t, s)
hold on
plot(t, S)
plot(t, Sff)
grid on
legend({'Original signal', 'Signal filtered using filter', 'Signal filtered using filtfilt'})

这产生了我怀疑你想要的东西:

在此处输入图像描述