Independent accuracy testing of the PhosphorRTTY RTTY decoder using the CLI test harness (RTTYDecode). The CLI uses identical DSP code to the iOS app via symlinks — same source files, same binary logic.
RTTYDecode CLI tool, which shares DSP source files with the iOS app via symlinks (single source of truth).--mark, --shift, --baud, --no-afc).| File | Source | Type | Duration | Format | Shift | Baud |
|---|---|---|---|---|---|---|
RTTY_Test_850.wav |
W6IWI | Synthetic QBF + RYRY | 4m 14s | 44.1 kHz, 16-bit, stereo | 850 Hz | 45.45* |
websdr_recording_2024-04-15T23_12_30Z_14089.1kHz.wav |
W6IWI | OTA 20m (14.089 MHz) | 9m 26s | 8 kHz, 16-bit, mono | 170 Hz | 45.45 |
websdr_recording_2024-04-16T00_56_46Z_14089.1kHz.wav |
W6IWI | OTA 20m (14.089 MHz) | 9m 25s | 8 kHz, 16-bit, mono | 850 Hz | 45.45 |
websdr_recording_2022-06-14T23_08_37Z_14086.0kHz.wav |
W6IWI | OTA 20m afternoon | 38m 46s | 8 kHz, 16-bit, mono | 170 Hz | 45.45 |
websdr_recording_2022-03-15T05_45_16Z_7086.0kHz.wav |
W6IWI | OTA 40m night (deep fading) | 26m 08s | 8 kHz, 16-bit, mono | 170 Hz | 45.45 |
random850.wav |
W6IWI | Synthetic random data | 2m 00s | 44.1 kHz, 16-bit, mono | 850 Hz | 45.45 |
* W6IWI labels this file as 60 Bd, but auto-baud detection and manual testing confirm it is 45.45 Bd. Fixed tuning at 60 Bd produces ~975 errors; at 45.45 Bd it produces 0.
| File | AUTO Errors | AUTO Rate | Fixed Errors | Fixed Rate | Fixed Parameters |
|---|---|---|---|---|---|
RTTY_Test_850.wav |
6 / 1,438 | 0.4% | 0 / 1,438 | 0.0% | --mark 1578 --shift 850 --baud 45 |
websdr_2024...170Hz |
182 / 3,264 | 5.6% | 136 / 3,260 | 4.2% | --mark 2125 --shift 170 --baud 45 |
websdr_2024...850Hz |
227 / 3,476 | 6.5% | 12 / 2,993 | 0.4% | --mark 1578 --shift 850 --baud 45 |
websdr_2022...14086kHz |
610 / 13,929 | 4.4% | 93 / 14,067 | 0.7% | --mark 2125 --shift 170 --baud 45 |
websdr_2022...7086kHz |
4,133 / 13,269 | 31.1% | 1,605 / 9,401 | 17.1% | --mark 2047 --shift 170 --baud 45 |
random850.wav |
316 / 597 | 52.9% | 315 / 597 | 52.8% | --mark 1578 --shift 850 --baud 45 |
The ~53% error rate is not a decoder fault. The W6IWI signal generator encodes stop bits as space (0) instead of mark (1) for approximately 53% of frames. The data bits themselves are correct — verified using --lenient mode which bypasses the stop-bit check. This affects random170.wav from the same generator identically.
The worst-performing file at 17–31% errors. This is a nighttime 40-metre recording with severe multipath fading typical of skip-zone propagation. The signal periodically drops below the noise floor entirely. In AUTO mode, each fade triggers AFC LOST re-acquisition (131 events in 26 minutes), burning several frames per cycle. Fixed tuning halves the error rate by avoiding re-acquisition overhead, but the remaining 17% represents genuine signal corruption where even a perfect decoder would fail.
W6IWI's website labels this file as 60 Bd. Testing confirms it is 45.45 Bd. At 60 Bd fixed tuning: 975/1,638 errors (59.5%). At 45.45 Bd fixed tuning: 0 errors. The auto-baud detector correctly identified 45.45 Bd without intervention.
The difference between AUTO and fixed tuning quantifies the cost of AFC re-acquisition:
| File | AFC LOST Events | AUTO Rate | Fixed Rate | AFC Overhead |
|---|---|---|---|---|
| 850Hz QBF | 27 | 0.4% | 0.0% | +0.4% |
| 2024 OTA 170Hz | 25 | 5.6% | 4.2% | +1.4% |
| 2024 OTA 850Hz | 65 | 6.5% | 0.4% | +6.1% |
| 20m OTA afternoon | 162 | 4.4% | 0.7% | +3.7% |
| 40m OTA night | 131 | 31.1% | 17.1% | +14.0% |
Each AFC LOST event costs approximately 3 frames during re-acquisition. On noisy signals, AFC re-acquisition is the dominant source of errors rather than bit-level decoding failures.
The PhosphorRTTY decoder demonstrates strong performance across a range of real-world and synthetic RTTY signals: