卡尔曼滤波器行为异常的定点实现

Fixed point implementation of Kalman filter behaving strangely

我已经实现了几个跟踪正弦波的线性卡尔曼滤波器的实现。我有一个 Python 和一个 C 实现,它们都可以工作。

然而,我也开发了一个使用定点实现的版本并且它可以工作,但我看到一个奇怪的效果,它最初似乎适合,然后与其他卡尔曼滤波器代码的输出不同。

见下图:

我想知道是否有人对定点实施中可能出现的问题有一些直觉?

希望您现在已经解决了这个问题,但是,以防万一 - 这就是我通常对定点 KF 所做的事情。问题源于可用值的有限范围。如果我们设置不动点使得初始协方差矩阵是可表示的,我们通常不会在小数点右边有很多位来表示解开始收敛后的增益和状态更新。

这是一个很长的说明显而易见的方法 - 我们喜欢过滤器的浮点数 - 特别是因为协方差矩阵是平方标准差 - 如果你愿意,它正在逐步通过数量级 'quickly' ,虽然状态更新不是平方的 - 所以我们试图 select 一个单一的固定点位置,使我们能够合理地表示平方协方差元素和非平方状态更新。

所以我经常以一两个换档结束 - 我过去用过最多“5 速”定点 KF。当我到达时间更新步骤的末尾时 - 我将获得该周期的协方差的最大值。测量处理只会降低协方差。如果我的卡尔曼滤波器定点表示比我需要的协方差大 2 位以上,我向左移动并即时更改定点。这为增益和状态更新值保留了合理数量的位数。

这实际上是一个穷人的浮点数,但我对所有过滤器元素只有一个小数点位置。我使用一些滞后来防止一直移动。当我让它正常工作时——我无法区分定点和浮点结果——这或多或少是我们应该期望的,因为它是 "floating the point".