Skip to content

Repository files navigation

gr-sleipnir

Table of Contents

Modulation validation

Reference IQ for modulator blocks was checked with radio-modulation-validator (2026-05-31). Summary: SOFT FAIL — 1/9 blocks passed, 8 soft fail, 0 hard fail, 1 skipped.

QPSK passed at family and order level. FSK-family modes passed at family level; the custom 8-carrier mode (mod_sleipnir_8qpsk) is validated by a dedicated plugin (soft fail on full pass criteria, no hard fail). Order-level CPFSK vs named FSK orders reflects classifier training limits.

Full per-block results: VALIDATION_REPORT.md

Project status

GNU Radio 4.0 (repository root)

This repository is the CMake-based GR4 module (gr-sleipnir4): header-only GR4 blocks, tests, and Python helpers built against GNU Radio 4.0 RC2 or later (typical prefix /opt/gnuradio4-gcc). It is independent of GR3-era GNU Radio installs on the machine: configure with cmake -S ., link against gnuradio4 and gnuradio4::gr-opus (required for the PDU types used by the unit tests); OpenSSL, gr-linux-crypto, and gr-nacl are optional for signing/MAC-oriented features.

The module uses GR4's unified scheduler (stream vs. message starvation addressed compared to classical GR3 scheduling). test/ holds Boost.UT C++ tests; python/sleipnir/ exposes helpers mirroring the PDU layout (SuperframeAssembler.py / SuperframeParser.py, tooling and offline scripts).

Example build:

cmake -S . -B build \
  -DCMAKE_PREFIX_PATH="/opt/gnuradio4-gcc;<path-to-gr-opus>/gnuradio4/build" \
  -DCMAKE_CXX_COMPILER=g++-14
cmake --build build -j"$(nproc)"
ctest --test-dir build --output-on-failure

Module license: GPLv3.

Current Status (May 9, 2026)

System Refactoring

Completed:

  • 8-Carrier QPSK Modulation - System refactored from 4FSK/8FSK to 8 parallel QPSK carriers
    • 900 baud per carrier (7,200 total symbol rate)
    • 2 bits per symbol (QPSK)
    • ~1,000-1,200 Hz bandwidth per carrier with pulse shaping
    • 1,300 Hz carrier spacing
  • Tagged Stream Architecture - Implemented tagged streams for reliable message delivery between decoder and parser
  • Voice-Only Mode - Core voice path prioritised; optional text messaging restored in GR4 blocks (see below)
  • Soft-Decision LDPC - Using soft-decision LDPC decoding with rate 2/3 for voice frames
  • Multi-Carrier RX - Full 8-carrier parallel demodulation with diversity combining

Current Implementation:

  • TX chain: 8-carrier QPSK with frequency multiplexing
  • RX chain: 8 parallel QPSK demodulation chains with LLR combining
  • Message delivery: Tagged stream architecture for reliable PDU delivery
  • Frame processing: Voice superframes with optional TEXT trailer (64-byte fragments); encryption/APRS remain legacy GR3 paths
  • Text messaging (GR4): TextMessageAssembler / TextMessageParser blocks, superframe TEXT trailer, M17 KISS bridge (python/sleipnir/kiss_bridge.py)

IMPORTANT NOTICE: This is AI-generated code. The developer has a neurological condition that makes it impossible to use and learn traditional programming. The developer has put in a significant effort. This code might not work properly. Use at your own risk.

This code has not been reviewed by professional coders, it is a large task. If there are tests available in the codebase, please review those and their code.


A Experimental GNU Radio-based digital voice mode designed for amateur radio narrowband FM (NFM) channel spacing, utilizing modern audio codecs for superior voice quality compared to traditional codec2 implementations.

Disclaimer and Liability

Software Provided "As Is": This software is provided "as is," without any guarantees, warranties, or representations regarding its performance, reliability, functionality, or fitness for any particular purpose. The software may contain errors, bugs, or limitations that could affect its operation.

Liability Limitations: The authors, contributors, and distributors of this software are not liable for any damages, losses, or consequences resulting from the use, misuse, or inability to use this software. This includes, but is not limited to:

  • Direct damages
  • Indirect damages
  • Incidental damages
  • Consequential damages
  • Loss of data
  • Loss of profits
  • Business interruption
  • Personal injury or property damage

User Responsibility: Users are solely responsible for:

  • Assessing the software's suitability for their intended use
  • Verifying results against other reliable sources
  • Ensuring compliance with all applicable laws and regulations
  • Understanding and accepting the risks associated with using experimental software
  • Taking appropriate precautions and backups before using the software

No Warranty: This software is distributed without warranty of any kind, either express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, or non-infringement.

By using this software, you acknowledge that you have read, understood, and agree to these terms. If you do not agree with these terms, do not use this software.

About the Name

Sleipnir is the eight-legged horse of Odin, the Allfather in Norse mythology. According to the Prose Edda, Sleipnir was the finest of all horses, capable of traveling between the worlds of the gods, giants, and the dead. The name reflects the project's architecture:

  • Eight legs: Representing the 8-carrier QPSK modulation system (8 parallel carriers working together)
  • Speed and reliability: Sleipnir's legendary speed and ability to traverse difficult terrain mirrors the system's goal of providing fast, reliable digital voice communication
  • Connection between worlds: Just as Sleipnir bridged the realms of Norse cosmology, this system bridges the gap between traditional ham radio and modern digital communication technology

