SDR Internals is a 14-part series that walks the complete software-defined
radio pipeline behind GopherTrunk
— from raw RF samples all the way to recorded audio — one component per post.
Each part explains what the component is, how it’s implemented in pure Go
(CGO_ENABLED=0, single static binary), the software-design principle behind
it, and how that principle shaped the code. Together they form an overview of the
whole engine; each is also a doorway to a deeper, per-component series.
New to radio first? Start with the Learn RF & SDR path, then come back here for the implementation.<ol class="post-list series-list"><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 1: What Is Software-Defined Radio?</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">A pure-Go tour of software-defined radio — what SDR is, the GopherTrunk signal pipeline from RF to audio, and the layered architecture behind a single static binary.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 2: SDR Devices & the Driver Registry</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk talks to RTL-SDR, HackRF, and Airspy hardware in pure Go behind one Device interface, and how a self-registering driver registry keeps the core hardware-agnostic.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 3: The SDR Pool & Streaming Concurrency</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk streams IQ samples through Go channels and goroutines, manages a fleet of SDR dongles with a device pool, and fans one stream to many consumers without blocking the decode path.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 4: DSP Foundations — Filters, NCO & AGC</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">The building blocks of GopherTrunk’s signal chain in Go — FIR/CIC filters, a numerically-controlled oscillator, automatic gain control, and resamplers — and the zero-allocation streaming design behind them.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 5: Tuning & Channelization — DDC vs. Polyphase</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk extracts many narrowband channels from one wideband SDR capture using a digital down-converter or a polyphase channelizer, selected at runtime through a Go Strategy interface.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 6: Demodulation — FM, C4FM, GFSK & More</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns baseband IQ into symbols with pure-Go demodulators for FM, C4FM, GFSK, FFSK, and π/4-DQPSK — each a focused, single-responsibility type composed from DSP primitives.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 7: Symbol Timing & Sync Recovery</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk recovers the symbol clock from oversampled signals with a Mueller-Muller timing loop and finds frame boundaries with a sync correlator — feedback state machines implemented in pure Go.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 8: Equalization, Diversity & the FFT</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk fights simulcast distortion with adaptive equalizers, combines multiple receivers with diversity, and drives the live waterfall with a rate-limited FFT — all in pure Go.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 9: Framing & Forward Error Correction</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk recovers clean data from noisy symbols using pure-Go forward error correction — Golay, BCH, Hamming, Reed-Solomon, BPTC, trellis, and Viterbi — built as deterministic, table-driven codecs.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 10: Protocol Decoders as State Machines</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk decodes P25, DMR, NXDN, TETRA and a dozen more trunking protocols in pure Go — each a stateful receiver behind a uniform Grant contract, an adapter pattern that keeps the engine protocol-agnostic.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 11: The Trunking Engine & Event Bus</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk’s trunking engine turns channel grants into recorded calls, and how an in-process pub/sub event bus decouples the core from the API, storage, and streaming subsystems.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 12: Voice Coding — IMBE, AMBE+2 & MBE</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns digital voice frames into audio with pure-Go IMBE and AMBE+2 vocoders sharing one MBE synthesis core, all behind a pluggable Vocoder registry.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 13: Recording, Composition & Streaming</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk records calls to WAV, drives a per-call demodulation chain with the composer, and streams audio to Broadcastify and RdioScanner — all from optional, config-driven subsystems.</p></li><li class="post-card"> <h2 class="post-card__title">SDR in Pure Go, Part 14: APIs, Testing & the Pure-Go Story</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk exposes the engine through gRPC, REST, WebSocket and a TUI, observes it with Prometheus and SQLite, and proves it works with synthesized-IQ integration tests — a ports-and-adapters finale.</p></li></ol><p class="blog-feed-link"> See all deep dives or subscribe via RSS. </p>