首先,这是我第一次尝试制作Kalman滤波器。
我之前曾在StackOverflow上发布了以下问题,即从速度值中滤除噪声和变化,该问题描述了本文的背景。这是我尝试过滤的典型值示例。他们不必一定要减少这种情况。但是变化率通常是这样的
X ------- Y
16 --- 233.75
24 --- 234.01
26 --- 234.33
32 --- 234.12
36 --- 233.85
39 --- 233.42
47 --- 233.69
52 --- 233.68
55 --- 233.76
60 --- 232.97
66 --- 233.31
72 --- 233.99
我已经按照以下教程实现了我的Kalman过滤器:Kalman Filter for Dummies。
我的实现看起来像这样(伪代码)。
//Standard deviation is 0.05. Used in calculation of Kalman gain
void updateAngle(double lastAngle){
if(firsTimeRunning==true)
priorEstimate = 0; //estimate is the old one here
priorErrorVariance = 1.2; //errorCovariance is the old one
else
priorEstimate = estimate; //estimate is the old one here
priorErrorVariance = errorCovariance; //errorCovariance is the old one
rawValue = lastAngle; //lastAngle is the newest Y-value recieved
kalmanGain = priorErrorVariance / (priorErrVariance + 0.05);
estimate = priorEstimate + (kalmanGain * (rawValue - priorEstimate));
errorCovariance = (1 - kalmanGain) * priorErrVariance;
angle = estimate; //angle is the variable I want to update
} //which will be lastAngle next time
我开始时先估计为0。这似乎很好。但是我注意到的是,每次运行此更新时,kalmanGain都会减少,这意味着我相信我的新值越少,运行过滤器的时间就越长(?)。我不要
我从仅使用移动平均值(简单和指数加权)转向使用此方法。现在,我什至无法获得那么好的结果。
我的问题是这是否是正确的实现方式,并且根据我发布的样本值,我先前的误差方差和标准偏差是否看起来不错?我的参数实际上是随机选择的,以查看是否可以获得一些良好的结果。我尝试了几种不同的范围,但效果不佳。如果您有任何建议可以改变,我将不胜感激。很抱歉,如果缺少一些明显的东西。也是第一次在这里发布。