The name embodies the project's ambition to be a superior mode of digital voice communication for amateur radio, carrying messages reliably across the airwaves.

Overview

gr-sleipnir is an experimental digital voice communication system for ham radio that uses 8-carrier Quadrature Phase Shift Keying (QPSK) modulation with modern audio codec technology. The system is designed to fit within standard NFM channel spacing while providing significantly improved audio quality over older codec2-based systems. The 8-carrier architecture provides parallel transmission paths for robust communication.

Key Features

  • 8-Carrier QPSK Modulation: 8 parallel QPSK carriers for robust parallel transmission
  • Modern Audio Codec: Uses Opus codec (via gr-opus module) for superior voice quality
  • Forward Error Correction: Soft-decision LDPC coding (rate 2/3) for robust communication
  • NFM Channel Spacing: Designed to operate within standard narrowband FM channel allocations
  • Voice Communication: Primary digital voice mode; UTF-8 text messaging via 64-byte TEXT frames (M17-style callsigns, fragmentation, optional gr-linux-crypto when built with HAVE_GR_LINUX_CRYPTO)
  • Multi-Carrier Architecture: Parallel carrier processing with diversity combining at the receiver
  • PTT Control: Push-to-talk control integration for radio operation
  • GNU Radio Integration: Built on GNU Radio framework for flexibility and extensibility

Why Opus Over Codec2?

Codec2 is a low-bitrate speech codec released in 2010, optimized for very low bandwidth (typically 1200-3200 bps). While effective for its era, codec2 has limitations:

  • Limited Audio Quality: Designed for intelligibility over quality, resulting in robotic-sounding audio
  • Aging Technology: Based on older speech coding techniques
  • Fixed Bitrates: Limited flexibility in bitrate selection
  • Made for HF, not VHF bands

Opus, standardized in 2012, represents a significant advancement:

  • Superior Quality: Modern hybrid codec combining CELP and MDCT techniques
  • Adaptive Bitrate: Supports bitrates from 6 kbps to 510 kbps with excellent quality at low rates
  • Low Latency: Configurable frame sizes (2.5ms to 60ms) suitable for real-time communication
  • Robust Error Handling: Better performance under adverse channel conditions
  • Wide Industry Adoption: Used in modern VoIP, streaming, and communication systems

At comparable bitrates (e.g., 6-8 kbps), Opus provides noticeably better audio quality than codec2 while maintaining low latency suitable for ham radio applications.

System Architecture

The system consists of two main components:

1. 8-Carrier QPSK Transceiver Flowgraphs

The system includes separate transmitter and receiver flowgraphs:

Transmitter:

  • WAV file source for audio input
  • Low-pass filter for audio preprocessing
  • Opus audio encoder
  • Superframe assembly
  • LDPC forward error correction (rate 2/3)
  • Bit interleaving across 8 carriers
  • 8 parallel QPSK symbol mapping and modulation chains
  • Root raised cosine pulse shaping
  • Frequency shifting for each carrier
  • Carrier combining (sum of all 8 carriers)
  • Complex baseband I/Q file output

Receiver:

  • Complex baseband I/Q file input
  • Automatic gain control (AGC)
  • 8 parallel carrier separation and demodulation chains:
    • Matched filtering (root raised cosine)
    • Frequency shifting to baseband
    • Costas loop for carrier recovery
    • Symbol timing recovery
    • QPSK to LLR conversion (soft decisions)
  • LLR diversity combining (sum of all 8 carriers)
  • LDPC soft-decision decoding (rate 2/3)
  • Superframe parsing
  • Opus audio decoder
  • Low-pass filter for audio post-processing
  • WAV file sink for audio output

2. gr-opus Module

The gr-opus module is a separate GNU Radio Out-of-Tree (OOT) module available at https://github.com/Supermagnum/gr-opus. It provides:

  • Opus audio encoder block
  • Opus audio decoder block
  • Support for multiple sample rates (8kHz, 12kHz, 16kHz, 24kHz, 48kHz)
  • Mono and stereo support
  • Configurable bitrate and application profiles

Technical Specifications

8-Carrier QPSK Modulation

The system uses 8 parallel QPSK carriers for robust voice communication:

Per Carrier Specifications

  • Modulation: Quadrature Phase Shift Keying (QPSK)
  • Symbol Rate: 900 symbols/second per carrier
  • Bits per Symbol: 2 (QPSK)
  • Bit Rate: 1,800 bits/second per carrier
  • Bandwidth: ~1,000-1,200 Hz per carrier (with α=0.35 roll-off)
  • Carrier Spacing: 1,300 Hz between carriers

Total System Specifications

  • Total Carriers: 8
  • Total Symbol Rate: 7,200 symbols/second (8 × 900)
  • Total Bit Rate: 14,400 bits/second (8 × 1,800)
  • Total Bandwidth: ~10,400-9,600 Hz (8 carriers × 1,300 Hz spacing)
  • RF Sample Rate: 48 kHz
  • Audio Sample Rate: 8 kHz

Pulse Shaping:

  • Filter: Root Raised Cosine (RRC)
  • Roll-off factor (α): 0.35
  • Samples per symbol: Variable based on RF sample rate

