jochenhammes / esp32-sdr-trx
git clone https://github.com/jochenhammes/esp32-sdr-trx.git
A software-defined transceiver from one ESP32-S3 board: rtl_tcp receiver for SDR++ and FM/SSB voice transmitter for 13 cm (experimental)
+5
stars, 24h · #5,790
+~19
stars, 7 days · #8,373
+117
stars, 30 days · #6,218
117
★ total · +19% this week
13
forks · 0 open issues
Star history (as recorded here)
LanguagePython
License—
Created2026-10-03 (20d ago)
Last push11d ago
Watchers6
OwnerUser
GitHub topics
Links
README excerpt
# esp32-sdr-trx: a software-defined transceiver from one ESP32-S3 board *SDR++ with a HackRF, USB demodulator, tuned to an ESP32-S3 that transmits single-sideband voice on 13 cm. The ESP32-S3 is the only transmitter.* Every ESP32-S3 has a 2.4 GHz Wi-Fi radio, and somewhere inside it is an I/Q stream and a test-tone generator that Espressif does not document. This project uses both, on a plain dev board with a USB cable and no FPGA: * **Receive** (`espdr-rx`): 1.84 to 2.79 GHz, 250 or 333 ksps of 8-bit I/Q. The chip decimates its 16 Msps ADC stream itself; a bridge makes it an `rtl_tcp` server, so **SDR++**, GNU Radio and anything else that speaks `rtl_tcp` can use it. * **Transmit** (`espdr-tx`): narrowband **FM** and **SSB (USB/LSB)** voice and **RTTY** in the 13 cm amateur band (2320 to 2450 MHz), from a WAV file, a pipe, a sound card or a text, with a cancellation of the carrier's thermal drift once the board has a model file (`--thermal`, using the chip's temperature sensor). It is an *experiment* that works: the chip's carrier is steered in frequency and amplitude by software (polar modulation), which needs no sample buffers and can run for as long as you like. The chip also has a raw I/Q playback engine (samples from SRAM at up to 80 Msps, found by h0m3us3r and reproduced here, see the research notes); this transmitter does not use it yet. Transmitting takes an amateur radio licence; read the transmitter guide first. | | Receiver | Transmitter | |---|---|---| | Command | `espdr-rx` | `espdr-tx` | | Range | 1.84 to 2.79 GHz | 2.32 to 2.45 GHz | | Bandwidth | 250 ksps (±100 kHz) or 333 ksps (±133 kHz) | voice, 300 to 3000 Hz; RTTY 170 Hz shift | | Modes | rtl_tcp server | FM (±2.5 kHz), USB, LSB, RTTY | | Sources | the Wi-Fi front end | WAV file, `-` (pipe), sound card; RTTY: text or text file | | Status | stable, one board tested | experimental, one board tested | ## Install You need an ESP32-S3 board **with two USB ports** (the second one is a USB-UART bridge that lets the tools load the firmware without buttons), a USB cable for each, Linux, and Python 3.10 or newer. Download the wheel `esp32_sdr_trx-X.Y.Z-py3-none-any.whl` and `install-linux.sh` from the releases page, then: [code] That creates a virtual environment of its own, links `espdr-rx` and `espdr-tx` into `~/.local/bin` and offers the udev rule. The package carries the firmware images; there is nothing to build. **docs/install.md** explains every step, the manual way with `python3 -m venv`, `pipx`, the udev rule, execute rights and how to remove it. ## Use [code] Both tools load the right firmware into the board's RAM by themselves and switch it when needed (a few seconds); nothing is written to the flash unless you ask (`espdr-rx --flash`). `-h` explains every option and shows examples; the full reference is in docs/espdr-rx.md and docs/espdr-tx.md. ## Temperature correction for the transmitter (`--thermal`) **Why.** The transmitter warms up while it sends: the chip's te