| @@ -1,23 +1,114 @@ | |||||
| # fm-rds-tx | # fm-rds-tx | ||||
| CPU-first FM stereo transmitter with RDS, written in Go. | |||||
| Go-based FM stereo transmitter project with RDS. | |||||
| ## Goal | |||||
| ## Status | |||||
| Build a software transmitter pipeline for a licensed short-term VHF/FM broadcast project: | |||||
| This repository is currently at a **pre-v1, no-hardware-tested milestone**. | |||||
| - FM mono/stereo multiplex generation | |||||
| - RDS encoder/inserter | |||||
| - configurable audio and RDS inputs | |||||
| - configurable carrier frequency, deviation / MPX levels, and TX chain settings | |||||
| - CPU implementation first | |||||
| - optional CUDA acceleration where it actually helps | |||||
| - target platforms: Windows first during initial bring-up, then broad cross-platform support including Linux and Raspberry Pi / SBC targets | |||||
| 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 | |||||
| ## Important note | |||||
| 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 | |||||
| This repository is intended for lawful use only within Jan's licensed project window and under applicable radio regulations. Hardware output stages, spectral compliance, filtering, and actual radiated power must be validated against the license conditions and local law. | |||||
| ## Project goal | |||||
| ## Planned scope | |||||
| Build a Go-based UKW/FM stereo transmitter with RDS that starts on Windows but is designed to stay cross-platform. | |||||
| See `PROJECT_PLAN.md`. | |||||
| 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 | |||||
| ```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 | |||||
| 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 | |||||