TETRA End to End is a 14-part deep dive into the GopherTrunk TETRA stack — the whole path from a raw 25 kHz π/4-DQPSK carrier to clear voice in a WAV file. Where Protocol Decoders gave TETRA one survey episode, this series walks every layer at full depth: bursts and the slot grid, RCPC channel coding and the CRC that isn’t an LFSR, scrambling and colour codes, the traffic channel, a clean-room ACELP vocoder conformed bit-identical against the ETSI reference codec, the soft-decision and equalizer upgrades that roughly doubled marginal-signal yield, and the three-part Direct Mode (DMO) saga — including the “encrypted” verdict that turned out to be a descramble bug.
It is also a series about verification discipline. The recurring villain is the self-consistent synthetic test — the round-trip that validates its own bug — and the recurring hero is the reporter’s capture. Where Weak-Signal Engineering owns the cross-protocol theory of equalizers, soft decisions and diversity, this series is its flagship case study, protocol by protocol layer.
Every post reads three ways: a TL;DR + cheat-sheet for skimmers, bold headers, tables, and diagrams for the medium read, and full prose with real code for the deep read.
New here? Start with the Digital Trunking module for how a trunked system is laid out, then come back for the TETRA specifics.<ol class="post-list series-list"><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 1: π/4-DQPSK & the Shape of a TETRA Carrier</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Why TETRA is not “European P25” — a 25 kHz carrier at 18000 symbols per second, dibits riding in phase transitions instead of amplitudes, a four-slot TDMA downlink that never stops transmitting, and the 144 kHz channel rate GopherTrunk’s whole TETRA path is sized around.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 2: The Burst Zoo & the Slot Grid</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk finds structure in the 18000-dibit-per-second TETRA firehose — the synchronisation and normal downlink bursts, the three training sequences that mark them, the 255-dibit slot grid, and the one-slot anchor shift that silently misfiles every traffic burst when you get it wrong.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 3: Channel Coding — RCPC, Viterbi & the CRC That Isn’t an LFSR</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Walking TETRA’s type-5 bits back to information — two K=5 RCPC mother codes, depuncturing into a shared 16-state Viterbi, the block interleavers, and the class-2 speech CRC that is a fixed parity-check matrix, whose LFSR misimplementation silently dropped every on-air voice burst while synthetic round-trips stayed green.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 4: Scrambling & Colour Codes — Why Colour 0 Is Not a No-Op</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Inside TETRA’s scrambler — the 32-tap LFSR, the 30-bit extended colour code that seeds it, why colour 0 still produces a real scrambling sequence, and the two seed bugs that let a control channel lock perfectly while decoding nothing: a story that sets up the DMO ‘encryption’ misdiagnosis.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 5: TCH/S — From Traffic Burst to Speech Frame</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Decoding TETRA’s full-rate speech channel — two 137-bit frames per slot, the class-0/1/2 sensitivity split with its unequal error protection, the AACH usage marker that routes concurrent same-carrier calls, and the replay harness that correlated decoded timeslots against the control channel’s grants on real air.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 6: A Clean-Room ACELP Vocoder in Pure Go</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Inside GopherTrunk’s pure-Go TETRA speech decoder — how a 137-bit ACELP frame becomes 240 samples of 8 kHz audio through LSP dequantisation, adaptive and algebraic codebooks, and a bit-exact fixed-point synthesis filter, and what clean-room means when the target is sample-for-sample agreement with a reference codec.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 7: Conformance — Bit-Identical Against the ETSI Reference</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk proves its TETRA voice path — two independent conformance passes against the ETSI EN 300 395-2 reference codec, one demanding sample-for-sample PCM equality on a shared bitstream and one replaying real IQ through the whole chain, plus the 64-bit Word32 build trap that makes the reference tools lie.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 8: Going Soft — Soft-Decision TCH/S</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Why hard-decision decoding threw away roughly seventy percent of a marginal same-carrier TETRA call’s traffic bursts, and how the soft path — receiver differentials carried in lockstep through the traffic extractor into a soft Viterbi — recovers them without touching the hard contract.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 9: The Equalizer on the Voice Path</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How a blind CMA equalizer with frozen-snapshot taps, inserted between symbol timing and the differential decoder, roughly doubled CRC-valid TCH/S yield on real concurrent-load TETRA captures — and why the naive way of wiring it drives the decode to exactly zero.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 10: The Control Channel Under Stress — Sync Loss & the CC Equalizer</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Reading a one-hour field session’s eleven hard control-channel sync losses: why the compute theory was wrong, how a signal-time resync budget survives CPU starvation, and the one TETRA control path that wasn’t running the equalizer — lifting a marginal capture from twelve percent to full BSCH yield.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 11: DMO I — Direct Mode & the DSB/DNB Geometry</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">TETRA without a network: how Direct Mode reuses the trunked physical layer with different burst layouts, how GopherTrunk derived the DSB and DNB block geometry from the spec’s bit tables, and why one pair of offsets was confirmed by a sharp CRC optimum rather than trusted from another project.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 12: DMO II — The ‘Encrypted’ Verdict That Was a Descramble Skip</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">The honest retelling of issue #1003: how a colour-0 descramble shortcut inherited from trunked mode made clear DMO voice look encrypted, why the synthetic round-trips couldn’t catch it, and how the colour code the voice actually scrambles with turned out not to be the one the signalling advertises.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 13: DMO III — A Production Pipeline: Grid Votes, Grants & Noise</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Wiring DMO into the daemon as a first-class protocol — streaming burst extraction, sticky locks, edge-triggered grants — and the first on-air run’s humbling lesson: a loose correlator false-alarms eighteen times a second, and only a learned slot-grid vote separates a real transmission from an idle channel.</p></li><li class="post-card"> <h2 class="post-card__title">TETRA End to End, Part 14: Testing TETRA Without a Network — & What’s Still Open</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">The finale — the four-layer test lattice that lets a TETRA stack be developed with no network in range, from synthetic round-trips through skip-guarded capture harnesses to full-daemon integration, and an unvarnished list of what is verified, what is staged, and what stays open until on-air evidence lands.</p></li></ol><p class="blog-feed-link"> See all deep dives or subscribe via RSS. </p>