Also known as: differential decoding, differential coding
Differential decoding recovers information that was encoded in the change between successive symbols rather than in their absolute values.1 By making each symbol’s meaning depend only on how it differs from the one before it, a differentially-coded link needs no absolute phase reference — it does not matter which of several equivalent constellation rotations the receiver happens to lock onto, because the transition is the same in every rotation. This neatly resolves the phase ambiguity left by carrier-recovery loops.
How it works
At the transmitter, differential encoding maps each data symbol to a change applied to the running state: the sent symbol is the previous sent symbol combined with the current data (for phase modulation, the phase increment; for a binary line code, whether to toggle). At the receiver, decoding inverts that step — it compares the current received symbol against the previous one and outputs their difference.
The crucial property: any fixed offset common to both symbols cancels in the comparison. If a carrier-recovery loop settles on a phase rotated by, say, 90° from the transmitter’s, every received symbol is rotated the same way — but the difference between consecutive symbols is unchanged, so the data survives. This is why differential coding is the standard cure for the N-fold phase ambiguity that a PSK carrier loop or Costas loop inherently leaves (a QPSK loop can lock in any of four orientations).
The trade-off is a small noise penalty: because a decision leans on a possibly-noisy previous symbol, a single symbol error tends to corrupt two output symbols, costing roughly 2–3 dB versus ideal coherent detection with perfect absolute phase.
Variants
- DBPSK / DQPSK — differential PSK: data is the phase step (0/π for DBPSK; 0, ±π/2, π for DQPSK). Can be detected non-coherently by comparing consecutive symbol phases, avoiding a carrier loop entirely.
- π/4-DQPSK — the phase reference alternates between two QPSK constellations offset by π/4, so every symbol forces a phase change (no 0° transitions). That guarantees frequent transitions for timing recovery and avoids zero-crossings through the origin, which is why P25 Phase 1 and TETRA use it at 4800 symbols/s.
- NRZI — a differential line code: a data 0 (or 1, by convention) is encoded as a level transition, a data 1 as no change. Because meaning rides on transitions, it is immune to an inverted line and guarantees edges for clock recovery; it appears in USB, magnetic recording, and various data radios.
Relevance to SDR
Differential coding is pervasive in real systems precisely because carrier and phase references are imperfect. Trunked-radio waveforms lean on it heavily: P25 Phase 1 and TETRA transmit π/4-DQPSK, so a decoder must differentially decode the recovered phases to get dibits, and many FSK/line-coded control formats use NRZI-style transition coding. GopherTrunk performs differential decoding in its π/4-DQPSK demod path — recovering symbols from phase transitions after timing and carrier recovery — so that a locked-but-rotated constellation still yields the correct bitstream.
Sources
-
Differential coding — Wikipedia, on encoding data in symbol transitions to remove absolute-reference dependence; see also Phase-shift keying for DPSK. ↩