Bitrate Budget:

  • Opus voice (raw): Variable based on codec settings
  • LDPC rate 2/3 coded: Forward error correction for voice frames
  • Framing/sync: Frame structure and synchronization
  • Metadata/callsign: Callsign and frame metadata

Characteristics:

  • Voice quality: High quality with Opus codec
  • FEC strength: Strong (rate 2/3 LDPC with soft-decision decoding)
  • Multi-carrier diversity: Parallel transmission provides robustness
  • Suitable for standard NFM channel spacing

General Specifications

  • Codec: Opus (via gr-opus module)
  • Channel Spacing: Compatible with standard NFM spacing (typically 12.5 kHz or 25 kHz)
  • PTT Control: Optional ZeroMQ message-based control

Performance

Phase 2 & Phase 3 Test Results

Phase 2 (832 test scenarios, completed 2025-12-27):

  • Duration: 3h 10m 48s
  • Operational SNR (FER < 5%): Updated thresholds for soft-decision decoder
  • FER Floor: 4% at high SNR (observed, not <1% as initially expected)
  • Pass Rate: 20.1% (167/832 tests passed)
  • Investigation Findings:
    • Soft-decision decoder shows 4% FER floor (all tests with frames show exactly 4.00% FER)
    • 67% of high SNR tests decode 0 frames (synchronization/demodulation issue)
    • Thresholds adjusted from 2%/1% to 5%/5% to match actual performance

Phase 3 (7,728 tests, 100% COMPLETE as of 2025-12-11):

  • Duration: 26h 58m 44s
  • 4FSK: 100% complete (3,864 tests)
    • FER Floor: Expected <1% at high SNR (≥10 dB) with improved soft-decision decoder
  • 8FSK: 100% complete (3,864 tests)
    • FER Floor: Expected <1% at high SNR (≥10 dB) with improved soft-decision decoder
  • Pass Rate: 81.4% (6,292/7,728 tests passed)
  • Complete Analysis Available: See test-results-files/analysis/ for comprehensive analyses (updated 2025-12-27)

Channel Performance:

  • Clean Channel: 5.15% mean FER, 94.2% pass rate (7% threshold)
  • AWGN Channel: 5.11% mean FER, 91.3% pass rate (7% threshold)
  • Rayleigh Fading: 6.14% mean FER, 91.3% pass rate (8% threshold, +1 dB penalty)
  • Rician Fading: 6.08% mean FER, 88.5% pass rate (8% threshold, +1 dB penalty)
  • Frequency Offset Tolerance:
    • ±100 Hz: ~11% mean FER (12% threshold acceptable)
    • ±500 Hz: ~13% mean FER (15% threshold acceptable)
    • ±1 kHz: ~13-14% mean FER (20% threshold acceptable, known limitation)

Competitive Analysis:

Mode Waterfall SNR Operational SNR (FER<5%) Audio Codec Bitrate Bandwidth Advantage vs gr-sleipnir Notes
gr-sleipnir (8FSK) 0 to +1 dB 0-1 dB Opus 8 kbps 14,400 bps ~11-12 kHz Baseline Measured
gr-sleipnir (4FSK) -1 dB 0-1 dB Opus 6 kbps 9,600 bps ~9-10 kHz Baseline Measured
M17 +5 dB +5-6 dB Codec2 3.2 kbps 9,600 bps ~9 kHz +4-5 dB better Documented
DMR +5 to +7 dB +6-8 dB AMBE+2 2.45 kbps 9,600 bps 12.5 kHz +5-6 dB better Estimated
FreeDV 700D -2 to -3 dB -1 to 0 dB Codec2 0.7 kbps 2,400 bps ~1.2 kHz 2-3 dB better SNR Very low audio quality (0.7 kbps)
FreeDV 2020 +2 to +5 dB +3-6 dB Codec2 1.3 kbps 4,800 bps ~2.4 kHz +2-4 dB better
FreeDV 1600 +2 dB +3-4 dB Codec2 1.6 kbps 4,800 bps ~2.4 kHz +2-3 dB better
D-STAR +4 to +6 dB* +5-7 dB* AMBE+ 2.45 kbps 4,800 bps 6.25 kHz +4-5 dB better* *Estimated, needs verification
Fusion (C4FM) +5 to +7 dB* +6-8 dB* AMBE+2 2.45 kbps 9,600 bps 12.5 kHz +5-6 dB better* *Estimated, similar to DMR
P25 +4 to +6 dB* +5-7 dB* AMBE+2 2.45 kbps 9,600 bps 12.5 kHz +4-5 dB better* *Estimated, needs verification

Notes on Competitive Analysis:

  • Measured values: gr-sleipnir and M17 have documented/tested waterfall SNR values
  • Estimated values (marked with *): D-STAR, Fusion, and P25 values are estimates based on technical specifications and similar systems; specific waterfall measurements not found in public literature
  • FreeDV modes: FreeDV 700D actually outperforms gr-sleipnir on SNR (-2 to -3 dB vs 0 to +1 dB) but uses very low bitrate Codec2 (0.7 kbps) resulting in lower audio quality. FreeDV 2020 and 1600 modes are closer to gr-sleipnir performance
  • DMR: Based on documented ~7 dB SNR requirement for reliable operation
  • Audio quality trade-off: Lower SNR modes (FreeDV 700D) sacrifice audio quality for sensitivity; gr-sleipnir prioritizes audio quality (Opus 6-8 kbps) while maintaining competitive SNR performance

