我正在从弧度传感器接收角度更新,我想通过低通滤波功能将它们传递给它,以便因噪声而略微平滑它们。
我的低通滤波器功能如下所示
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。
如何实现能够正确处理这些角度的滤镜功能?
答案 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)?。