Independent accuracy testing of the PhosphorCW Morse decoder using the CLI test harness (CWDecode). The CLI uses identical DSP code to the iOS app via symlinks — same source files, same binary logic.
Methodology
All tests run via the CWDecode CLI tool, which shares DSP source files with the iOS app via symlinks (single source of truth).
Each file tested twice: once in AUTO mode (AFC + auto-speed) and once with fixed manual parameters (--tone, --wpm, --no-afc).
CW has no framing structure (unlike RTTY), so accuracy is assessed qualitatively: character correctness, word spacing, callsign recognition, and readability of decoded text.
Unrecognised element sequences are shown in angle brackets, e.g. <-.-...>.
All test audio files are real-world recordings from public archives — no synthetic or self-generated test signals.
Full QSO readable; minor dropped chars in fast passages
Fixed --tone 784 --no-afc
828
18.4
—
Excellent
Slightly cleaner — no AFC retune glitches
w1aw_10wpm.wav
AUTO
716
14.7
1
Perfect chars
Every character correct; excess word spaces (Farnsworth)
Fixed --tone 750 --wpm 15 --no-afc
716
15.0
—
Perfect chars
Identical — Farnsworth spacing inherent to source
cw_handkey_vail.wav
AUTO
502
27.0
19
Fair
Readable fragments; irregular hand timing causes errors
Fixed --tone 700 --no-afc
Similar — timing irregularity dominates over AFC effects
Fair
cw_cootie_n1ea.wav
AUTO
312
19.8
10
Poor
Opening words decoded; sideswiper timing defeats adaptive tracker
Fixed --tone 700 --no-afc
Similar — cootie key timing is inherently irregular
Poor
Decoded Output Samples
cw_qso_20wpm.wav — Fixed Tuning (best result)
K8IF DE AA0HW ON THE ICW SERVER CALLING BK AA0HW DE K8IF = R FB CHUCK = OK SOUNDING GOOD CHUCK HOW ARE WE DOING? BK R R FB THMM USIN MY PADDRE ES N W ES NICE TO BE ABLE TO USE PADDLES ON ICW ES AS ASL ALSO BE ABLE TO USE THE KEYBOARD TOO ANYWAY BACK TO YOU K8IF DE AA0HW BK AA0HW DE K8IF - FB CHUCK, GOOD SOUNDING WITH THE PADDLES TOO, NICE AUDIO = WEATHER IS CHANGING NOW, CLOUDS ARE GETTTING THICK, HW? SA0HW DE K8IF K OK 60 <..-.-...> <.--.-..> I AM USIN 2 DIFF PROGRAMES TO SE<-.-..> <.--..>TH THIS ONE NW WITH PAD<-...-..>ES IS CWTYPE AND THIS ONE WITH THE KEYBOARD IS FLDIGI WELL I WILL CLOSE NOW AND GET THIS RECORDING EDITED AND LOADED UP ON THE WEBSITE FOR OTHERS TO HEAR THANK YOU FOR HELPING ME THOM K8IF DE AA0HW BK FB CHUCK LET YOU GET WORKING ON THAT EDIT 73 FOR NOW CUL AA0HW DE K8IF EE <..-...> THOM 73 T U EE E
cw_qso_20wpm.wav — AUTO Mode
K8IF DE AA0HW ON THE ICW SERVER CALLING BK AA0HW DE K8IF = R FB CHUCK = OK SOUN ING GOOD CHUC HOW ARE WE DOING? BK R R FB THMM USIN MY PADDRE ES N W ES NICE TO BE ABLE TO USE PADDLES ON ICW ES II ASL ALSO BE ABLE TO USE THE KEYBOARD TOO ANYWAY BACK TO YOU K8IF DE AA0HW BK AA0HW DE K8IE - FB CHUCK, GOOD SOUNDING WITH THE PADDLES TOO, NICE AUDIO = WEATHER IS CHANGG NOW, CLOUDS ARE GETTTING THICK, HW? SA0HW DE K8IF K OK 60 <..-.-...> <.--.-..> I AM USIN 2 D IFF PROGRAMES TO SE<-.-..> <.--..>TH THIS ONE NW WITH PAD<-...-..>ES IS CWTYPE ND THIS ONE WITH THE KEYBOARD IS FLDIGI WELL I WILL CLOSE NOW AND GET THIS RECORDING EDITED AND LOADED UP ON THE WEBSITE FOR OTHERS TO HEAR THANK YOU FOR HELPING ME THOM K8IF DE AA0HW BK FB CHUCK LET YOU GET WORKIN MN THAT EDIT 73 FOR NOW CUL V0HW DE K8IF EE <-.-...> THOM 73 T U EE
w1aw_10wpm.wav — AUTO Mode (Farnsworth timing)
= N O W 1 0 W P M = T E X T I S F R O M A P R I L 2 0 2 4 Q S T P A G E 3 7 = I F I W E R E T O R E D O M I N E , I W O U L D R A I S E T H E O U T E R H O L E S B Y 1 / 3 2 I N C H T O S L I G H T L Y P R E T I L T T H E E L E M E N T S U P W A R D . S P A C E T H E E N D S O F T H E L E F T A N D R I G H T E L E M E N T S A B O U T 1 I N C H A P A R T A T T H E B O O M , A N D U S E U B O L T S T O A T T A C H T H E B R A C K E T S T O T H E B O O M . M A K E S U R E T H E E L E M E N T S D O N T C O N T A C T T H E B O O M U B O L T S , W H I C H W O U L D S H O R T T H E E L E M E N T S T O T H E B O O M . T H E L P D A F E E D L I N E . E A C H L P D A = E N D O F 1 0 W P M T E X T = Q S T D E W 1 A W
cw_handkey_vail.wav — AUTO Mode (historical hand key)
VVV VVV DE NW6V NW6V EVERYTHINGWE NTWELL L&TPEKANDS<..--.-.>HAN EXCINBNTH& NEVER <----.-.>CFRREB BEF<---.-.>E IRE<.-...-.>D9TOPYNEW6ING<-....-.><---..-.>GHTBEF<---.-.>E 6EP<..--...>LIC. HUNDREDS BEGGEDPDPLE<.--..>EDTOBE <.-.-..>L<---.-->EDGRELY<----.-..>OOKW6EINSCUGN<-.-.-.-.>6EYDEC<.-...-.-.>L6EY<.-----..-.-..>DNOTS<.--.--><.-.-----.-.>D<---.-.>SDR ANDDIDNTC+E<.--....>E6ER6EY<..--.>DERSTO<----..><---.-.>N<---->,9LY6EY<.--.--.>NDYS<.--.-->6EYHADSEENI<-.-.-.-.> <.-.-..>BERTV<.-...-..> <.---..-.>NE31844
Notes on Specific Files
cw_qso_20wpm.wav — ICW Server QSO
A live CW QSO between K8IF (Chuck) and AA0HW (Thom) via an Internet CW server. The operator uses both paddles and keyboard (CWType and fldigi). The decoder correctly identifies both callsigns throughout, reads full sentences, and tracks speed changes as the operator switches between input methods. Fixed tuning at 784 Hz produces marginally cleaner output by avoiding AFC retune transients during operator pauses.
w1aw_10wpm.wav — Farnsworth Timing
ARRL W1AW code practice file from 2024. Uses Farnsworth timing: characters are sent at ~15 WPM but inter-character spacing is stretched to achieve an effective 10 WPM overall rate. The decoder identifies every single character correctly but inserts word spaces between all characters because the extended Farnsworth inter-character gaps exceed the word gap threshold. This is a known limitation — proper Farnsworth detection would require measuring both character speed and effective throughput speed independently, a future enhancement. The decoded text reads: "NOW 10 WPM = TEXT IS FROM APRIL 2024 QST PAGE 37 = IF I WERE TO REDO MINE, I WOULD RAISE THE OUTER HOLES BY 1/32 INCH TO SLIGHTLY PRETILT THE ELEMENTS UPWARD..."
cw_handkey_vail.wav — Historical Straight Key
Recording by NW6V of a hand-keyed transmission describing the history of the Vail telegraph. Hand-keyed CW has inherently irregular timing — dit and dah durations vary significantly with operator technique. The decoder picks up readable fragments ("EVERYTHING WENT WELL", "HUNDREDS BEGGED", "THEY HAD SEEN") and correctly identifies the callsign (NW6V), but the variable timing produces frequent classification errors. This is characteristic of all adaptive CW decoders with hand-keyed input.
cw_cootie_n1ea.wav — Sideswiper Key
A cootie (sideswiper) key demonstration by N1EA. Sideswiper keys produce uniquely erratic timing because the operator must manually control both make and break actions, with no mechanical detent for dit or dah lengths. The decoder correctly identifies "DEMONSTRATION OF" at the opening and the operator's callsign fragments, but the majority of the transmission produces unrecognised element sequences. This is expected behaviour — cootie key recordings challenge even experienced human operators.
AUTO vs Fixed Tuning
File
AFC Events
AUTO Quality
Fixed Quality
Difference
20 WPM QSO
52 (retunes during pauses)
Excellent
Excellent
Fixed slightly cleaner — no retune transients
W1AW 10 WPM
1
Perfect chars
Perfect chars
Identical — clean signal, stable tone
Hand key
19
Fair
Fair
Negligible — timing irregularity dominates
Cootie key
10
Poor
Poor
Negligible — sideswiper timing defeats decoder
Summary
The PhosphorCW decoder demonstrates strong performance on clean, well-timed CW signals and degrades gracefully with increasingly irregular hand-keyed input:
Machine/paddle CW (~18–20 WPM): Excellent. Full QSO readable with correct callsigns, names, and conversational text. Fixed tuning marginally better than AUTO due to avoiding retune transients during operator pauses.
Machine CW (10 WPM, Farnsworth): 100% character accuracy. Every character decoded correctly from W1AW practice transmission. Word spacing affected by Farnsworth timing (a known limitation requiring dedicated Farnsworth detection).
Hand key (straight key, ~25 WPM): Fair. Readable fragments with correct callsign identification. Timing variations inherent to hand keying cause frequent element misclassification — this is characteristic of all adaptive CW decoders.
Cootie/sideswiper key: Poor. Opening words decoded but majority garbled. Sideswiper timing is inherently adversarial to adaptive decoders — even human operators find cootie-keyed CW challenging to copy.
Auto-detection: AFC reliably acquires tone frequency from cold start. Adaptive speed tracking converges within the first few characters. The combination handles unknown signals without manual configuration.
The core decoder (I/Q demodulation + hysteresis comparator + adaptive timing) is accurate. Errors on clean signals are rare and typically occur at operator speed transitions or during AFC retune events.