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 29955093e3 feat: add reusable tone source for offline pipeline преди 1 месец
cmd feat: add simulated transmit path to main cli преди 1 месец
docs docs: define pre-v1 release posture преди 1 месец
examples Add output backend abstractions преди 1 месец
internal feat: add reusable tone source for offline pipeline преди 1 месец
scripts docs: define pre-v1 release posture преди 1 месец
.gitignore docs: bootstrap fm rds transmitter project plan преди 1 месец
CHANGELOG.md docs: define pre-v1 release posture преди 1 месец
PROJECT_PLAN.md docs: switch plan to windows-first and soapy-first преди 1 месец
README.md docs: polish public project readme преди 1 месец
RELEASE.md docs: define pre-v1 release posture преди 1 месец
go.mod feat: integrate cli config and control scaffolding преди 1 месец

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
  • dry-run generation for no-hardware inspection
  • offline IQ/composite-style file generation
  • simulated transmit path through a Soapy-oriented backend abstraction
  • automated no-hardware tests and smoke checks

What does not work yet:

  • real SDR hardware transmission
  • full RDS group framing / CRC / standards-grade correctness
  • real live audio ingest pipeline
  • production-ready broadcast chain processing

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

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
  config/     config schema + validation
  control/    HTTP control/status handlers
  dryrun/     JSON no-hardware summaries
  dsp/        DSP helpers
  mpx/        MPX combiner primitives
  offline/    deterministic offline composite generation
  output/     backend abstractions + file/dummy sinks
  platform/   Soapy-oriented backend abstraction
  rds/        basic RDS encoder scaffolding
  stereo/     stereo encoder primitives
examples/
  soapy_simulated/
docs/
scripts/

Current release posture

Recommended current milestone tag:

  • v0.3.0-pre

See also:

  • docs/README.md
  • PROJECT_PLAN.md
  • CHANGELOG.md
  • RELEASE.md

Next priorities

  1. real audio ingest path
  2. stronger RDS implementation
  3. tighter end-to-end regression coverage
  4. real SoapySDR backend integration
  5. first true v1.0 criteria review after those pieces exist