Key Advantages of gr-sleipnir:

  • Competitive SNR performance: 3-6 dB better than most commercial/proprietary modes (M17, DMR, D-STAR, Fusion, P25)
  • Superior audio quality: Modern Opus codec (6-8 kbps) provides excellent quality vs AMBE+2/Codec2 (2.45-3.2 kbps)
  • Balanced performance: Unlike FreeDV 700D (which achieves -2 to -3 dB SNR but with very low quality 0.7 kbps audio), gr-sleipnir maintains competitive SNR (0 to +1 dB) while delivering high-quality audio
  • Higher audio bitrate: 6-8 kbps Opus vs 2.45-3.2 kbps for most other modes
  • Open source: Full transparency and customization vs proprietary systems
  • Flexible bandwidth: 9-12 kHz fits standard NFM spacing

Limitation:

  • 4-5% FER floor: Hard-decision LDPC decoder prevents achieving <1% FER (soft-decision decoder would eliminate this)
  • Frequency offset tolerance: System tolerates ±100 Hz offset well, ±500 Hz with moderate degradation, ±1 kHz causes significant FER increase (13-14% vs 4-5% baseline). Frequency offset compensation recommended for offsets >500 Hz.

Detailed Analysis: Comprehensive analysis reports available in test-results-files/analysis/:

  • Performance curves and publication-ready figures
  • Detailed statistics by SNR range
  • Audio quality (WarpQ) analysis
  • Waterfall characterization
  • FER floor analysis
  • Channel model validation
  • Comparative analysis vs M17, DMR, FreeDV, D-STAR, Fusion, and P25

Performance Visualizations:

See Test Results for complete Phase 2 results and Analysis Summary for detailed findings.

gr-sleipnir Performance Validation

Comprehensive GNU Radio simulation testing of gr-sleipnir demonstrates -1 dB SNR waterfall for 4FSK mode and 0-1 dB SNR for 8FSK mode (Phase 2: 1,664 test runs completed December 27, 2025; Phase 3: 7,728 test scenarios completed December 11, 2025, 100% complete). Testing methodology employed systematic SNR sweeps (-2 to +20 dB in 1 dB steps) across multiple channel conditions (clean, AWGN, Rayleigh/Rician fading, frequency offset ±100/±500/±1000 Hz) with automated FER and WarpQ audio quality measurements.

Phase 3 Key Findings (from 7,728 completed tests, 100% complete):

  • 4FSK FER Floor: 6.45% at high SNR (≥10 dB)
  • 8FSK FER Floor: 6.92% at high SNR (≥10 dB)
  • Overall Pass Rate: 81.4% (6,292/7,728 tests passed)
  • Mean WarpQ: 4.83 (excellent audio quality)
  • Text Messaging Overhead: Negligible (<0.14% FER difference, no WarpQ impact)
  • Complete Analysis: Available in test-results-files/final_analysis/:
    • 8fsk_complete.json - Complete 8FSK performance (3,864 tests)
    • voice_vs_voice_text.json - Text messaging overhead analysis
    • phase_comparison.json - Evolution across test phases
    • plots/ - Performance curves and visualizations

Simulation Results:

  • SNR Advantage: Approximately 6 dB SNR advantage over M17 (specification: +5 dB waterfall) and 6-8 dB advantage over DMR (measured ~7 dB requirement)
  • Audio Quality: While FreeDV 700D achieves slightly better simulated SNR performance (-2 to -3 dB), gr-sleipnir delivers 8× higher audio bitrate (6000 bps vs 700 bps) with natural speech quality via Opus codec
  • Unique Combination: gr-sleipnir combines competitive SNR performance with modern Opus codec, ChaCha20-Poly1305 encryption, ECDSA authentication, and 100% open-source implementation including all cryptographic components - a unique combination not found in any other amateur digital voice protocol

Methods:

GNU Radio Version and Configuration:

  • Platform: GNU Radio 3.10 simulation environment
  • Python Version: Python 3.x
  • Sample Rates: RF sample rate 48 kHz, audio sample rate 8 kHz
  • Simulation Mode: File-based I/Q processing (no real-time constraints)
  • Test Framework: Functional unit tests that verify actual code behavior

Channel Model Implementations:

  • Ideal/Clean Channel: No impairments, perfect synchronization
  • AWGN (Additive White Gaussian Noise): Standard Gaussian noise model with configurable SNR
  • Rayleigh Fading: Mobile non-line-of-sight (NLOS) propagation model simulating multipath effects
  • Rician Fading: Mobile line-of-sight (LOS) propagation model with dominant path plus multipath
  • Frequency Offset: Simulated oscillator drift at ±100 Hz, ±500 Hz, and ±1000 Hz offsets
  • Channel Models: Implemented using GNU Radio's gr-analog channel models

