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.