30m Band QRSS Signals


QRSS beacons send their call-signs in Morse so slow that a single character can take a minute — invisible to the ear, but a clear shape on a spectrogram. This project treats decoding them as a computer-vision problem: a distributed receiver network turns the 30-metre band into a stream of spectrogram images, a convolutional neural network reads the call-signs out of them, and every detection is routed by the model’s own confidence into a live catalogue. Optical character recognition, but for Morse code drawn in radio noise.

13 beacons tracked · 11 countries · 4 continents · 4 confirmed · 7 candidate · 2 preliminary
W4HBK JA7NI VK6XT Europe detailed G0PKT PA2A ON5EX DK6UG DO7BJ DL0AO OK1IF F5WK S52AB IK1WVR
Confirmed Candidate Preliminary
Equirectangular · Natural Earth 110m

How it works

The whole thing is an image problem wearing a radio costume. A distributed receiver network turns the band into pictures; a neural net reads call-signs out of those pictures; and a confidence gate, not a human, decides what is trustworthy enough to publish.

CAPTURE · DECODE · ACTIVE LEARNING audio strips call-sign ≥ 0.80 RECEIVERS KiwiSDR · cron rotation SPECTROGRAMS peaks → 64×512 strips CNN CLASSIFIER callsign or ‘unknown’ ROUTING mode + conf gate CATALOGUE live map + table uncertain HUMAN REVIEW label ‘unknown’ strips retrain

Public KiwiSDR receivers are sampled on a cron rotation balanced between day-side and night-side hosts for varied propagation. Each capture is decimated and rendered to a long spectrogram; the pipeline locates narrow-band energy peaks in the 1000–1700 Hz beacon subband, cuts a 64×512 strip around each, and a heuristic stage labels the mode — CW, FSKCW, DFCW, WSPR, FT8. QRSS-like strips go to a small CNN that reads the call-sign straight off the image. The stack is PyTorch.

The most useful result here is a negative one. A 2M-parameter CNN + BiLSTM trained with CTC loss on synthetic spectrograms decodes unseen synthetic call-signs almost perfectly — 97.5% full-call accuracy at 15 dB SNR — and almost nothing on real recordings. No amount of augmentation, blur-matching, or per-capture speed estimation closed that synthetic-to-real gap while the real vocabulary was only a handful of call-signs. The fix was to right-size the model: a 60K-parameter closed-vocabulary classifier — the known call-signs plus an ‘unknown’ class — reaches 85% honest, capture-held-out accuracy on real strips, the first model in the project that generalises across receivers and days.

That small model runs inside a capture → triage → review → retrain loop. A detection is published only when the strip is a QRSS mode, the prediction is a known call-sign, and confidence clears 0.80; anything uncertain or ‘unknown’ is queued for human review. Reviewed labels expand the vocabulary and retrain the classifier in minutes, with no code changes, so the catalogue grows itself. The map’s confirmed / candidate / preliminary tiers are the visible end of that triage.

PyTorch · 64×512 strips · synthetic hold-out 97.5% @ 15 dB SNR · real closed-vocab 85% · 0.80 confidence gate · 58 tests passing

Stations

#CallsignCountryRF, HzSpectrogram