如何低通过滤角度值

时间:2018-04-22 16:09:58

标签: java math geometry filtering computational-geometry

我正在从弧度传感器接收角度更新,我想通过低通滤波功能将它们传递给它,以便因噪声而略微平滑它们。

我的低通滤波器功能如下所示

protected void lowPass(float alpha, double[] input, double[] output) {
    for (int i = 0; i < input.length; i++) {
        output[i] = alpha * output[i] + (1 - alpha) * input[i];
    }
}

它适用于大多数部件。

问题在于有时角度“走圆圈”,例如从2π到0,0到-2π等。当然这导致“不正确”的输出,因为滤波器函数将2π和0简单地视为6.28和0.0。

如何实现能够正确处理这些角度的滤镜功能?

3 个答案:

答案 0 :(得分:2)

angle averaging使用了一种有趣的方法。

得到角度α的余弦和正弦值(作为该角度的矢量分量)并使用它们进行单独滤波,然后获得结果矢量的角度

 cosa = alpha * cos(output) + (1 - alpha) * cos(input);
 sina = alpha * sin(output) + (1 - alpha) * sin(input);
 output = atan2(sina, cosa)

答案 1 :(得分:1)

对于像这样的指数平滑,最简单的方法是从每个输入中加上或减去2 * pi,使其尽可能接近上一个平滑值。或者,等效地,在平滑到输入之前,从先前输出中加上或减去2 * pi。在任何一种情况下,您的输出都可以暂时超出[0,2 * pi]范围,因此如果需要,请务必回到该范围内。

顺便提一下,您的代码有一个错误,因为它从错误的输出索引读取,并且无法正常使用第一个时间值。

答案 2 :(得分:1)

您需要执行相位展开,即恢复周期性发生的2π跳跃。为此,您可以检测到异常,例如接近2π的值,紧接着是接近0的值,反之,并进行补偿。

请注意,如果值以较大的增量(例如大于π)变化,则跳跃是不可恢复的。

请参阅phase unwrap issue (the unwrapping of the phases is not correcly)?