Three issues caused audible distortion on AM reception: 1. DC blocker shared r=0.9999 (τ≈1.25 s at 8 kHz) across all modes. For AM the envelope detector outputs A_c+m(t) — always positive — so the blocker needs to track the carrier bias quickly. AM now uses r=0.999 (τ≈125 ms), 10× faster, while keeping the highpass cutoff below 2 Hz so speech is unaffected. 2. Audio AGC time constants were inverted relative to good AM AGC design: attack=200 ms (should be fast to prevent overload) and release=3500 ms (unreasonably sluggish). Changed to attack=5 ms / release=200 ms, target=0.5, max_gain=36 dB. 3. No IQ AGC before envelope detection meant carrier amplitude variation went directly into the audio chain, forcing the slow audio AGC to handle both RF level and audio level simultaneously. Added an AM IQ AGC (attack=0.5 ms, release=50 ms, target=0.7, max=30 dB) that normalizes carrier power before demod_am, so the DC blocker always sees the same steady-state bias regardless of signal strength. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Stan Grams <sjg@haxx.space>
trx-rs
trx-rs is a modular amateur radio control stack written in Rust.
It splits radio hardware access from user-facing interfaces so you can run
rig control, SDR DSP, decoding, audio streaming, and web access as separate,
composable pieces.
The project is built around two primary binaries:
trx-server: talks to radios and SDR backendstrx-client: connects to the server and exposes frontends such as the web UI
Web UI Demo
GIF placeholder: add an animated walkthrough of the website here.
What It Does
- Controls supported radios over networked client/server boundaries
- Exposes a browser UI, a rigctl-compatible frontend, and JSON-based control
- Supports SDR workflows with live spectrum, waterfall, demodulation, and decode
- Streams Opus audio between server, client, and browser
- Runs multiple decoders including AIS, APRS, CW, FT8, RDS, VDES, and WSPR
- Supports multi-rig deployments and SDR virtual channels
- Loads backends and frontends via plugins
Architecture
At a high level:
trx-serverowns the radio hardware and DSP pipeline.trx-clientconnects to the server over TCP for control and audio.- Frontends hang off
trx-client, including the HTTP web UI.
This separation is intentional: it keeps hardware access local to one host while making control and monitoring available elsewhere on the network.
Workspace Layout
src/trx-core: shared types, rig state, controller logicsrc/trx-protocol: client/server protocol types and codecssrc/trx-app: shared app bootstrapping, config, logging, pluginssrc/trx-server: server binary and backend integrationsrc/trx-client: client binary and remote connection handlingsrc/trx-client/trx-frontend: frontend abstractionsrc/decoders: protocol-specific decoder cratesexamples/trx-plugin-example: minimal plugin example
Supported Pieces
Backends
- Yaesu FT-817
- Yaesu FT-450D
- SoapySDR-based SDR backend
Frontends
- HTTP web frontend
- rigctl-compatible TCP frontend
- JSON-over-TCP frontend
Decoders
- AIS
- APRS
- CW
- FT8
- RDS
- VDES
- WSPR
Build Requirements
You will need Rust plus a few system libraries.
Common dependencies
libopuspkg-configorpkgconfcmake
SDR builds
libsoapysdr
Audio builds
- Core Audio on macOS, or ALSA development packages on Linux
Configuration
Both trx-server and trx-client read from a shared trx-rs.toml.
- Default lookup order: current directory,
~/.config/trx-rs,/etc/trx-rs - Use
--config <FILE>to point at an explicit config file - Use
--print-configto print an example combined config
Start from trx-rs.toml.example.
Quick Start
1. Build
cargo build
2. Create a config file
cp trx-rs.toml.example trx-rs.toml
Adjust backend, frontend, audio, and auth settings for your environment.
3. Run the server
cargo run -p trx-server
4. Run the client
cargo run -p trx-client
5. Open the web UI
Open the configured HTTP frontend address in a browser.
Web Frontend Highlights
- Real-time spectrum and waterfall
- Frequency, mode, and bandwidth control
- Decoder dashboards and history
- SDR virtual channels
- Browser RX/TX audio
- Optional authentication with read-only and control roles
Authentication
The HTTP frontend supports optional passphrase-based authentication.
rx: read-only accesscontrol: full control access
When exposing the web UI beyond a trusted LAN, run it behind HTTPS and enable secure cookie settings in the config.
Audio
Audio is transported as Opus between server, client, and browser.
trx-servercaptures and encodes audiotrx-clientrelays audio to the HTTP frontend- Browsers connect over
/audio
Plugins
Both binaries can discover shared-library plugins through:
./plugins~/.config/trx-rs/pluginsTRX_PLUGIN_DIRS
See examples/trx-plugin-example/README.md.
Documentation
OVERVIEW.md: architecture and design overviewCONTRIBUTING.md: contribution and commit rules
Project Status
This is an active project with evolving APIs and frontend behavior. Expect some rough edges and ongoing refactors.
License
Licensed under BSD-2-Clause.
See LICENSES for bundled third-party license files.
