u/da2jh

Image 1 — ESP32-S3 board as a 13 cm transceiver: rtl_tcp receiver for SDR++ and FM/SSB voice transmitter
Image 2 — ESP32-S3 board as a 13 cm transceiver: rtl_tcp receiver for SDR++ and FM/SSB voice transmitter
Image 3 — ESP32-S3 board as a 13 cm transceiver: rtl_tcp receiver for SDR++ and FM/SSB voice transmitter
▲ 15 r/esp32AI+1 crossposts

ESP32-S3 board as a 13 cm transceiver: rtl_tcp receiver for SDR++ and FM/SSB voice transmitter

An update to my earlier post about receiving 2.4 GHz with an ESP32-S3: it **transmits** now, too, and the whole thing is a proper release.

**Receive.**
`espdr-rx` turns the board into an rtl_tcp server (1.84 to 2.79 GHz, 250 or 333 ksps, no FPGA); SDR++ and GNU Radio use it as an RTL-SDR.

**Transmit.**
`espdr-tx` sends narrowband FM or SSB voice in 2320 to 2450 MHz from a WAV file, a pipe or a sound card. The chip has no I/Q input, so the trick is polar modulation: the Wi-Fi PHY's test-tone carrier is steered in frequency (the RF PLL's sigma-delta word, 40 000 updates per second) and in amplitude (a gain code,
0.28 dB steps over 18 dB), computed on the PC from the analytic signal of the audio. Screenshot: SDR++ with a HackRF on a second computer receiving the SSB
voice from the ESP32-S3 (that is the
*only*
transmitter).

Measured with a PlutoSDR: with the SSB carrier fully suppressed the unwanted sideband is 61 to 63 dB and the third-order intermodulation 33 dB below the wanted tones. Speech is understood
in FM and SSB, from a file and live from a microphone, for 20 to 30 s at a time without an underrun.

**Honest limits:**
one board, one host (Linux), tested with a PlutoSDR and a HackRF. The power is not calibrated (an estimate: microwatts at the antenna of a dev board), harmonics and
spurious emissions are not measured, the frequency is as good as the board's crystal (mine is +5.4 ppm off; `--ppm` corrects it). It sends only in the 13 cm band and needs an amateur
licence, which the tool asks you to confirm. Much of the code and the documentation was written with Claude as the coding assistant; every number in the docs was measured.

It stands on eSpDR by **h0m3us3r**, who found how to read the chip's undocumented I/Q dump path (thank you!).

Repo and release (the wheel contains the firmware, `pipx install` is enough): https://github.com/jochenhammes/esp32-sdr-trx - https://github.com/jochenhammes/esp32-sdr-trx/releases/tag/v1.0.0-rc2.
How it works and all measurements: `docs/internals.md` and `docs/research/TX-RESEARCH.md`. Reports from other boards are very welcome.

u/da2jh — 12 days ago
▲ 4 r/esp32AI+1 crossposts

Receive 13 cm / 2.4 GHz in SDR++ with a single ESP32-S3 board and a USB cable (no FPGA), building on u/h0m3us3r's eSpDR

Credit first: all of this stands on the work of u/h0m3us3r, who found how to read the I/Q output of the ESP32-S3's Wi-Fi receiver and built eSpDR (https://github.com/h0m3us3r/eSpDR): up to 80 Msps, with an FPGA carrying the data out. rtl-sdr.com wrote about it, together with other projects that found the same hidden capability independently (ESPARGOS and others).

I wanted to know how far you get without the FPGA, so I built a fork with a narrowband mode: the ESP32-S3 samples at 16 Msps, decimates on the chip, and sends 250 ksps over its USB port (0.5 MB/s). A small rtl_tcp bridge lets SDR++ use the board as a receiver for 2.21 to 2.79 GHz, about ±100 kHz wide. That covers the 13 cm band, which includes the QO-100 uplink segment.

The screenshot shows SDR++ receiving a test transmission from a PlutoSDR at 2.4307 GHz through the board. The text in the waterfall is drawn by the transmitter.

https://preview.redd.it/uijy0a5p43th1.png?width=1738&format=png&auto=webp&s=812905c0e665b44b2fe8b1bcfcabdf19498e7910

What you need: an ESP32-S3 board with two USB ports, a Linux PC with Python. The firmware image is on the release page, there is a loader script, so no toolchain and no buttons.

Honest limits:

- Receive only.

- Fixed 250 ksps. USB Full-Speed and the chip's CPU time are the limits.

- Wi-Fi-class sensitivity, no calibrated levels, no AGC.

- The board's 40 MHz crystal puts a strong spur at exactly 2400.000 and 2440.000 MHz (its 60th and 61st harmonic).

-Tested on one dev board and one Linux host so far. I would love reports from other boards.

https://preview.redd.it/9qrbjpet43th1.jpg?width=2080&format=pjpg&auto=webp&s=cc183bbe6f283ffd3dadc6d1612904641a7070c1

Disclosure: it's my fork, and the code was written with Claude as the coding assistant (the original project says the same about itself). Everything the docs call measured was measured on the hardware.

Code, docs and prebuilt image (0BSD): https://github.com/jochenhammes/eSpDR

I also opened an issue on the original repo: https://github.com/h0m3us3r/eSpDR/issues/2

reddit.com
u/da2jh — 13 days ago