Skip to content

WSPR — measure your own antenna ​

Radio / CAT — 1.53.0

The shared Radio/CAT panel is at the top. Frequency steps now also include 1 MHz and 10 MHz. Connect and Disconnect are available in the Transceiver menu, which reflects the current connection state.

WSPR (Weak Signal Propagation Reporter, pronounced «whisper») is not a mode for making contacts, it is a mode for measuring. Every few minutes a station sends its callsign, locator and power for just under two minutes — at so little power that the signal disappears into the noise. Receivers around the world dig it back out and report it to WSPRnet.

That answers what otherwise stays guesswork: does the new antenna reach further than the old one? In which direction? On which band?

HAM-Tools covers the whole path — receiving, transmitting, evaluating. WSJT-X is not required.

New in 1.44.0

The whole module is new. It closes the loop with the antenna simulator: model the antenna, build it, measure it with WSPR, compare — all in the same app, with the same radio.

Opening the module ​

WSPR sits in the sidebar among the main applications, below Winlink. Like the logbook and SSTV it takes over the whole window: operation on the left, results on the right. ‹ Overview takes you back.

Receiving within five minutes ​

  1. Set Audio → Input (RX) to the radio's USB codec — not the Mac microphone. On first start macOS asks for microphone permission.
  2. Choose Operation → Band. With a CAT connection the radio jumps to the right frequency by itself; otherwise an orange line tells you to set it by hand.
  3. Start reception.

Seeing «Waiting for the next even minute» afterwards is normal: WSPR starts exclusively on even UTC minutes. The first result takes at least two minutes, in the worst case just under four.

The dial frequency is not the transmit frequency

The WSPR window sits 1400–1600 Hz above the dial frequency. On 20 m the radio therefore reads 14.0956 MHz while the signals are around 14.0971 MHz. The mode is USB, or better USB-D (data mode) — there the audio comes from the USB codec instead of the microphone, with no compressor in the way.

Transmitting ​

Transmitting has two locks: it needs «Allow transmitting» and a transmit share above zero. Working through the settings therefore cannot key the PTT by accident.

  1. Set Audio → Output (TX) to the USB codec.
  2. Check Your details: callsign, four-character locator, power.
  3. Switch on Transmit → Allow transmitting.
  4. Send tuning tone and watch the ALC on the radio.
  5. Transmit once for the first attempt — it transmits in the next window, regardless of the transmit share.

While transmitting, a red TRANSMITTING badge lights up at the top right.

Setting the level ​

The tuning tone has the same amplitude as the later transmission. That is the trick: WSPR is 4-FSK with a constant envelope, so a continuous tone loads the modulator in exactly the same way. Whatever you set here holds for the beacon.

The rule is the same as for any data mode: turn it down until the ALC just begins to respond. Overdriving produces exactly the spurious emissions that 4-FSK is designed to avoid — and in the 200 Hz wide WSPR window the neighbours sit close.

The tuning tone occupies the band

It sits in the middle of the WSPR window and covers everything there for its duration. That is why it runs for at most 20 seconds and can be stopped at any time. Use it sparingly.

Transmit share ​

The share of windows in which you transmit. 20 % is the usual figure. Transmitting constantly means hearing nothing yourself and occupying the narrow band for everyone else.

Which windows are used is derived from the window number and your callsign — neither random nor rigid. A fixed rotation («every fifth window») would make all stations with the same setting transmit simultaneously and cover each other.

State the power honestly ​

WSPR transmits power in stepped values (0, 3, 7, 10 … 60 dBm). 23 dBm is 200 mW — the usual beacon level.

The figure ends up in other people's evaluations, so it should be right. Careful with percentage controls on the radio: on most sets the power scale is not linear, so 2 % is not reliably 2 % of rated power.

Band changing for multi-band antennas ​

To check an antenna on several bands, let it cycle: Band changing → Change bands automatically, tick the bands you want and set how many windows to stay on each.

The change applies to receiving and transmitting — both are measured on every band. Below the band list you see how long one full pass takes.

Dwell time

One window per band cycles fastest, but with a small transmit share it means a long wait for a transmission on each band: with three bands and 20 %, a given band gets a transmission only about every half hour. For a multi-band test, two or three windows per band are more practical.

The results ​

Above the table are three points of view:

I hearstations received here
Hearing mereports about your own beacon, from WSPRnet via wspr.live
Compareantenna comparison across two measurement periods

For the first two you can switch between list and map.

Narrowing things down ​

Below that sits the filter bar. It applies to list and map alike and across both points of view — switching between «I hear» and «Hearing me» then shows you the same measurement from both sides, rather than two different time windows without your noticing.

Time rangeLast hour · 6 h · 24 h · Today · Custom range · Everything — and below those, the measurement sessions you have created
BandEvaluating across bands tells you nothing; with band hopping running, picking one is effectively mandatory
Hide questionableRemoves misdecodes and unresolved type 3 hashes from list and map

All times are UTC, the date fields included. WSPR runs on UTC, and a measurement boundary in local time would be impossible to make sense of six months later.

«Hide questionable» throws away good data too

Type 3 spots («not yet known») are genuine receptions — with a six-character locator, so more precise than the normal case. They merely lack a name. Setting the switch loses them as well.

Decoding is happening, but the list stays empty

Then the time filter points elsewhere. A strip appears above the list saying «N new spots fall outside the time filter», with a button to reset — otherwise a tightly drawn filter would look like a dead receiver.

The list shows at most 2000 rows. If more fall within the range, the footer says so — nothing is truncated silently.

Map ​

Shows the paths as great circles — the direction in which a signal leaves the station is the crux of an antenna comparison, and a straight line in the map projection would be misleading there.

