Add .gitignore entry for data/subghz/captures/ to prevent large
IQ recording files from being committed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three bugs preventing the live SSTV pipeline from working:
1. Race condition: self._running was set AFTER starting the decode
thread, so the thread checked the flag, found it False, and exited
immediately without ever processing audio.
2. Ghost running state: when the decode thread exited (e.g. rtl_fm
died), self._running stayed True. The decoder reported as running
but was dead, and subsequent start() calls returned without doing
anything - permanently stuck until app restart.
3. VIS detection fragility: unclassifiable windows at tone transition
boundaries (mixed energy from two tones) caused the state machine
to reset from LEADER/BREAK states back to IDLE, dropping valid
VIS headers on real signals.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
slowrx is a GTK GUI app that doesn't support CLI usage, so the SSTV
decoder was silently failing. This replaces it with a pure Python
implementation using numpy and Pillow that supports Robot36/72,
Martin1/2, Scottie1/2, and PD120/180 modes via VIS header auto-detection.
Key implementation details:
- Generalized Goertzel (DTFT) for exact-frequency tone detection
- Vectorized batch Goertzel for real-time pixel decoding performance
- Overlapping analysis windows for short-window frequency estimation
- VIS header detection state machine with parity validation
- Per-line sync re-synchronization for drift tolerance
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>