Field Guide · algorithm

Also known as: frozen-tap equalization, snapshot CMA, snapshot LMS

Snapshot equalization is a way of applying an adaptive equalizer, not a new way of adapting one: a tracking filter adapts continuously in the background, but the signal is filtered through a frozen copy of the taps, refreshed only between bursts, so every burst sees one constant filter.1 The design exists to resolve a genuine dilemma that appears whenever an adaptive equalizer feeds a differential decoder — and both horns of the dilemma score exactly zero.

tracking taps (adapt always) applied taps (frozen) copy between bursts each burst sees one constant filter
The tracking filter follows the channel; the applied filter never moves mid-burst, so the equalizer's phase is constant across every differential pair.

The dilemma it resolves

A blind CMA equalizer’s cost depends only on output magnitude, so nothing constrains its output phase: as the taps adapt, the phase wanders. A differential decoder recovers each symbol as s·conj(previous), which cancels any constant rotation perfectly — that is the point of π/4-DQPSK — but a phase that moves between the two symbols of a pair does not cancel; it corrupts every dibit. Measured on real TETRA captures, a streaming-adaptive CMA ahead of the differential decoder scored zero CRC-valid frames. The obvious retreat — freeze the taps permanently — only ever reproduces the unequalized baseline, because a frozen filter cannot follow the channel. Adapt-continuously, apply-frozen takes the third path: within a burst the applied filter is constant (its rotation cancels differentially, the same property that makes any constant offset harmless), while between bursts the snapshot refreshes from the tracker. Refresh every several bursts’ worth of symbols; the single symbol pair straddling a refresh is absorbed by the FEC.

What else it needs to work

Field-tested supporting rules, each learned from a variant that failed:

  • Normalise by a constant, not a local average. The CMA update scales with |x|³; an EMA that tracks a TDMA downlink’s slot-to-slot power swings gives a moving modulus target and the equalizer converges to garbage. Use a cumulative-mean (effectively global) normaliser.
  • Guard against divergence. A normalisation transient or deep fade can blow the tracking taps up; re-seed the tracker to pass-through when tap magnitude explodes, so one bad patch cannot poison later snapshots.
  • Judge by decoded output, never by EVM. Blind CMA minimises modulus, not correctness — one unstable variant showed differential EVM collapsing 34% → 8% while CRC-valid frames stayed at zero. CRC yield is the verdict.

These and their siblings are collected in equalizer gotchas.

Relevance to SDR

GopherTrunk ships two snapshot equalizers (internal/dsp/equalizer/). SnapshotCMA — blind, in the TETRA receiver’s stream path — roughly doubled CRC-valid voice frames across a set of marginal captures (410 → 778) and lifted a control-channel fixture from ~12% to ~100% clean BSCH, with no loss on clean signal. SnapshotLMS — trained, in the traffic extractor — goes further where framing is known: it trains on each burst’s midamble from the raw (pre-differential) symbols, freezes, equalizes that one burst, and re-derives the soft-decision LLRs from the equalized symbols. The raw-symbol detail matters: the channel is a clean convolution only in the raw symbol domain — s·conj(prev) is a nonlinear product — so the trained equalizer must run before the differential decode. The same discipline transfers to any burst waveform with a differential slicer downstream.

Sources

  1. Blind equalization — Wikipedia, on blind adaptive equalizers and the phase indeterminacy of constant-modulus cost functions. 

See also