PhosphorFeld — Decoder Test Results
Independent accuracy testing of the PhosphorFeld Hellschreiber decoder using the CLI test harness (HellDecode). The CLI uses identical DSP code to the iOS app via symlinks — same source files, same binary logic.
Methodology
- Test signals generated by
HellGen — a companion CLI tool that synthesises Feld-Hell WAV files from text input using a standard 7×7 pixel font.
HellGen also outputs a reference PGM (portable greymap) image — the ground truth bitmap for each test signal.
HellDecode reads the WAV, runs the identical DSP chain (via symlinked source files), and outputs a decoded PGM image.
- Accuracy measured by Pixel Error Rate (PER): both images thresholded at 0.5, then pixel-by-pixel Hamming distance comparison.
- Both tools use fractional-phase pixel clock accumulators to avoid integer truncation drift.
Decoder Settings (defaults)
- Sample rate: 8 kHz (resampled from source)
- FFT: 512-point, Hann window, ~15.6 Hz/bin
- Tone detection: I/Q quadrature demodulation, biquad LPF (147 Hz cutoff = 1.2× pixel rate)
- Envelope: asymmetric decay-average (attack = symbollen/4, decay = symbollen×16)
- Pixel clock: free-running, 122.5 Bd, peak-hold per pixel period (fldigi-style)
- Pixel normalisation: slow-decaying peak-hold of output pixel values
- Squelch: column-level — entire column blanked if squelch open <30% of column duration
- AFC: single-tone peak search in 700–1500 Hz, 3-frame confirmation
Test Files
| File | Source | Tone | SNR | Notes |
| hell_qbf_980hz_clean.wav | HellGen | 980 Hz | Clean | Baseline — “THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG” |
| hell_qbf_1050hz_clean.wav | HellGen | 1050 Hz | Clean | Off-frequency — AFC acquisition test |
| hell_qbf_980hz_snr20.wav | HellGen | 980 Hz | 20 dB | Moderate noise |
| hell_qbf_980hz_snr10.wav | HellGen | 980 Hz | 10 dB | Heavy noise — real OTA conditions |
| hell_qbf_980hz_snr6.wav | HellGen | 980 Hz | 6 dB | Marginal signal |
| hell_qbf_980hz_inverted.wav | HellGen | 980 Hz | Clean | Inverted polarity (decoded with --invert) |
| hell_qbf_980hz_drift10.wav | HellGen | 980 Hz | Clean | 0.167 Hz/s frequency drift |
Download Test Files
These WAV files can be played from a speaker near the iPhone microphone to test the app. All files are 8 kHz mono, ~34 seconds, generated by HellGen. The message is “THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 0123456789”.
Testing Instructions
- Download one of the WAV files above (start with the clean 980 Hz baseline).
- Launch PhosphorFeld. In CONFIG (F4): set AUTO TONE to ON, SQUELCH to 0.002 (default), INVERT to OFF.
- Go to DECODE (F1). Set GAIN to ~60–70%. Tap START.
- Play the WAV from a speaker at moderate volume, 15–30 cm from the iPhone mic.
- Status bar should show LOCKED within 1–2 seconds. Greyscale text glyphs will paint across the strip.
- Check SIGNAL (F2) for the FFT peak and waterfall. Check LOG (F3) after stopping for saved sessions.
Hellschreiber output is intentionally “fuzzy” — you read the painted pixel glyphs with your eyes, just as Rudolf Hell intended in 1929. There is no character recognition. Characters appear twice vertically (the 14-row redundancy strip) because transmitter and receiver are not synchronised.
Results
| Test Case | PER | Target | Status |
| Clean 980 Hz | 0.50% | < 1% | PASS |
| Off-frequency 1050 Hz (AFC) | 0.00% | < 2% | PASS |
| 20 dB SNR | 7.02% | < 5% | CLOSE |
| 10 dB SNR | 7.69% | < 15% | PASS |
| 6 dB SNR | 8.76% | < 30% | PASS |
| Inverted polarity | 0.00% | < 1% | PASS |
| Frequency drift | 0.00% | < 3% | PASS |
Notes
- Clean signal PER (0.50%): the small non-zero error is from the pixel peak-hold decay between the generator and decoder — peak-hold captures boundary transitions differently than the reference binary image. Visually perfect.
- SNR 20 dB (7.02%): slightly above the 5% target. Noise peaks captured by peak-hold produce occasional false-bright pixels. Characters remain clearly readable.
- SNR 6 dB (8.76%): well within the 30% target. Characters are degraded but recognisable — consistent with real OTA conditions at marginal signal levels.
- AFC acquisition: the off-frequency test (1050 Hz with initial detector at 980 Hz) shows 0% PER — AFC acquires within 3 FFT frames (~300 ms) with no lost columns.
- Pixel Error Rate is a conservative metric for Hell. Unlike RTTY (where a wrong character is unambiguously wrong), Hell is visual — the human eye tolerates substantial pixel-level degradation while still reading the text. PER measures pixel-level accuracy; readability is better than PER suggests.
DSP Reference
- Pixel clock: fldigi-style peak-hold per pixel period (not averaging)
- LPF bandwidth: 1.2× pixel rate (fldigi default)
- Display: greyscale “fuzzy” presentation — no hard thresholding (ZL1BPU recommendation)
- Pixel aspect ratio: taller than wide (1:1.8) matching traditional Hell receivers