control//state estimation//Kalman filter//steady-state Kalman filter

A steady-state Kalman filter is a Kalman filter run with the constant gain its time-varying gain converges to, computed once offline, and it is how a time-invariant estimator fits on a small microcontroller: no covariance matrices at run time, only a fixed linear filter of a few multiplications. In a linear filter the covariance and the gain depend only on the model and the noise levels, never on the readings, so when \(\cd{F}\), \(H\), \(\cd{Q}\) and \(\cc{R}\) do not change, \(\cb{P^-}\) and \(K\) settle to fixed values whatever \(\ca{P_0}\) was (initial covariance). The model in violet, what the sensor brings in copper, the uncertainty before the reading in blue and after it in green. That limit solves the discrete algebraic Riccati equation, which a library solves in one call (`scipy.linalg.solve_discrete_are`); the gain follows from it.


A steady-state Kalman filter is a Kalman filter run with the constant gain its time-varying gain converges to, computed once offline, and it is how a time-invariant estimator fits on a small microcontroller: no covariance matrices at run time, only a fixed linear filter of a few multiplications. In a linear filter the covariance and the gain depend only on the model and the noise levels, never on the readings, so when F\cd{F}F, HHH, Q\cd{Q}Q and R\cc{R}R do not change, P−\cb{P^-}P− and KKK settle to fixed values whatever P0\ca{P_0}P0​ was (initial covariance). The model in violet, what the sensor brings in copper, the uncertainty before the reading in blue and after it in green. That limit solves the discrete algebraic Riccati equation, which a library solves in one call (scipy.linalg.solve_discrete_are); the gain follows from it.

The best known instance is two numbers. For the constant-velocity model of a target observed in position, the steady-state filter is the alpha-beta filter of classic radar trackers:

p^k−=p^k−1+Δt v^k−1,rk=zk−p^k−,p^k=p^k−+α rk,v^k=v^k−1+βΔt rk.\begin{gathered} \cb{\hat p^-_k}=\ca{\hat p_{k-1}}+\Delta t\,\ca{\hat v_{k-1}},\qquad r_k=\cc{z_k}-\cb{\hat p^-_k},\\ \ca{\hat p_k}=\cb{\hat p^-_k}+\alpha\,r_k,\qquad \ca{\hat v_k}=\ca{\hat v_{k-1}}+\frac{\beta}{\Delta t}\,r_k . \end{gathered}p^​k−​=p^​k−1​+Δtv^k−1​,rk​=zk​−p^​k−​,p^​k​=p^​k−​+αrk​,v^k​=v^k−1​+Δtβ​rk​.​

α\alphaα is the share of the position surprise accepted into position, β\betaβ the share turned into a velocity correction. Chosen from the ratio of process to measurement noise they are the Kalman gains in steady state; chosen by hand they are a tuning, and the tracker still works.

The price is the transient. The time-varying filter listens hard to the first readings while P\ca{P}P is large and converges quickly; the fixed gain treats the first second like any other. It also cannot adapt when a reading goes missing or R\cc{R}R changes (a GPS whose precision varies with the satellites), so it suits fixed sensors at fixed rates.

In one dimension it is exponential smoothing with the optimal constant (EWMA), and for one particular noise model the complementary filter is exactly this filter with its gain set through a time constant.

The equations that converge here are the same ones that converge in a LQR, run forward in time instead of backward (estimation-control duality).