Primeiro de tudo, é a primeira vez que tento fazer um filtro Kalman.
Anteriormente, postei a pergunta a seguir Filtre o ruído e as variações dos valores de velocidade no StackOverflow, que descrevem o plano de fundo desta publicação. Este é um exemplo típico de valores que estou tentando filtrar. Eles não precisam necessariamente diminuir, o que é o caso aqui. Mas a taxa de mudança é normalmente assim
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
Eu implementei meu Kalman Filter de acordo com este tutorial: Kalman Filter for Dummies .
Minha implementação é assim (pseudocódigo).
//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
Começo com uma estimativa prévia de 0. Isso parece funcionar bem. Mas o que noto é que o kalmanGain diminuirá cada vez que essa atualização for executada, o que significa que confio nos meus novos valores menos quanto mais tempo o filtro estiver em execução (?). Eu não quero isso
Eu deixei de usar uma média móvel (simples e exponencial ponderada) para usar isso. No momento, nem consigo obter resultados tão bons quanto isso.
Minha pergunta é se esta é a implementação correta e se minha variação anterior de erro e desvio padrão parecem bons de acordo com os valores de amostra que eu publiquei? Na verdade, meus parâmetros são escolhidos aleatoriamente para ver se eu poderia obter bons resultados. Eu tentei várias faixas diferentes, mas com resultados ruins. Se você tiver alguma sugestão de alterações que eu possa fazer, isso seria muito apreciado. Me desculpe se faltam algumas coisas óbvias. Primeira postagem aqui também.