|
| 1 | +# Changelog |
| 2 | + |
| 3 | +User-facing changes to `sdr_dsp`, newest first. The format follows |
| 4 | +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and versions follow |
| 5 | +[Semantic Versioning](https://semver.org/) -- while the major version is 0, |
| 6 | +minor releases may change the public API. |
| 7 | + |
| 8 | +The dated engineering narrative behind these entries (what was tried, what |
| 9 | +was measured, why a design went the way it did) lives in `docs/LOG.md`. |
| 10 | + |
| 11 | +## [Unreleased] |
| 12 | + |
| 13 | +### Fixed |
| 14 | +- Docstrings on `GainStage.default_value` and |
| 15 | + `GainModel.by_name` / `min_settings` / `default_frontend` / `frontend_db`; |
| 16 | + the public-surface test was failing on every CI platform without them. |
| 17 | + |
| 18 | +### Changed |
| 19 | +- Package description and README links prepared for PyPI (absolute links to |
| 20 | + the docs; "personal" dropped from the one-line description). |
| 21 | +- Python 3.14 added to the CI matrix and the trove classifiers. |
| 22 | + |
| 23 | +### Added |
| 24 | +- 89 edge-case tests (`tests/test_core_edges.py`, `test_io_link_edges.py`, |
| 25 | + `test_stream_sources_edges.py`) covering empty-input guards, argument |
| 26 | + validation, every streaming stage's `reset()`, and alternative branches |
| 27 | + that had no test (LSB modulation, the odd-length Hilbert kernel, the RRC |
| 28 | + singularity tap, explicit ASK/FSK decision levels, SigMF path resolution, |
| 29 | + gain-search escalation and back-off). Line coverage 95% -> 99.6%. |
| 30 | +- Hardware / bench-report issue form and a pull-request template. |
| 31 | +- This changelog. |
| 32 | + |
| 33 | +## [0.2.0] - 2026-10-24 |
| 34 | + |
| 35 | +First version prepared for packaging. Not yet published to PyPI. Highlights |
| 36 | +of the tree as of this version, by area; see `docs/MODULATIONS.md` for what |
| 37 | +"supported" means per scheme and `docs/sdr_dsp_REFERENCE.md` for the full map. |
| 38 | + |
| 39 | +### Added |
| 40 | +- **Receive:** FM demodulation with carrier-offset estimate/correct and a |
| 41 | + pilot-locked stereo decoder (validated on real over-the-air captures); |
| 42 | + AM / SSB / CW; OOK / ASK; 2-FSK and N-level FSK; the PSK family; QAM-16; |
| 43 | + spread-spectrum despreading. Digital schemes are verified against |
| 44 | + synthetic ground truth only. |
| 45 | +- **Transmit:** matching modulators with pulse shaping, driven through the |
| 46 | + `TXSink` seam; a loopback sink for closed-loop software tests. |
| 47 | +- **Link layer:** framing with CRC, and a windowed ARQ engine (window 1 = |
| 48 | + stop-and-wait) with pluggable drivers, proven in closed-loop simulation. |
| 49 | +- **Core DSP:** FIR design/apply, polyphase resampling, channelization, |
| 50 | + mixing, spectral estimates, AGC, timing and carrier sync, calibration, |
| 51 | + detection, measurement, and channel-impairment modelling with feature |
| 52 | + extraction (fingerprint F0-F2/F4/F5). |
| 53 | +- **Streaming:** `Pipeline` plus block-wise `StreamingFIR`, |
| 54 | + `StreamingResampler` and related stages for live use. |
| 55 | +- **I/O:** SigMF read/write; `FileSource` / `ArraySource`; WAV, IQ, plot and |
| 56 | + TX sinks. Device adapters (HackRF via `hackrfpy`) live in `examples/`, |
| 57 | + not the core. |
| 58 | +- **Gain search:** device-agnostic `GainModel` / `GainStage` with a |
| 59 | + measured-pilot quality metric and clip back-off. |
| 60 | +- `py.typed` marker (most signatures are still unannotated; see |
| 61 | + `docs/TODO.md`). |
| 62 | + |
| 63 | +### Infrastructure |
| 64 | +- CI matrix: Windows / Ubuntu / macOS x Python 3.11-3.13, an oldest-declared |
| 65 | + numpy/scipy leg, a build-the-wheel-and-import-it leg, ruff + mypy, and an |
| 66 | + LF line-ending guard. |
| 67 | + |
| 68 | +[Unreleased]: https://github.com/LC-Linkous/sdr_dsp_python/compare/v0.2.0...HEAD |
| 69 | +[0.2.0]: https://github.com/LC-Linkous/sdr_dsp_python/releases/tag/v0.2.0 |
0 commit comments