К основному контенту

Одномерный фильтр Калмана на GNU Octave

(Статья будет обновляться)
Этот кусок кода реализует одномерный (1D) фильтр Калмана. Его можно скопировать и вставить в GNU Octave.
Фильтр Калмана нужен для оценки истинного значений какой-нить величины. Для эксперимента мы можем взять любой набор чисел и обозвать этот набор набором истинных значений.
measurements = 1:1:20;
Вектор measurements описывает движение с постоянной скоростью 1. Функция kalman_evaluate по вектору измерянных значеный выдаёт два вектора: предсказанные положения точки и предсказанную скорость.
[x, v] = kalman_evaluate(measurements, x0, P0);
Предсказанные значения должны быть
expected = 2:1:21;
а предсказанная скорость должна быть где-то 1.
Легко проверить, что фильтр достаточно точно сработал:
plot(expected - x)
plot(1.0 - v)
или
meansq(expected - x)
meansq(1.0 - v)
Теперь добавим немного шума к нашему идеальному сигналу:
noised = measurements + normrnd(0, 0.2, 1, 20);
plot(measurements, 'g', noised, 'r')
[x, v] = kalman_evaluate(noised, x0, P0);
plot(expected, 'g', noised, 'b', x, 'r');

Комментарии