过滤噪声角度信号

信息处理 过滤器 低通滤波器
2022-02-17 07:34:13

我收到一个角度信号,其值在 [-180..180] 范围内

现在我想随着时间的推移平滑该信号。我已经在需要平滑的其他一些值上非常成功地使用了1€ 过滤器。

然而,当从 -180 跳到 180 时,角度信号具有这种不连续性,反之亦然。如何防止任何过滤器在该关键过渡时失败。

就像例子一样。移动平均线会失败:

oldAngle = 179
currentAngle = -179

movingAvg = 0.9 * oldAngle + 0.1 * currentAngle  

会给我一些不好的结果。

3个回答

您用于低通的差分方程是

(1)xn=(1α)xn1+αun,
在哪里α是你的“遗忘因素”,un是您的输入,并且xn是你的低通滤波版本。

这适用于无限范围的数字(如您所见)。要使用角度到达您想去的地方,请将 (1) 重铸为

(2)xn=xn1+α(unxn1).

请注意,这在代数上具有相同的作用。还要注意,您已经明确区分了当前输入和最后一次报价的估计。

现在交叉手指,希望您的角度误差永远不会超过 180 度。如果这是正确的,那么您可以修改(2):

(3)xn=xn1+α((unxn1) mods 360).

只要mods. 您需要一个始终返回最小数量的模运算,即使它是负数。所以90 mods 360=90, 但270 mods 360=90.

我经常过滤角度,并且一直使用它。它工作得很好。

不同的语言和库以不同的方式实现模函数(一些旧版本的 C 并没有具体说明它们的作用;如果其他语言也不是这种情况,请不要感到惊讶)。因此,是否正确取决于您。在 Python 和带有整数的 C/C++ 中,我认为这可行:

result = (x + 180) % 360 - 180;

但是你应该以此为出发点并从那里弄清楚

蒂姆的回答很好,但我会给出另一种选择。

试着转动角度,θn变成一个复数:

yn=cos(θn)+jsin(θn)

然后对其应用平滑滤波器:

zn=(1α)zn1+αyn
然后找到角度zn

xn=arg(zn)

您可以使用numpy.unwrap删除角度信号中的不连续性。您可能需要通过添加临时偏移量和 set 将边界调整为 [0, 359] period=360一旦信号被解包,执行你的过滤器并在需要时使用类似的东西重新包装它

wrapped_phases = (unwrapped_phases + 180) % (360) - 180.