Kalman Filter Noise Covariance Calculator

ANALife Services AuthorityNational Calculator Authority›Kalman Filter Noise Covariance Calculator

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Kalman Filter Noise Covariance Calculator

Calculate the process noise covariance matrix (Q) and measurement noise covariance matrix (R) for a Kalman filter, along with the steady-state Kalman gain (K).

Process Noise Std Dev σ_a (acceleration noise, m/s²)

Measurement Noise Std Dev σ_z (position noise, m)

Time Step Δt (seconds)

Motion Model

Constant Velocity (2-state: position, velocity) Constant Acceleration (3-state: position, velocity, acceleration)

Calculate ...

function kalCalc() { const sigmaA = parseFloat(document.getElementById('kal-sigma-a').value); const sigmaZ = parseFloat(document.getElementById('kal-sigma-z').value); const dt = parseFloat(document.getElementById('kal-dt').value); const model = document.getElementById('kal-model').value; const res = document.getElementById('kal-result');

if (isNaN(sigmaA) || sigmaA Process noise σ_a must be a positive number.'; return; } if (isNaN(sigmaZ) || sigmaZ Measurement noise σ_z must be a positive number.'; return; } if (isNaN(dt) || dt Time step Δt must be a positive number.'; return; }

const sa2 = sigmaA * sigmaA; const sz2 = sigmaZ * sigmaZ; const dt2 = dt * dt; const dt3 = dt2 * dt; const dt4 = dt3 * dt;

let Q, R, H, label, stateLabels;

// Measurement noise covariance (scalar for 1D position measurement) R = sz2;

if (model === 'cv') { // Constant Velocity model // State: [position, velocity] // Q = sigma_a^2 * G * G^T where G = [dt^2/2, dt]^T // Q = sigma_a^2 * [[dt^4/4, dt^3/2], [dt^3/2, dt^2]] Q = [ [sa2 * dt4 / 4, sa2 * dt3 / 2], [sa2 * dt3 / 2, sa2 * dt2 ] ]; H = [[1, 0]]; // observation matrix (measure position only) stateLabels = ['pos', 'vel']; label = '2×2 (Constant Velocity)'; } else { // Constant Acceleration model // State: [position, velocity, acceleration] // G = [dt^2/2, dt, 1]^T // Q = sigma_a^2 * G * G^T const dt5 = dt4 * dt; const dt6 = dt5 * dt; Q = [ [sa2 * dt4 / 4, sa2 * dt3 / 2, sa2 * dt2 / 2], [sa2 * dt3 / 2, sa2 * dt2, sa2 * dt ], [sa2 * dt2 / 2, sa2 * dt, sa2 ] ]; H = [[1, 0, 0]]; stateLabels = ['pos', 'vel', 'acc']; label = '3×3 (Constant Acceleration)'; }

// Steady-state Kalman gain via discrete algebraic Riccati equation (DARE) // Solved iteratively: P_{k+1} = FPF^T + Q, K = PH^T(HPH^T + R)^-1, P = (I-KH)P // F matrix let n = stateLabels.length; let F = []; for (let i = 0; i Array(c).fill(0)); for(let i=0;iA.map(r=>r[j])); } function matAdd(A,B) { return A.map((r,i)=>r.map((v,j)=>v+B[i][j])); } function matScale(A,s) { return A.map(r=>r.map(v=>v*s)); } function eye(n) { return Array.from({length:n},(,i)=>Array.from({length:n},(,j)=>i===j?1:0)); }

// Iterate DARE let P = matScale(Q, 1); for (let iter = 0; iter s+vH[0][j],0); // scalar const S = HPHt + R; // scalar innovation covariance const PHt = matMul(P, matT(H)); // n×1 const K = PHt.map(r=>[r[0]/S]); // n×1 // P = (I - K H) P const KH = matMul(K, H); // n×n const IKH = matAdd(eye(n), matScale(KH,-1)); const Pupd = matMul(IKH, P); // P = F Pupd F^T + Q const FP = matMul(F, Pupd); const FPFt= matMul(FP, matT(F)); const Pnew= matAdd(FPFt, Q); // Check convergence let diff=0; for(let i=0;is+vH[0][j],0); const S = HPHt + R; const PHt = matMul(P, matT(H)); const Kss = PHt.map(r=>r[0]/S);

// Format matrix as HTML table function fmtMatrix(M, rowLabels, colLabels, title) { let html = `${title}

; html += ''; colLabels.forEach(c=>{ html+=${c}; }); html += ''; M.forEach((row,i)=>{ html +=${rowLabels[i]}; row.forEach(v=>{ html+=${v.toExponential(4)}`; }); html += ''; }); html += ''; return html; }

let html = **Results — ${label} Model**; html += `Inputs: σ_a = ${sigmaA} m/s², σ_z = ${sigmaZ} m, Δt = ${dt} s

; html += fmtMatrix(Q, stateLabels, stateLabels, 'Process Noise Covariance Q'); html +=Measurement Noise Covariance R (scalar): ${R.toExponential(4)} m²

; html += fmtMatrix(P, stateLabels, stateLabels, 'Steady-State Error Covariance P (DARE solution)'); html +=Steady-State Kalman Gain K:

; Kss.forEach((k,i)=>{ html+=``; }); html += ``; html +=Innovation Covariance S = H·P·Hᵀ + R = ${S.toExponential(4)} m²

; html +=Signal-to-Noise Ratio (σ_a / σ_z) = ${(sigmaA/sigmaZ).toFixed(4)}

`;

res.innerHTML = html; }

#### Formulas

Process Noise Covariance Q (discrete-time, piecewise constant white acceleration):

Q = σ_a² · Γ · Γᵀ

Constant Velocity: Γ = [Δt²/2, Δt]ᵀ → Q = σ_a² · [[Δt⁴/4, Δt³/2], [Δt³/2, Δt²]]

Constant Acceleration: Γ = [Δt²/2, Δt, 1]ᵀ → Q = σ_a² · [[Δt⁴/4, Δt³/2, Δt²/2], [Δt³/2, Δt², Δt], [Δt²/2, Δt, 1]]

Measurement Noise Covariance R: R = σ_z²

Steady-State Kalman Gain (via Discrete Algebraic Riccati Equation — DARE):

P = F·P·Fᵀ + Q  (predict)

K = P·Hᵀ·(H·P·Hᵀ + R)⁻¹  (gain)

P = (I − K·H)·P  (update) — iterated until convergence

H = [1, 0, ...] (position-only measurement)

#### Assumptions & References

More Calculators

Read Next

Server Vulnerability Patch Priority Scorer ANA › Life Services Authority › National Calculator Authority › Server Vulnerability Patch Priority Scorer .calc-container {...

Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...

References