Colour follows signal strength across the range in which WSPR lives (−30 to 0 dB): cold for what barely arrives, warm for strong signals. Each station gets one dot with its best value; the number of reports is in the tooltip.

Top right: zoom, Show all, Whole world, and a toggle for the callsigns.

Who hears me ​

Hearing me → Fetch retrieves the reports from wspr.live, which serves the WSPRnet database.

Fetching happens on request only, never in the background: the service is run by the community and asks for no more than 20 queries per minute.

Alongside distance and bearing you get km/W — the figure that makes transmissions at different power levels comparable. 2900 km on 200 mW is about 14 500 km/W.

Measurement sessions ​

A session records when you measured with which setup — «20260818 Antenna A». That way you do not have to reconstruct times from memory when comparing later.

The field for it sits on the left under Operation. The name is prefilled with the date; you type the setup after it. Start session sets the beginning, End session the end, and the display switches to the new session when you start one. Only one can run at a time — starting a new one closes the previous one, which is exactly what you do at the mast.

Under Manage sessions you can change name, start, end and a note afterwards. This is not a nicety: at the mast you rarely notice in the moment that the session started a quarter of an hour too early.

Why a corrected time takes effect immediately

Membership is derived from the time range, not from a mark on the individual spot. A shifted boundary therefore reassigns the spots at once — without a single record being touched.

It is also why reports from the transmitting side count even though they only arrive hours later via wspr.live: they fall into the right session by themselves.

Deleting a session removes only the entry. The spots stay — they never belonged to the session, they merely fell within its time range.

If a session runs for more than a day, a notice appears. It is not ended automatically: that would mean trimming measurement data without saying so — and someone running a beacon over a weekend may well mean it that way.

Antenna comparison ​

The evaluation that makes the whole exercise worthwhile. The tutorial Compare Two Antennas with WSPR walks through the complete workflow, from setting up the beacon to the finished evaluation.

How it works: start a session before antenna A, run it as a beacon for a while, end the session. Rebuild, do the same for antenna B. Then pick the two sessions under Compare, set the band in the filter bar, and press Evaluate.

If you measured without sessions, switch to Custom times and enter two start times and a shared duration as before.

Why «twelve stations against eight» tells you nothing

Propagation changes more over a few hours than any antenna does. Measuring in the morning and comparing in the afternoon measures the ionosphere.

Only stations that heard both periods are therefore counted. The SNR difference is taken per shared station, and the result is their median. Stations that heard only one of the two periods are listed separately — interesting, but not evidence: someone missing from the second run may simply have switched their receiver off.

Next to the dB figure stands the number of shared stations. From five upwards the result counts as solid; below that, a single receiver with a shaky signal decides how the figure comes out.

The closer the two periods, the more meaningful. And evaluate each band separately — propagation on 40 and 10 m behaves completely differently.

Sessions of different lengths are allowed. The calculation does not tip over, because the median is taken per station rather than summed. From roughly a factor of one and a half the module points out the difference anyway and offers to trim to the shorter duration — the longer measurement simply has more opportunities to collect rare receivers.

Fetch the transmitting side first

Reports about your own beacon only reach wspr.live hours after operation. Comparing the transmitting side right after a rebuild means calculating on half the data. The module warns you when the last fetch predates the end of either period, and offers the fetch right there.

Things you may notice in the list ​

Questionable callsigns ​

Entries with an orange warning triangle are most likely false decodes: the decoder works at the edge of what is possible, and on very weak signals a checksum occasionally works out by chance. They are recognisable by their structure — no assigned callsign begins with 0 or 1, and exactly one digit sits between prefix and suffix.

Such spots are marked, not hidden: for an antenna comparison you want to see how often this happens. A low single-digit percentage is normal.

«not yet known» ​

Not an error but WSPR type 3: these stations send a checksum instead of their callsign, to make room for a six-character locator. The name appears once the same station has been heard with its full callsign — HAM-Tools remembers that mapping permanently.

Clock warning ​

Appears at the top right when every received signal arrives offset. WSPR needs the window to about ±1 s. If the clock drifts further, the weak signals drop out first — and those are precisely the reason for running WSPR. Without this hint it would look like poor conditions.

The fix: check automatic time synchronisation in macOS System Settings.

Where the data lives ​

  • Spots: ~/Documents/HAM-Tools/WSPR/spots.sqlite
  • Decoder data: ~/Documents/HAM-Tools/WSPR/wsprd/

No logbook entries

WSPR spots are not QSOs — WSPRnet states this explicitly, and WSPR is neither a mode nor a submode in ADIF 3. They therefore go into their own store and never into the logbook.

Technical background ​

Modulation4-FSK, continuous phase
Symbol rate1.4648 baud, tone spacing 1.4648 Hz
Transmission110.6 s, starting 1 s after every even UTC minute
Bandwidth6 Hz
Payload50 bits: callsign, locator, power
Error controlconvolutional code K = 32, rate ½, with interleaving
Sensitivityaround −28 dB signal-to-noise ratio in 2500 Hz

The transmit path — encoding and modulation — is written in Swift and verified against the reference decoder. For decoding, wsprd from the WSJT-X project is bundled and runs as a separate process (like nec2c for the antenna simulator). That is deliberate: decoding at −28 dB requires a coarse search over time and frequency, a sequential decoder and several passes with subtraction — a home-grown decoder that finds the strong signals and misses the weak ones would look as though it worked. But WSPR lives on the weak ones.

Licence and provenance are listed under Settings → Licence → Third-party components.

HAM-Tools © HB9HJI · Funkwelt