Releases: pclov3r/iq_tool
3.0
Architecture and Pipeline Overhaul
-
Pipeline Source Generalization: Abstracted the SDR capture subsystem into a generalized
Sourceconcept. This resolves previous abstraction leaks and unifies hardware (RTL-SDR, HackRF, etc.), file, and network inputs under a single, unified data-acquisition interface. -
In-Place DSP Processing: Refactored the core digital signal processing chain to execute mathematical operations in-place. This dramatically reduces memory bandwidth utilization by eliminating redundant buffer allocations and memory copies during DSP stages.
-
Ring Buffer Arena Migration: The pre-existing
MemoryArenawas expanded from 16 MB to a 1 GB virtual allocation. The lock-free Ring Buffers were migrated off of standardmalloc/aligned_allocand unified into this arena, centralizing memory management for massive data streams. Added strict power-of-two alignment assertions and patched integer arithmetic edge-cases to prevent capacity overflows. -
Audio API Centralization: Overhauled audio playback routines across modules (AM, NFM, WFM) into a centralized, generic API. Audio buffers were concurrently enlarged to mitigate driver underruns.
-
Sample Format Master API: Centralized all complex sample format definitions (
cs16,cu8,cf32) into a master lookup table, stripping out redundant, hardcoded format conversions across individual I/O modules.
I/O Modules and Integrations
-
Dynamic Library Loading:
libnrsc5is now loaded dynamically at runtime on Windows, removing the hard compile-time linkage requirement.To use the nrsc5 module with precompiled Windows binaries, you must source the
libnrsc5.dlllibrary or build it yourself and copy it to the program folder. -
Demodulation Audio Writer: Added a unified audio writer (
--audio-writer) and mute capability (--mute-audio) for all demodulation modules, allowing demodulated audio to be saved directly to a WAV or RF64 file while optionally muting live playback. -
WAV Module Enhancements:
- Implemented sequential file reading for split WAV captures (
--wav-read-split-files) and looping (--wav-repeat,--rawfile-repeat). - Injected SDR Console XML metadata natively into WAV outputs via the
auxiRIFF chunk. - Hardened the split WAV prober with explicit Out-of-Memory (OOM) validations.
- Implemented sequential file reading for split WAV captures (
-
New Pipeline Targets:
- Introduced the
stdinmodule, enabling raw stream ingestion from OS pipes. - Introduced the
directpipeoutput module, allowing raw byte streams to bypass standard stdout formatting for advanced Unix pipeline integration.
- Introduced the
-
NRSC5 AAS Payload Extraction: Enabled the extraction and dumping of Advanced Application Services (AAS) data payloads within the NRSC5 decoder (
--nrsc5-aas-dir). -
Hardware Specifics:
- HackRF IF/VGA gain arguments are now automatically rounded to the nearest hardware-supported tier instead of returning errors.
- SpyServer network buffers were tuned to mitigate latency, alongside new logging throttles to prevent disk spam during buffer overruns.
Command Line Interface (CLI) Enhancements
-
Flag Standardization and Renames:
- Renamed
--output-rateto--output-sample-ratefor clarity. - Renamed
--raw-file-input-*and--rawfile-input-rateflags to a unified--rawfile-input-sample-rateand--rawfile-input-sample-formatstructure. - Renamed
--stdin-input-rateto--stdin-input-sample-rate. - The
--wfm-rbdsflag was inverted and renamed to--wfm-rds(World RDS mode), as US RBDS is now the default behavior. - The internal resampler passthrough logic was renamed and unified to prevent raw passthrough usage with audio outputs.
- Renamed
-
Removed Flags: Completely removed the
--agc-profileflag in favor of the new universal tracker. (Note: A--dbm-offsetflag was temporarily introduced during development but was removed prior to release as internal measurements were fully standardized to dBFS). -
Inactive Flag Warnings: The CLI now intelligently warns the user if they pass options that are inactive or will be ignored based on their current pipeline configuration.
-
Error Log Refinements: Fixed mismatched CLI flag names that were appearing incorrectly in error logs, and gracefully downgraded multiple CLI parsing validation errors from hard
FATALcrashes to cleanERRORexits.
Digital Signal Processing (DSP) and Math
-
AGC Simplification: Stripped out the legacy, multi-profile AGC system to drastically simplify the architecture, standardizing the entire application on the single, pre-existing Harris/LMS block-level tracker. Global AGC deadband calculations were fine-tuned for stability.
-
NFM Squelch Evaluation: Transitioned Narrowband FM squelch evaluation from instantaneous magnitude checks to block-level Signal-to-Noise Ratio (SNR) calculations, heavily reducing audio stutter on marginal signals.
-
Measurement Standardization: Standardized all internal signal power measurements to dBFS (Decibels relative to Full Scale), entirely removing uncalibrated dBm references from the codebase.
-
RDS Standard: Configured the Redsea wrapper to default to the US RBDS standard for FM subcarrier decoding.
Stability and Security Fixes
-
File Operations: Refactored and hardened the global Time-of-Check to Time-of-Use (TOCTOU) file overwrite validations into
utils.c. Fixed a major pipeline regression that caused earlyEOFfile truncations during teardown. -
Memory Corruption: Resolved a memory corruption vulnerability within the
argparseimplementation caused by native boolean misalignments. -
Buffer Overflows: Fixed a critical buffer overflow in the 24-bit audio interleaver and resolved out-of-bounds array accesses within the CS24 conversion routines. Corrected FFT scratch buffer size allocations.
-
Concurrency: Fixed race conditions in the AGC SIMD processing and resolved multiple pipeline deadlocks. Addressed a thread priority assignment bug that returned spurious "Failed: Success" OS errors.
-
Logic Errors: Fixed an NCO execution order bug occurring prior to resampling, and resolved missing buffer copies when executing the pipeline in
raw-passthroughmode. -
Windows Compatibility: Fixed null-termination of the SDRplay registry path string on Windows and resolved character encoding issues in Windows log outputs.
Other Changes
- Plus various other minor cleanups, formatting improvements, console log pacing adjustments, compiler optimizations, and CMake build options.
For an exhaustive list of all changes, please refer to the Full Changelog: 2.5...3.0
2.5
2.4.2
2.4.1
2.4
New Audio Demodulation Modules
- WFM Stereo: Added Wideband FM support with Pilot PLL, De-emphasis, and TPDF Dithering.
- Includes RDS/RBDS decoding via Redsea integration.
- Real-time signal statistics (RSSI, SNR, Pilot Error).
- NFM: Added Narrowband FM support
- AM: Added AM support with Synchronous (PLL) and Envelope modes.
- NRSC5: Added native HD Radio playback support. (Note: The native output module is excluded from Windows builds, but piping raw data to the external
nrsc5tool is still fully supported).
New Hardware Support
- Airspy: Added native support for Airspy R2 and Mini.
- Airspy HF+: Added native support.
Core Improvements & Bug Fixes
- High-Tap Filter Crash: Fixed a heap corruption bug when initializing FFT filters with large tap counts (e.g. >4096 taps).
- RTL-SDR:
- Fixed USB transfer failures by enforcing 512-byte buffer alignment.
- Forced "Buffered Mode" to prevent sample drops/hangs when piping output.
- Fixed gain rounding logic and added better gain reporting.
- SDRplay: Fixed a double-free crash during device shutdown.
- Pipeline: Fixed data path issues for Raw Passthrough when running in buffered mode.
- Build: Fixed debug build configuration and silenced deprecated API warnings.
Full Changelog: 2.3...2.4
2.3
This release includes general stability and handling improvements.
Some new features added
CLI options have changed; see the README for details.
Full Changelog: 2.21...2.3
2.21
In this release:
-Output gain AGC was changed.
-There is now manual output and input gain multipliers.
-Bug with CS24 not working with raw file input was fixed.
-CS24 and output CS32 and CU32 sample conversion loop performance was increased.
-DC blocker cutoff frequency was moved from 10Hz to 50 Hz
Code was also cleaned up