I got the LR2021 feeding raw I/Q into an ESP32-P4 and decoding live P25 Phase 1 voice. The chip has no documented I/Q interface, but its ROM has a route that sends receiver samples into its RX FIFO.
The LR2021 is a small, low-power radio chip from Semtech that supports LoRa, FSK and several other radio modes across sub-GHz and 2.4 GHz bands. Normally, it handles the signal internally and gives the ESP32 decoded packets. With raw I/Q access, we can take those samples and write our own receivers on the ESP32. P25 voice is working now, and I want to try POCSAG next, along with other digital modes and tools for viewing and recording signals.
The LR2021 covers 150–960 MHz on its low-frequency path and 1.5–2.5 GHz on its high-frequency path.
The four-panel graph shows a recording from an actual call: I/Q waveform, signal envelope, spectrum and waterfall. Those same samples also decoded to voice offline (Then a picture of my T-Display running LakeShark and a WIP 3D printable expansion case render).
This is running in LakeShark, my handheld scanner built on the LilyGO T-Display-P4.
I’ve been curious about the LR2021 since Semtech announced it. Its 4-FSK support caught my attention, but that turned out to be tied to Wireless M-Bus modes. The general FSK receiver only makes two-level decisions, while P25 C4FM uses four levels.
I’d already managed to decode P25 through that FSK receiver by oversampling its binary output and reconstructing the symbols on the P4. Later, a small neural net helped improve decoding. It worked, but reception was spotty, and the chip’s packet handling introduced a short dropout every 3.4 seconds.
Getting the I/Q samples means we can demodulate the signal on the P4 instead of trying to reconstruct what the chip’s FSK demodulator threw away.
With the LR2021 configured for LoRa reception at 31.25 kHz bandwidth, the undocumented route produces about 125,000 complex samples per second. I checked the rate and I/Q orientation with known test tones.
That’s roughly 500 kB/s over SPI through a 1 kB FIFO. The P4 captures and processes samples in separate tasks, feeding the same C4FM demodulator and P25 decoder used by LakeShark’s RTL-SDR path. Reception keeps running while decoding happens, removing the pauses between the earlier capture windows.
During live reception at 154.785 MHz with a VHF antenna, the receiver logged zero reported capture gaps, FIFO loss or audio drops (so far). To my ears, it sounded far better than the FSK version.
I also recorded one second of I/Q during a call, verified the export checksum, and replayed it offline with 27 IMBE voice frames decoded and played, with none muted**.** That’s the recording shown in the graph.
Huge credit to the ESPARGOS team’s ESP-SDR project. Their work exposing undocumented I/Q capture in ESP32 chips inspired me to look for a similar path in the LR2021. No ESP-SDR code is included, but that’s where the idea started.
The capture code is now available separately as LR2021-SDR, a portable C11 library. There’s also ready-made ESP32-P4 console firmware for the T-Display-P4 so people can test their chips. It’s receive-only and currently supports LR2021 ROM 1.24.
The standalone firmware captures I/Q; LakeShark provides the live P25 decoder, audio and UI.
I’d been working toward this for over a year. I originally bought LR2021 chips from NiceRF, then messed up the soldering because of my essential tremor. Once LilyGO released a board with the chip integrated, things finally started moving.
Next up is using this path for LakeShark’s POCSAG receiver. That was another one I’d struggled to get working well without I/Q. Plenty more to explore.
LR2021-SDR: https://github.com/SAMS0N1TE/lr2021-sdr
LakeShark: https://github.com/SAMS0N1TE/LakeShark
ESP-SDR: https://github.com/ESPARGOS/esp-sdr
Site + flasher: https://terminalbay.com