This is the fully-functional GNU Radio software-defined radio (SDR) implementation of a LoRa transceiver with all the necessary receiver components to operate correctly even at very low SNRs. The transceiver is available as a module for GNU Radio 3.10. This work has been conducted at the Telecommunication Circuits Laboratory, EPFL.
In the GNU Radio implementation of the LoRa Tx and Rx chains the user can choose all the parameters of the transmission, such as the spreading factor, the coding rate, the bandwidth, the sync word, the presence of an explicit header and CRC.


Sending and receiving LoRa packets between USRP-USRP and USRP-commercial LoRa transceiver (tested with RFM95, SX1276, SX1262).
Parameters available:
* Spreading factors 5 and 6 are not compatible with SX126x.
J. Tapparel, O. Afisiadis, P. Mayoraz, A. Balatsoukas-Stimming and A. Burg, "An Open-Source LoRa Physical Layer Prototype on GNU Radio," 2020 IEEE 21st International Workshop on Signal Processing Advances in Wireless Communications (SPAWC), Atlanta, GA, USA, 2020, pp. 1-5. IEEE Xplore link, arXiv link
J, Tapparel and A. Burg, "Design and Implementation of LoRa Physical Layer in GNU Radio". Proceedings of the GNU Radio Conference, Knoxville, TN, USA, 2024. GNU Radio Proceedings
If you find this implementation useful for your project, please consider citing the aforementioned paper.
The out of tree module gr-lora_sdr can be installed from source or directly as a conda package.
git clone https://github.com/tapparelj/gr-lora_sdr.git cd gr-lora_sdr/ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh source ~/.bashrc conda env create -f environment.yml conda activate gr310 mkdir build
cd build cmake .. -DCMAKE_INSTALL_PREFIX=<your prefix> # default to usr/local, CONDA_PREFIX or PYBOMB_PREFIX if no install prefix selected here (sudo) make install -j$(nproc) sudo ldconfig gnuradio-companion & python3 examples/tx_rx_functionality_check.py python3 ./{file_name}.pyThanks to Ryan Volz this OOT module can also directly be installed as a Conda package. Note that gnuradio will also be installed in the conda environment.
conda install -c tapparelj -c conda-forge gnuradio-lora_sdr conda install -c conda-forge gnuradiognuradio-grcgnuradio-iiognuradio-qtguignuradio-soapygnuradio-uhdgnuradio-video-sdlgnuradio-zeromq conda install -c conda-forge gnuradio-uhd$CONDA_PREFIX/share/gr-lora_sdr/examples%CONDA_PREFIX%Librarysharegr-lora_sdrexamplesmake after pulling a new version from git
(sudo) make uninstall
make clean
make -j4
(sudo) make install
[grc]
local_blocks_path=path_to_the_downloaded_folder/gr-lora_sdr/grc
Add option to ignore sync words checks and print the received values
Add optional print of received payload as hex values
Added tagged stream input support (for frame definition of frame length)
Fixed LLR stream format between fft_demod and deinterleaver
added tags to crc verification output stream indication frame start, length and CRC result.
added separator option for file input
added preamble length option
added parameter for frame zero-padding
add low data-rate optimization support
add support of spreading factors smaller than 7
...
This work was inspired from https://github.com/rpp0/gr-lora by Pieter Robyns, Peter Quax, Wim Lamotte and William Thenaers. Which architecture and functionalities have been improved to better emulate the physical layer of LoRa.
Distributed under the GPL-3.0 License License. See LICENSE for more information.