# fm-rds-tx Go-based FM stereo transmitter project with RDS. ## Status This repository is currently at a **pre-v1, no-hardware-tested milestone**. What works today: - JSON configuration loading and validation - small HTTP control/status surface with runtime config patching - dry-run generation for no-hardware inspection - offline IQ/composite file generation with full DSP chain - simulated transmit path through a Soapy-oriented backend abstraction - automated no-hardware tests and smoke checks DSP chain (fully implemented): - stereo encoding with phase-coherent 19 kHz pilot and 38 kHz DSB-SC subcarrier - RDS encoding with standards-grade group framing (0A/2A), CRC-10 per IEC 62106, differential encoding, 57 kHz BPSK - pre-emphasis filter (50 µs EU / 75 µs US / configurable) - MPX limiter with smooth attack/release and hard-clip safety net - FM modulator producing baseband IQ output (±75 kHz deviation, unit magnitude) - linear-interpolation audio resampler - robust WAV loader with RIFF chunk scanning What does **not** work yet: - real SDR hardware transmission - real live audio ingest pipeline (streaming/network) - production-ready broadcast chain processing (multiband, look-ahead limiting) ## Project goal Build a Go-based UKW/FM stereo transmitter with RDS that starts on Windows but is designed to stay cross-platform. Design direction: - Windows-first bring-up - cross-platform architecture - CPU-first implementation - optional CUDA later where it actually helps - SoapySDR-oriented backend strategy for flexibility ## Legal note This project is intended only for lawful use within the relevant license and regulatory constraints. RF output, deviation, filtering, spurious emissions, harmonics, and actual transmitted power must be validated on real hardware with proper measurement equipment. Software controls are not a substitute for RF compliance work. ## Quickstart ### Print effective config ```powershell go run ./cmd/fmrtx -print-config ``` ### Dry-run (JSON summary, no hardware) ```powershell go run ./cmd/fmrtx --dry-run --dry-output build/dryrun/frame.json ``` ### Simulated transmit path (main CLI, no hardware) ```powershell go run ./cmd/fmrtx --simulate-tx --simulate-output build/sim/simulated-soapy.iqf32 --simulate-duration 250ms ``` ### Offline generator (full DSP chain) ```powershell go run ./cmd/offline -duration 500ms -output build/offline/composite.iqf32 ``` ### Full local check ```powershell powershell -ExecutionPolicy Bypass -File scripts/check.ps1 ``` ## Repository layout ```text cmd/ fmrtx/ main CLI offline/ offline no-hardware generator internal/ app/ simulated transmit path wiring audio/ sample/frame helpers, WAV loader, resampler config/ config schema + validation control/ HTTP control/status handlers dryrun/ JSON no-hardware summaries dsp/ oscillator, pre-emphasis, FM modulator, limiter mpx/ MPX combiner primitives offline/ deterministic offline composite generation (full DSP chain) output/ backend abstractions + file/dummy sinks platform/ Soapy-oriented backend abstraction rds/ RDS encoder (IEC 62106 group framing, CRC, diff encoding) stereo/ stereo encoder (pilot + 38 kHz subcarrier) examples/ soapy_simulated/ docs/ scripts/ ``` ## Current release posture Recommended current milestone tag: - `v0.4.0-pre` See also: - `docs/README.md` - `PROJECT_PLAN.md` - `CHANGELOG.md` - `RELEASE.md` ## Next priorities 1. real audio ingest path (live PCM, network audio) 2. real SoapySDR backend integration 3. tighter end-to-end regression coverage (decode verification) 4. first true v1.0 criteria review after those pieces exist