Test Framework:

  • Functional Unit Tests: Tests that verify actual encoding, decoding, and cryptographic operations
  • Test Scripts: tests/run_all_functionality_tests.sh - Runs all functional tests
  • Key Test Suites:
    • test_critical_functionality.py - Tests for critical bugs (passthrough, thresholding, etc.)
    • test_ldpc_functionality.py - LDPC encoding/decoding verification
    • test_crypto_functionality.py - Cryptographic operations verification
    • test_actual_code_exercise.py - Meta-test to verify tests exercise code
  • Test Features: Direct verification of encoding/decoding, cryptographic operations, and error correction
  • Metrics Collection: Automated FER, BER, WarpQ score calculation, and pass/fail determination

Statistical Analysis Methodology:

  • SNR Sweeps: Systematic testing from -2 dB to +20 dB in 1 dB steps (23 points)
  • Sample Size: Multiple test runs per configuration for statistical validity
  • Performance Metrics:
    • Frame Error Rate (FER): Calculated as frame_error_count / total_frames_received
    • Bit Error Rate (BER): Calculated from decoded bit errors (when available)
    • WarpQ Score: Perceptual audio quality metric (0-5 scale) comparing decoded audio to reference
  • Waterfall SNR Determination: SNR point where FER drops below 1% or 5% threshold
  • FER Floor Analysis: High-SNR (≥10 dB) FER analysis to identify hard-decision decoder limitations

Limitations of Simulation Approach:

  • Idealized Channel Models: Simulations use mathematical channel models that may not fully capture real-world propagation effects
  • No Hardware Impairments: Simulations assume perfect hardware (no phase noise, oscillator drift, ADC/DAC nonlinearities)
  • No Interference: Simulations do not model adjacent channel interference, co-channel interference, or external RFI
  • Perfect Synchronization: Initial synchronization is assumed perfect; real-world may have acquisition delays
  • No Multipath Delay Spread: Channel models may not fully capture complex multipath scenarios with significant delay spread
  • Limited Doppler Modeling: Fading models may not accurately represent high-speed mobile scenarios
  • No Real-Time Constraints: File-based processing eliminates real-time processing limitations and buffer management issues
  • Audio Quality Assessment: WarpQ scores are computed from file-based audio comparison; real-time perceptual quality may differ

Results:

Important: All performance figures reported are from GNU Radio software simulations, not on-air measurements.

Simulation Results Summary:

  • Total Test Scenarios: 844 test runs completed (Phase 1: 12, Phase 2: 832, Phase 3: removed)
  • Total Test Execution Time: 3h 13m 35s (Phase 1: 2m 47s, Phase 2: 3h 10m 48s)
  • Overall Pass Rate: 20.4% (172/844 tests passed)
  • Note: Phase 3 results removed. Phase 1 and Phase 2 re-run with updated thresholds (5% at 10+ dB) to match actual soft-decision decoder performance (4% FER floor observed)
  • 4FSK Waterfall SNR: -1 dB (simulated, FER < 1% threshold)
  • 8FSK Waterfall SNR: 0 to +1 dB (simulated, FER < 1% threshold)
  • 4FSK Operational SNR: 0-1 dB (simulated, FER < 7% threshold for normal channels)
  • 8FSK Operational SNR: 0-1 dB (simulated, FER < 7% threshold for normal channels)
  • FER Floor: 6.45% for 4FSK, 6.92% for 8FSK at high SNR (≥10 dB) due to hard-decision LDPC decoder limitation (Phase 3 complete data)
  • Frequency Offset Impact: ±1 kHz offset increases FER to ~13-14% (20% threshold acceptable)

Comparison to Published Specifications:

  • M17: Comparison based on published M17 specification (+5 dB waterfall SNR). gr-sleipnir simulation shows approximately 6 dB advantage.
  • DMR: Comparison based on documented DMR SNR requirements (~7 dB for reliable operation). gr-sleipnir simulation shows 6-8 dB advantage.
  • FreeDV: Comparison based on published FreeDV mode specifications. FreeDV 700D achieves -2 to -3 dB waterfall (better SNR) but with much lower audio quality (0.7 kbps vs 6-8 kbps).
  • D-STAR, Fusion, P25: Comparisons based on estimated values from technical specifications; specific waterfall measurements not found in public literature.

Note: Competitive comparisons are made against published specifications and documented requirements, not measured on-air data. Real-world performance of all systems (including gr-sleipnir) may vary from published specifications and simulation results.

Modulation Mode Recommendation

Recommendation: Use 8FSK as primary mode, 4FSK as fallback for extreme weak signal.

Based on comprehensive Phase 3 testing (7,728 tests completed, 100% complete), 8FSK demonstrates superior performance across all metrics compared to 4FSK. The following comparison table shows the performance difference:

Metric 4FSK (rate 3/4) 8FSK (rate 2/3) Winner
Waterfall SNR -1 dB 0 to +1 dB 4FSK (barely)
FER at 0 dB 8.19% 5.96% 8FSK
FER at +10 dB 6.98% 4.34% 8FSK
FER floor (+20 dB) 6.31% 4.17% 8FSK
Audio bitrate 6000 bps 8000 bps 8FSK
Audio quality Good Excellent 8FSK
Pass rate 74.5% 95.0% 8FSK

