Port of Olympia · Budd Inlet

Kalman Tide Forecast

A recursive state-space filter running live on the Port’s tide gauge. Every 5 minutes it predicts the next reading, compares it with the measurement, and updates what it believes about the water.
Loading…
Loading the filter’s latest state…

Water level: observed, NOAA, and the filter’s forecast

Last 48 hours of gauge readings, then a 36-hour forecast with its 95% band. Heights in feet above MLLW, times Pacific.

The residual: what NOAA’s prediction misses

Gray dots are z = observed − NOAA − barometer term. The teal line is the filter’s running estimate of it, projected forward with its uncertainty.

Bias b — datum / drift
Surge η — weather
Tidal correction c

The most recent step, with real numbers

Predict→Measure→Innovation→Gain→Update↻ every 5 min

Parameters, re-estimated every night

Surge memory τ (hours)
Typical surge ση (ft)
Bias b at fit time (ft)

NOAA’s tidal error, one constituent at a time

Amplitude of the correction the filter applies at each tidal frequency, with its 1σ uncertainty now, and how each has evolved day by day. A correction that settles away from zero is a real, repeatable error in the prediction, not weather.

Where the error lives in frequency

Amplitude spectrum of the raw residual (gray) and of the filter’s surge state η (teal). The spikes near 1 and 2 cycles/day are tidal. The harmonic states take them out, so what’s left in η is weather.

Residual z Surge η after filtering

Forecast error by lead time

Root-mean-square error (ft) against what the gauge actually read. “NOAA + bias” only shifts the prediction by the filter’s current datum offset. It’s the fair baseline, so the filter gets no credit just for correcting the datum.

NOAA NOAA + bias Kalman filter

How the filter works

Numbers in teal are the filter’s live values, filled in from the latest run.

Use the data

Everything on this page comes from two public endpoints:

/api/tides/kalman — the filter’s full state, history, forecast, parameters and skill (JSON).

/api/tides/licor/download — the raw 5-minute gauge record, MLLW-referenced (CSV; add ?format=json).

Built by Afsin Yilmaz · Marine Terminal, Port of Olympia
Questions, or want to use this in a class? afsiny@portolympia.com