Also known as: compact position reporting, CPR
Compact position reporting (CPR) is the encoding ADS-B uses to convey an aircraft’s latitude and longitude in only 17 bits per coordinate, by sending a relative position within a grid of zones instead of an absolute one.1 The saved bits come at the price of ambiguity — 17 bits cannot label a spot on the whole globe uniquely — which CPR resolves by alternating between two slightly different grids, the even and odd frames, and combining a matched pair.
How it works
CPR tiles the globe into horizontal latitude zones and, within each latitude band, longitude zones. The clever part is that the even and odd frames use a different number of latitude zones — 60 for even, 59 for odd. Each transmitted coordinate is the 17-bit fractional position of the aircraft within its current zone; the zone index itself is not sent. Because the two grids have zone boundaries that drift apart as you move north or south, the difference between an even and an odd fractional reading is enough to deduce which zone the aircraft occupies — like a coarse vernier.
There are two decode modes:
- Global decoding. Given a fresh even and odd message received close together in time, the decoder computes a zone index from their fractional difference (using the number-of- longitude-zones function NL(lat)), then reconstructs the absolute latitude and longitude. This needs no prior knowledge of where the aircraft is, but requires both frame parities and assumes the aircraft did not cross a zone boundary between them.
- Local decoding. Given a single message and a known reference position (a previous fix or the receiver’s own location), the decoder picks the zone nearest that reference and resolves position from one frame alone. This is faster and works per-message once tracking is established, but a bad reference can place the aircraft in the wrong zone.
A subtlety is the NL (number of longitude zones) transition latitudes: near the boundary where NL changes, an even and odd pair can straddle two different longitude-zone counts, which decoders must guard against to avoid a gross error.2
In practice
CPR is carried in the ADS-B airborne position and surface position messages of the Mode S extended squitter (1090 MHz). Surface messages use a finer-grained CPR (positions change slowly, so more bits go to resolution). A practical receiver keeps the last even and odd frame per aircraft (keyed by ICAO address), does a global decode when it first hears both parities, then switches to per-message local decoding for the smooth position updates seen on a map. Reasonableness checks — speed since last fix, NL consistency — catch the occasional mis-resolved zone.
Relevance to SDR
Any 1090 MHz ADS-B decoder must implement CPR to turn raw Mode S squitters into mappable latitude/longitude — it is the step between demodulated bits and a dot on a map. CPR is a self-reported position scheme; it is distinct from multilateration, where ground stations compute an aircraft’s position from time-of-arrival differences without trusting the aircraft’s own coordinates. GopherTrunk includes an ADS-B decode path, and CPR even/odd resolution is exactly the kind of message-layer processing that path performs to report aircraft positions.
Sources
-
Automatic Dependent Surveillance–Broadcast — Wikipedia, for ADS-B and its compact position-reporting encoding. ↩
-
The 1090 Megahertz Riddle — Airborne position (CPR) — Junzi Sun, a worked reference for CPR even/odd global and local decoding and the NL function. ↩