Key Findings:

  • 8FSK achieves 28% lower FER across all SNR ranges (4.73% vs 6.59% mean)
  • 8FSK has 27.5% higher pass rate (95.0% vs 74.5%)
  • 8FSK provides better audio quality (WarpQ 4.87 vs 4.80)
  • 8FSK wins at 100% of tested SNR points (23/23 from -2 to +20 dB)
  • 4FSK has a slight advantage only at very low SNR (<0 dB) for waterfall threshold

When to Use Each Mode:

  • 8FSK (Recommended): Use for normal operation, provides superior performance and audio quality
  • 4FSK (Fallback): Use only when signal is extremely weak (<-1 dB SNR) and maximum sensitivity is required

Performance / waterfall material

Older waterfall and FER comparison plots lived alongside the GNU Radio 3 tree; they were not carried forward with this repository layout. Treat performance claims in historical sections below as context unless reproduced with your own measurement scripts.

Requirements

GNU Radio 4 toolchain

  • GNU Radio 4.0 (RC2 or later) installed so CMake can find_package(gnuradio4) — typical install prefix /opt/gnuradio4-gcc (set CMAKE_PREFIX_PATH to your layout).
  • CMake 3.22 or later.
  • C++23 compiler; this project prefers g++-14 or g++-15 when auto-detected.
  • gr-opus built for GNU Radio 4, installed so gnuradio4-gr-opus appears under lib/cmake/ (recommended; aligns Opus PDU types with the C++ blocks and tests).

Optional feature packages (enable when their CMake configs are on CMAKE_PREFIX_PATH):

  • OpenSSL — signing-related compile definitions in the interface target.
  • gr-linux-crypto and gr-naclGNU Radio 4 ports for Linux crypto / NaCl wiring when you use those code paths.

Boost.UT (tests)

With GR_SLEIPNIR4_BUILD_TESTS=ON (default), CMake FetchContent pulls Boost.UT on first configure. You need working Git/HTTPS access from the build machine, or an offline mirror strategy.

Python (optional scripts)

Diagnostic and channel scripts under tests/ may require NumPy, SciPy, pesq, pystoi, etc. Use a venv; they are not required to compile the CMake library.

Installation

1. Provide GNU Radio 4 and gr-opus

Install or build GNU Radio 4 and gr-opus for that stack. Note the install prefix that contains lib/cmake/gnuradio4/ and lib/cmake/gnuradio4-gr-opus/ (exact names match your gr-opus install).

2. Configure and build

From the repository root:

cmake -S . -B build \
  -DCMAKE_PREFIX_PATH="/opt/gnuradio4-gcc;<path-to-gr-opus-install-prefix>" \
  -DCMAKE_CXX_COMPILER=g++-14
cmake --build build -j"$(nproc)"

3. Run unit tests

ctest --test-dir build --output-on-failure

4. Install headers and CMake package (optional)

cmake --install build --prefix /usr/local

Use a different --prefix or DESTDIR if you are packaging.

Troubleshooting CMake

gnuradio4 not found

  • Add the GNU Radio 4 install root to CMAKE_PREFIX_PATH (directory that contains lib/cmake/gnuradio4).

gnuradio4-gr-opus not found

  • The project still configures; unit tests link the in-tree gnuradio4::gr-sleipnir target. Add gr-opus’s prefix to CMAKE_PREFIX_PATH when you want find_package(gnuradio4-gr-opus) to succeed.

Boost.UT download fails

  • Allow network on first configure, or vendor ut and adjust FetchContent (advanced).

Usage

C++ blocks (GNU Radio 4)

Include include/gnuradio-4.0/sleipnir.hpp (or individual headers under include/gnuradio-4.0/sleipnir/) in your application. Link gnuradio4::gr-sleipnir after find_package(gr-sleipnir4) once the package is installed, or add the include/ tree and link gnuradio4::gnuradio-core / gnuradio4::gnuradio-blocklib-core as the CMakeLists.txt does for tests.

test/qa_*.cpp shows how SuperframeAssembler, SuperframeParser, TextMessageAssembler, TextMessageParser, SleipnirTxHier, and SleipnirRxHier are driven from Boost.UT.

Text messaging (TX)

Wire blocks in message order:

  1. TextMessageAssemblermsg_in property map: text (UTF-8, max 800 chars), dst ("ALL" or callsign), optional src.
  2. TextMessageAssembler.frame_outSuperframeAssembler.text_frame_in (64-byte PDU per fragment; queue until next voice superframe).
  3. SuperframeAssembleropus_frames_in as before; output superframe includes voice/sync frames plus optional TEXT trailer.

Settings on TextMessageAssembler: src_callsign, enable_signing, enable_encryption, key_source (json / gnupg / galdralag), key_store_path. Signing and encryption require gnuradio4-gr-linux-crypto at build time.

Text messaging (RX)

  1. SuperframeParser splits TEXT trailer from voice PDU; text_frame_out emits each 64-byte fragment.
  2. TextMessageParser.frame_in reassembles fragments; msg_out property map: text, src, dst, verified, decrypted, msg_id.

M17 KISS / LinHT

python/sleipnir/kiss_bridge.SleipnirKissBridge converts sleipnir TEXT frames to/from M17 full-packet KISS (port 1). contact_store.ContactStore resolves callsigns and public keys via gr-linux-crypto when available.

Python helpers

