
GNU Radio out-of-tree (OOT) module for QRadioLink blocks.
IMPORTANT NOTICE: This is AI-generated code.
This code has not been reviewed by professional coders, it is a large task. There are tests available in the codebase, please review those and their code.
GNU Radio out-of-tree (OOT) module for QRadioLink blocks.
Branch main: GNU Radio 3.10 OOT (CMake find_package(gnuradio)). The experimental
GNU Radio 4 port is on branch gnuradio4 (README_gr4.md on that branch).
Code navigation: docs/CODE_MAP.md (files, functions, block index). gr-ident ZMQ mode routing: docs/GRIDENT_ZMQ.md (gr-ident preamble on :5560).
Reference IQ for modulator blocks was checked with radio-modulation-validator (2026-05-31). Summary: SOFT FAIL — 6/19 blocks passed, 13 soft fail, 0 hard fail, 3 skipped.
All tested modes were identified at the correct modulation family (FSK, PSK, AM, FM). Order-level soft fails (for example FSK predicted as CPFSK instead of 4FSK or GMSK) reflect limits of the validator's order classifier, not evidence that these modulators produce the wrong waveform family.
The scan uses built-in reference IQ (not built OOT blocks); results apply to modes listed in this
README on main and are mirrored on gnuradio4.
Full per-block results: VALIDATION_REPORT.md
This project is documented in the following preprint:
Cryptographically Keyed Gaussian-Distributed Spread-Spectrum for Enhanced Covert Communications: Design, Implementation, and Simulated Performance in ITU Channel Models
IACR Cryptology ePrint Archive, Paper 2025/108456
https://eprint.iacr.org/2025/108456
Archive record timestamp: 21 March 2026.
This module provides GNU Radio blocks for various digital and analog modulation schemes, specialized for amateur radio and digital voice communications.
This module was converted from the QRadioLink application, which is a multimode SDR transceiver for GNU Radio, ADALM-Pluto, LimeSDR, USRP, and other SDR hardware. The original source code is located at https://codeberg.org/qradiolink/qradiolink.
Validation: Converted blocks that have a counterpart in QRadioLink have been validated against the original QRadioLink source (branch next, codeberg.org/qradiolink/qradiolink) so that flowgraphs, filter parameters, scaling constants, and block behaviour match. SSB and AM modulator/demodulator chains (including CESSB structure and clipper/stretcher constants) were restored to match the original where they had diverged. Some blocks in this module have no corresponding source in QRadioLink's src/gr/; their origin is stated in the table below.
Credit and origin:
next, src/gr/): modulation/demodulation (2FSK, 4FSK, GMSK, BPSK, QPSK, AM, SSB, NBFM, WBFM), digital voice (FreeDV, M17, DMR), and supporting blocks (RSSI, M17 deframer, MMDVM source/sink, clipper, stretcher, zero_idle_bursts, gr_4fsk_discriminator, demod_mmdvm_multi, demod_mmdvm_multi2, mod_mmdvm_multi2). The DSP and mode behaviour for these blocks were derived from or reimplemented from the QRadioLink application.gr_* source in QRadioLink src/gr/): 8FSK, SOQPSK, CPM-4FSK, dPMR, NXDN, POCSAG, D-STAR, YSF, P25. Their origin is given in the Block origin table below.Block origin (validation / attribution):
The code has been fuzzed extensively using libFuzzer with over 104 million executions across multiple blocks, and no crashes or memory leaks were discovered. See fuzzing-results/results.md for coverage details.
SOQPSK is a bandwidth-efficient modulation scheme that provides improved spectral efficiency compared to standard QPSK. The implementation supports two operational modes:
Mode 1: VHF/UHF Single Channel
Mode 2: VHF/UHF Multi-Carrier (fading resistant)
Maximum bandwidth segments available:
SOQPSK efficiency: ~1.5 bps/Hz
Per-Carrier Capacity:
Carrier specifications:
All blocks are available through Python bindings, including:
The Python bindings enable use in GNU Radio Companion flowgraphs and Python scripts.
gr-qradiolink/
├── CMakeLists.txt # Top-level CMake configuration
├── include/ # Public header files
│ └── gnuradio/
│ └── qradiolink/
├── lib/ # Implementation files
├── python/ # Python bindings
│ └── qradiolink/
│ └── bindings/
├── grc/ # GNU Radio Companion block definitions
├── docs/ # Documentation
│ ├── doxygen/
│ ├── CODE_MAP.md # Code and function map (all modules)
│ ├── GRIDENT_ZMQ.md # gr-ident ZMQ mode routing guide
│ ├── DSSS_BLOCKS.md # DSSS spreader/despreader guide
│ ├── GDSS_BLOCKS.md # GDSS spreader/despreader guide
│ └── PTT_CONTROL.md # PTT control with gr-osmosdr
├── examples/ # Example flowgraphs
├── tests/ # Unit tests
└── cmake/ # CMake modules
└── Modules/
See DEPENDENCIES.md for a complete list of required and optional dependencies.
Quick Summary:
git clone --recursive (or run git submodule update --init --recursive after cloning)The module includes comprehensive unit tests for all blocks. Tests are run using CTest and Boost.Test framework.
All tests pass successfully. See tests/results.md for C++ unit tests, Python test harness, and edge case results. See fuzzing-results/results.md for fuzzing and MMDVM protocol test details.
C++ Unit Tests:
100% tests passed
Test Breakdown:
- 12 Manual tests (with int main): test_mod_2fsk, test_mod_4fsk, test_mod_8fsk,
test_mod_am, test_mod_gmsk, test_mod_bpsk, test_mod_mmdvm, test_mod_freedv,
test_gdss_spreader_cc, test_gdss_despreader_cc, test_dsss_cdma_transmitter_cc,
test_dsss_cdma_receiver_cc
- Boost.Test tests: mod_ssb, mod_qpsk, mod_nbfm, mod_wbfm, mod_dsss, all
demodulators, rssi_tag_block (8 tests), interleaver_bb (13 tests with edge cases)
- gr-ident: test_grident_zmq (JSON parse and mode_id to demod mapping)
Test Coverage:
- Modulators: 2FSK, 4FSK, 8FSK, AM, GMSK, BPSK, SSB, QPSK, NBFM, WBFM, DSSS, M17, DMR, dPMR, NXDN
- Demodulators: 2FSK, 4FSK, 8FSK, AM, GMSK, BPSK, SSB, QPSK, NBFM, WBFM, DSSS, M17, DMR, dPMR, NXDN
- FEC: interleaver_bb (HF burst error handling, 13 tests including edge cases)
- Note: SOQPSK and CPM-4FSK blocks are implemented and available but unit tests are planned for future releases
MMDVM Protocol Tests (Python):
41 tests passed, 0 tests failed
- Protocol validation: 28 tests (all passed)
- POCSAG: 10 tests (all passed)
- D-STAR: 9 tests (all passed)
- YSF: 4 tests (all passed)
- P25: 5 tests (all passed)
- Block integration: 13 tests (all passed)
- POCSAG: 4 tests (encoder/decoder creation, output, roundtrip)
- D-STAR: 3 tests (encoder/decoder creation, output)
- YSF: 3 tests (encoder/decoder creation, output)
- P25: 3 tests (encoder/decoder creation, output)
See fuzzing-results/results.md for complete MMDVM protocol test results.
A DSSS BER simulation (examples/dsss_ber_simulation.py) runs spreader -> AWGN -> despreader and plots BER vs SNR for N=64, 128, 256, overlaying the theoretical curve 0.5erfc(sqrt(NEs/N0/2)); the curves match within simulation noise, confirming correct DSSS behaviour.
To build and run the test suite:
cd build
cmake ..
make
ctest --output-on-failure
The module includes comprehensive fuzzing coverage using libFuzzer. See fuzzing-results/results.md for complete fuzzing campaign results including:
The module includes Python-based validation tests for all modulation types. See fuzzing-results/results.md for validation test results. All digital voice modes (FreeDV, M17, DMR, dPMR, NXDN) now have Python bindings and validation support. SOQPSK blocks have Python bindings and are available for use; validation tests are planned for future releases.
mode_id.All blocks have GRC (GNU Radio Companion) block definitions in the grc/ directory. Key blocks:
Digital Modulations:
Analog Modulations:
Digital Voice:
MMDVM Protocols:
gr-ident (optional, libzmq):
FEC:
For complete list of all blocks, see the grc/ directory.
This project is licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later).
See the LICENSE file in the QRadioLink repository for details.
| Block(s) | Origin | Notes |
|---|
| 2FSK, 4FSK, GMSK, BPSK, QPSK, AM, SSB, NBFM, WBFM, FreeDV, M17, DMR | QRadioLink | Validated against QRadioLink src/gr/ (gr_demod_, gr_mod_). |
| MMDVM source/sink, demod_mmdvm_multi, demod_mmdvm_multi2, mod_mmdvm_multi2, RSSI, clipper, stretcher, zero_idle_bursts, gr_4fsk_discriminator | QRadioLink | Validated against QRadioLink src/gr/. |
| 8FSK | Implemented for this module | No gr_demod_8fsk/gr_mod_8fsk in QRadioLink. Extension of 4FSK-style design. |
| SOQPSK | Implemented for this module | No gr_demod_soqpsk/gr_mod_soqpsk in QRadioLink. From SOQPSK literature/specs. |
| CPM-4FSK | Implemented for this module | No gr_mod_cpm_4fsk in QRadioLink. |
| dPMR | Implemented for this module | No gr_* in QRadioLink. From ETSI TS 102 658 (test vectors and code comments). |
| NXDN | Implemented for this module | No gr_* in QRadioLink. From NXDN Forum specs; symbol mapping references MMDVM convention. |
| POCSAG | Implemented for this module | No gr_* in QRadioLink. From POCSAG/ITU-R M.584-2; protocol compatible with MMDVMHost. |
| D-STAR | Implemented for this module | No gr_* in QRadioLink. From D-STAR/JARL spec (Golay FEC); compatible with MMDVMHost. |
| YSF | Implemented for this module | No gr_* in QRadioLink. From YSF protocol documentation; compatible with MMDVMHost. |
| P25 | Implemented for this module | No gr_* in QRadioLink. From P25 Phase 1 TIA-102; compatible with MMDVMHost. |
| DSSS (base) | QRadioLink | Validated against QRadioLink gr_demod_dsss/gr_mod_dsss. |
| DSSS (enhancements), GDSS | This module | DSSS: enhancements on top of QRadioLink base. GDSS: from Shakeel et al., Sensors 2023. |
| gr-ident ZMQ routing | This module | Interop with gr-ident preamble PUB; not from QRadioLink. |
mode_id on tcp://127.0.0.1:5560 and select the matching demod/mod block family (see GRIDENT_ZMQ.md, CODE_MAP.md)
libzmq)demod_block / mod_block on message port route_out