Skip to main content

Why RFWhisper?

The noise floor isn't what it used to beโ€‹

If you've tried to work a POTA station on 40m from a townhouse, chased DX through a neighbour's plasma TV, or decoded FT8 next to an EV charger, you know the modern noise floor is unrecognizable compared to a decade ago. The culprits:

Noise sourceCharacterTypical footprint
Switch-mode / LED driversBroadband hash, 20โ€“150 kHz spursHF wide-band raised floor
Solar inverters (MPPT)Rhythmic buzz40mโ€“10m, drifts with sun
VDSL / PLC / powerline ethernetWideband raised floor, data combs1.8โ€“30 MHz
Plasma TVs, touch lamps, grow lightsNarrowband carriersRandom on HF
Neighbor electric fences, thermostatsRegular click trainsRural/suburban
Atmospheric QRNImpulsive crashes, seasonalLF/MF/low-HF

Traditional DSP tools (analog NB/NR, classical Wiener filters, simple spectral subtraction) either:

  1. Miss modern complex impulsive + stationary mixtures.
  2. Wreck the signal โ€” they smear CW keying transients, introduce "underwater" artifacts that confuse FT8/WSJT-X decoders, or chew the atmospheric hiss so aggressively that weak signals disappear under a gated floor.

The RFWhisper approachโ€‹

Use a deep neural network designed for speech denoising (DeepFilterNet3) and fine-tune it on real amateur-radio noise โ€” recorded powerline buzz, inverter hash, static crashes โ€” so it learns to preserve SSB phonemes, CW keying transients, and FT8 tones while killing QRM.

Then wrap it in a pipeline that:

  • Runs locally (CPU or GPU) โ€” no cloud, no telemetry.
  • Integrates with GNU Radio + SoapySDR so any SDR or rig's audio works.
  • Emits to a virtual cable so WSJT-X / fldigi / JS8Call / your headphones see clean audio transparently.
  • Stays under 100 ms p99 latency (target < 50 ms by v0.3).
  • Is GPLv3 so nobody can take it closed.

The non-negotiablesโ€‹

Three things RFWhisper will never do, full stop:

  1. Damage CW keying transients. We run a CI gate that measures RMS energy in the first 5 ms of each dit. A model that drifts outside ยฑ1 dB of raw does not ship.
  2. Reduce FT8/FT4 decode counts. We replay a 15-minute FT8 cycle against WSJT-X on every candidate model. If it loses even one decode or fabricates one false decode, it's rejected.
  3. Mandate an internet connection at runtime. Models are fetched once at install (SHA-256 verified), and the pipeline runs offline forever after.

Testable value: four concrete examplesโ€‹

These live in tests/audio/ and run in CI. See ROADMAP.md ยง Acceptance Criteria for the full list.

#DemoPass criterion
1Weak 40m SSB under S7 powerline buzzโ‰ฅ 4/5 blind listeners prefer denoised AND copy +1 word/sentence
215-min FT8 cycle through WSJT-XDenoised decodes โ‰ฅ raw decodes, zero false decodes
325 WPM CW under atmospheric QRNfldigi copy accuracy unchanged, crashes โˆ’6 dB audibly
4End-to-end latency probe< 100 ms p99 on i5-8xxx / M1 / RPi 5

Who this is forโ€‹

  • Contesters who want to keep decoding weak stations in a crowded band.
  • POTA / SOTA operators running from townhouses, condos, or next to a solar farm.
  • Weak-signal specialists on 630m / 2m EME / microwave where every dB counts.
  • EmComm operators who need a tool that works when the internet doesn't.
  • DSP and ML hackers who want a serious, well-documented sandbox for real-time audio neural nets.
  • Any ham who has ever shrugged at their S9+10 noise floor and said, "there's nothing I can do about it."

There is something you can do about it. 73