python/sleipnir/ implements offline analogues of the PDU path (superframe_assembler.py, superframe_parser.py, text_message_assembler.py, text_message_parser.py, plus thin SuperframeAssembler.py / TextMessageAssembler.py shims). See python/README_SUPERFRAME.md. Add the repository python/ directory to PYTHONPATH when running scripts.

Example (offline):

from sleipnir.text_message_assembler import TextMessageAssembler
from sleipnir.text_message_parser import TextMessageParser
from sleipnir.superframe_assembler import SuperframeAssembler

asm = TextMessageAssembler(src_callsign="N0CALL")
parser = TextMessageParser(local_callsign="K1ABC")
sf = SuperframeAssembler(callsign="N0CALL")

frames = asm.assemble("Hello world", dst="K1ABC")
text_concat = b"".join(frames)
superframe = sf.assemble(opus_pdu_bytes, text_frames_concat=text_concat)

# RX side: extract text frames from superframe, feed parser
from sleipnir.superframe_parser import SuperframeParser
opus, stats, text_frames = SuperframeParser(local_callsign="K1ABC").parse(superframe)
for fr in text_frames:
    msg = parser.feed_frame(fr)
    if msg:
        print(msg.text, msg.src)

Legacy GNU Radio 3 material

examples/*.grc, grc/, and much of tests/ target the older Python OOT / Companion workflow. They are not exercised by ctest and may be missing dependencies after the GR4 promotion. Use them only if you are reviving that stack.

Project Structure

GNU Radio 4 module layout at the repository root:

gr-sleipnir/
├── CMakeLists.txt                 # gr-sleipnir4 CMake project (interface library + install rules)
├── cmake/
│   ├── gr-sleipnir4-config.cmake.in
│   └── gnuradio4-gr-sleipnir.pc.in
├── include/
│   └── gnuradio-4.0/
│       ├── sleipnir.hpp                    # Convenience umbrella header
│       └── sleipnir/
│           ├── SuperframeAssembler.hpp
│           ├── SuperframeParser.hpp
│           ├── TextMessageAssembler.hpp
│           ├── TextMessageParser.hpp
│           ├── SleipnirTxHier.hpp
│           ├── SleipnirRxHier.hpp
│           └── detail/
│               ├── SleipnirFrameFormat.hpp
│               └── TextFrameFormat.hpp
├── python/
│   └── sleipnir/                  # PDU + text helpers (offline / tooling)
├── test/
│   ├── CMakeLists.txt
│   ├── qa_SuperframeAssembler.cpp
│   ├── qa_SuperframeParser.cpp
│   ├── qa_TextMessageAssembler.cpp
│   ├── qa_TextMessageParser.cpp
│   ├── qa_KissBridge.py
│   ├── qa_SleipnirTxHier.cpp
│   └── qa_SleipnirRxHier.cpp
├── README.md
├── docs/                          # Supplementary Markdown (historical / analysis)
├── examples/                      # GR3-era .grc material (legacy)
├── tests/                         # Python-based validation scripts (outside CMake `test/`)
├── grc/                           # Legacy GNU Radio Companion blocks (GR 3.x)
└── ldpc_matrices/                 # LDPC matrices (legacy artefacts)

Note: External **gr-opus** (GNU Radio 4 build): https://github.com/Supermagnum/gr-opus

Documentation

Supported: GNU Radio 4 module

  • include/gnuradio-4.0/sleipnir/ — block declarations (SuperframeAssembler, SuperframeParser, TextMessageAssembler, TextMessageParser, SleipnirTxHier, SleipnirRxHier).
  • test/qa_*.cpp — runnable examples executed by ctest.
  • cmake/gr-sleipnir4-config.cmake.in — CMake package template installed with cmake --install.
  • Python PDU helpers: python/README_SUPERFRAME.md, python/README_TX_MODULE.md, python/README_RX_MODULE.md.

Historical: GNU Radio 3 era

Markdown under docs/, Companion flowgraphs and notes under examples/, parity matrices under ldpc_matrices/, and assorted tests/*.md describe earlier 4FSK/8FSK experiments, encryption, APRS/text paths, sync frames, PTT wiring, and LDPC assets. That material is not continuously validated by the GR4 ctest targets; use it as background while migrating flowgraphs.

Useful entry points:

Testing

CMake (supported)

After a successful configure/build:

ctest --test-dir build --output-on-failure

This executes qa_SuperframeAssembler, qa_SuperframeParser, qa_TextMessageAssembler, qa_TextMessageParser, qa_KissBridge (pytest), qa_SleipnirTxHier, and qa_SleipnirRxHier. Disable them with cmake -D GR_SLEIPNIR4_BUILD_TESTS=OFF if you intentionally skip Boost.UT (FetchContent).

Legacy Python suites

Older pytest scripts and tests/run_all_functionality_tests.sh targeted the Python OOT and Companion toolchain. References inside tests/README_TESTING.md may list removed files. Scripts that remain (such as tests/test_itu_vhf_channel.py) pull in NumPy / SciPy / optional pesq / pystoi. Treat those runs as best-effort until explicitly ported to GR4.

WarpQ tables (historical context)

Older automation reported WarpQ scores (0 lowest5 reference-like) on decoded waveforms. Those benchmarks came from GR3-era harnesses and modulations; README tables farther above remain narrative context only.

Status

This is an experimental project. The system is functional but may require tuning for optimal performance in various operating conditions.

Known Limitations

High-SNR Audio Quality

The current implementation uses a hard-decision LDPC decoder, which can introduce minor audio artifacts at very high SNR (>10 dB) even when FER is near zero. This is a fundamental limitation of hard-decision decoding.

Impact: Negligible - audio remains fully intelligible and subjectively excellent.

Workaround: None needed - current performance exceeds requirements.

Frequency Offset Tolerance

The system has limited tolerance for frequency offset between transmitter and receiver:

  • ±100 Hz: Minor degradation (~11% FER vs 4-5% baseline)
  • ±500 Hz: Moderate degradation (~13% FER)
  • ±1 kHz: Significant degradation (~13-14% FER)

Impact: Frequency offsets >500 Hz cause noticeable FER increase. This is expected behavior - frequency offset causes symbol timing errors and phase rotation that the hard-decision decoder cannot compensate for.

Workaround:

  • Use frequency offset compensation (Costas loop or similar) for offsets >500 Hz
  • Or accept higher FER (up to 20% threshold) for frequency offset channels
  • Soft-decision decoding would improve tolerance but requires significant implementation effort

Frequency Stability Requirements

4FSK Mode

  • Recommended: ±100 Hz (FER ~4-5%, excellent)
  • Acceptable: ±200 Hz (estimated, not tested)
  • Marginal: ±500 Hz (FER ~13%, 73% success rate)
  • Poor: ±1000 Hz (FER ~14%, unsuitable)

8FSK Mode

  • Recommended: ±500 Hz (FER ~5-6%, good)
  • ±1000 Hz: FER ~10.87%, pass rate 92.4% (8FSK complete data available in test-results-files/final_analysis/8fsk_complete.json)

Hardware Compatibility

Most modern amateur transceivers with TCXO meet ±100 Hz requirement.

Budget radios without TCXO may exceed ±500 Hz drift, causing degradation.

Possible Future Enhancement

Automatic Frequency Control (AFC) implementation for improved tolerance at ±500-1000 Hz offset range.

Why FER Matters

Low FER = Good Performance

FER < 1%:

  • 99+ frames out of 100 decode successfully
  • Audio sounds clean and continuous
  • Occasional frame loss (human ear interpolates)
  • Excellent quality

FER = 4-5%:

  • 95-96 frames out of 100 decode successfully
  • 4-5 frames per 100 lost
  • At 40ms per frame: ~160-200ms lost audio per 4 seconds
  • May cause occasional clicks/warbles
  • Good quality, but not perfect

FER = 10-20%:

  • 80-90 frames out of 100 decode successfully
  • Frequent dropouts
  • Audio choppy but intelligible
  • Marginal quality

FER > 40%:

  • Less than 60% frames decode
  • Severe dropout
  • Difficult to understand
  • Poor quality

High FER = Poor Performance

Comparison to internet voice:

  • VoIP typically: FER < 1% = "good quality"
  • VoIP acceptable: FER < 5% = "usable"
  • VoIP poor: FER > 10% = "degraded"

Why 4-5% FER Floor

Hard-decision LDPC decoder:

  • Demodulator outputs hard bits (0 or 1)
  • LDPC decoder tries to correct errors
  • But loses "soft information" (confidence levels)
  • Can't always correct all errors
  • Result: 4-5% of frames always fail, even at high SNR

Future Work

  • Real-time audio I/O integration (currently file-based)
  • Performance testing and optimization under various channel conditions
  • Enhanced error recovery and frame synchronization
  • Additional modulation modes
  • Integration with additional hardware platforms

License

GPLv3

Contributing

Contributions are welcome. Please ensure all code follows the project's coding standards and includes appropriate tests.

Legal and Appropriate Uses for Amateur Radio

Note: The cryptographic features described below are optional. The system can operate without encryption or signing for basic voice communication.

Digital Signatures (Optional Feature)

  • Cryptographically sign transmissions to verify sender identity
  • Prevent callsign spoofing through cryptographic authentication
  • Replace error-prone DTMF authentication with secure digital signatures
  • Legal: Digital signatures do not obscure content and are generally permitted in amateur radio

Message Integrity

  • Detect transmission errors through cryptographic integrity checks
  • Verify message authenticity to ensure messages haven't been tampered with
  • Non-obscuring authentication tags that verify but don't hide content
  • Legal: Integrity verification does not hide message content

Key Management Infrastructure

  • Secure key storage using Nitrokey hardware security modules and kernel keyring
  • Off-air key exchange using ECDH (Elliptic Curve Diffie-Hellman)
  • Authentication key distribution for establishing trust relationships
  • Legal: Key management does not encrypt on-air content

Important Note

Signing and verifying sender identity is NOT encryption. Digital signatures provide authentication and integrity verification without obscuring the message content, making them appropriate for amateur radio use where encryption is generally prohibited.

Experimental and Research Uses

For experiments or research on frequencies where encryption is legally permitted:

  • Encryption may be used in accordance with local regulations
  • Users must verify applicable frequency bands and regulations
  • This module provides the technical capability; users are responsible for legal compliance

References

About

A Experimental GNU Radio-based digital voice mode designed for amateur radio narrowband FM (NFM) channel spacing, utilizing modern audio codecs for superior voice quality compared to traditional codec2 implementations.

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages