Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jan Svabenik e2f9e28ad3 refactor: remove unused input sample rate config 1 maand geleden
cmd feat: add TX engine, runtime telemetry and explicit TX control 1 maand geleden
docs refactor: remove unused input sample rate config 1 maand geleden
examples Add output backend abstractions 1 maand geleden
internal refactor: remove unused input sample rate config 1 maand geleden
scripts docs: define pre-v1 release posture 1 maand geleden
.gitignore docs: bootstrap fm rds transmitter project plan 1 maand geleden
CHANGELOG.md feat: tighten config semantics for HW readiness and release prep 1 maand geleden
PROJECT_PLAN.md docs: switch plan to windows-first and soapy-first 1 maand geleden
README.md feat: expose new DSP controls across config, control API, dry-run and docs 1 maand geleden
RELEASE.md feat: tighten config semantics for HW readiness and release prep 1 maand geleden
go.mod feat: add pre-emphasis, MPX limiter and FM IQ modulation DSP blocks 1 maand geleden

README.md

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

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

go run ./cmd/fmrtx -print-config

Dry-run (JSON summary, no hardware)

go run ./cmd/fmrtx --dry-run --dry-output build/dryrun/frame.json

Simulated transmit path (main CLI, no hardware)

go run ./cmd/fmrtx --simulate-tx --simulate-output build/sim/simulated-soapy.iqf32 --simulate-duration 250ms

Offline generator (full DSP chain)

go run ./cmd/offline -duration 500ms -output build/offline/composite.iqf32

Full local check

powershell -ExecutionPolicy Bypass -File scripts/check.ps1

Repository layout

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