UNPKG

kalman-filter

Version:

Kalman filter (and Extended Kalman Filter) Multi-dimensional implementation in Javascript

38 lines (32 loc) 1.45 kB
const {identity} = require('simple-linalg'); /** *Creates a dynamic model, following constant position model with respect with the dimensions provided in the observation parameters * @param {DynamicConfig} dynamic * @param {ObservationConfig} observation * @returns {DynamicConfig} */ module.exports = function (dynamic, observation) { const timeStep = dynamic.timeStep || 1; const {observedProjection} = observation; const {stateProjection} = observation; const observationDimension = observation.dimension; let dimension; if (stateProjection && Number.isInteger(stateProjection[0].length / 2)) { dimension = observation.stateProjection[0].length; } else if (observedProjection) { dimension = observedProjection[0].length * 2; } else if (observationDimension) { dimension = observationDimension * 2; } else { throw (new Error('observedProjection or stateProjection should be defined in observation in order to use constant-speed filter')); } const baseDimension = dimension / 2; // We construct the transition and covariance matrices const transition = identity(dimension); for (let i = 0; i < baseDimension; i++) { transition[i][i + baseDimension] = timeStep; } const arrayCovariance = new Array(baseDimension).fill(1).concat(new Array(baseDimension).fill(timeStep * timeStep)); const covariance = dynamic.covariance || arrayCovariance; return Object.assign({}, dynamic, {dimension, transition, covariance}); };