Why 12m Looks “Noisy” on the Raspberry Pi
NOTE: This document was split out of the main FAQ for readability.
1. Observations
Test tone at 24.926 MHz (12m) looks clean on the scope.
WSPR transmission on 12m appears to be noise or “hash”.
Other bands (10 m, 15 m, etc.) appear cleaner under similar conditions.
The effect is much stronger on Raspberry Pi 4 than on older Pis.
No LPF or passive filtering is present; probing is directly on GPIO 4.
This behavior is expected given how the signal is generated and the differences in Pi 4 hardware.
2. Why Test‑Tone Is Clean but WSPR Looks Noisy
Test‑Tone Mode
Generates a single, constant frequency.
No fractional scheduling.
No rapid switching between tones.
GPIO outputs a steady divider → narrow spectrum (aside from harmonics).
WSPR Mode
Uses four closely spaced tones.
Each symbol duration is generated by fractional switching between two adjacent divider values (f0 / f1) to hit the exact desired frequency.
This results in many rapid GPIO transitions within each symbol.
Without filtering, these transitions appear as:
Broadband energy on a scope
“Noise‑like” waveform instead of a clean sinusoid
3. Why 12m is Worse Than Other Bands
12m sits in a bad corner case:
High enough frequency that GPIO edges are extremely sharp in phase terms.
Small divider differences → fine‑grained fractional dithering.
Fractional scheduling creates very short segments:
A few PWM clocks of f0
Followed by a few PWM clocks of f1
These tiny segments behave like phase noise / wideband FM.
Other bands:
Larger divider gaps or different ratios.
Fractional error spreads more benignly.
Less visible broadband hash on a scope.
4. Why Raspberry Pi 4 Is Much Worse Than Pi 1/2/3
GPIO Hardware
Pi 4 GPIO edges are much faster (sub‑2 ns rise time).
Faster edges → more high‑frequency content → more visible noise.
Clocking Architecture
Pi 4 uses multiple high‑speed PLL domains:
PLLD_PER
PWM clock
Core / VPU clocks
Fractional scheduling errors are no longer “blurred” by slow hardware.
PWM Clock Rate
Pi 4 PWM clock ≈ 500 MHz domain.
Tiny timing errors become real RF events.
Older Pis had slower clocks and unintentionally smoothed things out.
Net effect:
Pi 4 exposes exactly what the math is doing.
5. What Was Changed in the Software
The original scheduler:
Used round() each iteration.
Produced unpredictable tiny segments.
Randomized iteration length.
Generated high‑rate, irregular tone switching.
Improvements Made
Fixed‑Point Bresenham Scheduler
Error‑accumulator style scheduling.
Exact long‑term frequency ratio.
Deterministic behavior.
Predictable Toggle Cadence
Fixed block size (PWM_CLOCKS_PER_ITER_NOMINAL).
No random jitter.
Tail Clamp
If the remaining clocks are small, send only one tone.
Prevents end‑of‑symbol micro‑toggles.
Tiny‑Segment Merge
If n_f0 or n_f1 < threshold:
Merge the entire block into one tone.
Eliminates 2-10‑clock fragments.
Extensive Debug Instrumentation
Counts actual switches.
Logs tiny / zero‑length segments.
Proves why 12m is noisy before.
These changes significantly reduce broadband hash, especially on Pi 4.
6. Is This “Fixed” Without an LPF?
No - and that’s expected.
Important Reality Check
GPIO RF output is not a DAC.
It is a fast square‑wave source.
Software can reduce unnecessary modulation artifacts, but cannot remove harmonics.
A low‑pass filter is mandatory for:
Legal operation
Spectral cleanliness
Making Pi 4 look as good as Pi 1/2/3 did “bare.”
With a proper LPF:
The 12m WSPR signal will look clean.
The remaining differences between bands largely disappear.
7. Final Takeaway
12m looks noisy because fractional dithering + fast GPIO edges were fully exposed on Pi 4.
The issue is not a bad frequency, band bug, or calibration error.
Software changes addressed avoidable noise:
Tiny segments
Randomized timing
Unpredictable switching
Pi 4 is simply more honest - and less forgiving - than older Pis.
With the current scheduler and a proper LPF, the signal is correct.
In short:
Nothing is “wrong” with 12m. The Pi 4 just stopped hiding the physics.