WSPR PROTOCOL
Configuration, Operation & Message Format
A Technical Reference for the GCARC WSPR Network · W2MMD · Spring 2026
1. Overview
WSPR (Weak Signal Propagation Reporter, pronounced “whisper”) is a narrowband digital radio protocol designed by Nobel Prize laureate Joe Taylor (K1JT) specifically for automated, unattended propagation beacon operation at the lowest possible power levels. The protocol was first released in 2008 and has grown into a worldwide network of thousands of continuously operating beacons and receive stations.
The core objective of WSPR is simple: encode the minimum information needed to identify a transmitting station and its location, then transmit that information in a way that can be decoded reliably even when the received signal is far below the audible noise floor. This is achieved through a combination of very slow transmission speed, continuous-phase 4-tone frequency-shift keying, and a powerful forward error-correcting code.
A WSPR beacon transmits 200 milliwatts every ten minutes, around the clock, with no operator intervention. Receiving stations around the world decode the signal, log the spot, and upload it automatically to public databases. The result is a real-time, global map of which propagation paths are open — updated every two minutes, 24 hours a day.
2. Operating Frequencies
2.1 Dial Frequency vs. Transmit Frequency
WSPR uses USB (Upper Sideband) mode on a conventional SSB transceiver or, in the case of a Pi Zero / TAPR HAT system, generates the RF signal directly. In the SSB transceiver case, the radio is set to a specific “dial frequency” in USB mode, and the WSPR audio tones are injected at approximately 1,400–1,600 Hz audio offset, placing the actual RF transmission 1,500 Hz above the dial frequency.
The WSPR sub-band on each HF frequency is only 200 Hz wide, centered 1,500 Hz above the dial frequency. Multiple stations can coexist within this 200 Hz window because each beacon picks a random transmit frequency within the window on each transmission cycle.
| Band | USB Dial Freq (MHz) | TX Center (MHz) | TX Range | Notes |
| 2190m | 0.136000 | 0.137500 | ±100 Hz | LF — special license required |
| 630m | 0.474200 | 0.475700 | ±100 Hz | MF — Part 97.303 in USA |
| 160m | 1.836600 | 1.838100 | ±100 Hz | NVIS, night only |
| 80m | 3.568600 | 3.570100 | ±100 Hz | Regional NVIS, night DX |
| 60m | 5.287200 | 5.288700 | ±100 Hz | Check local allocation |
| 40m | 7.038600 | 7.040100 | ±100 Hz | Day + night, popular band |
| 30m ★ | 10.138700 | 10.140200 | ±100 Hz | RECOMMENDED — most active WSPR band |
| 20m | 14.095600 | 14.097100 | ±100 Hz | Best global DX range |
| 17m | 18.104600 | 18.106100 | ±100 Hz | WARC — no contests |
| 15m | 21.094600 | 21.096100 | ±100 Hz | Solar-dependent DX |
| 12m | 24.924600 | 24.926100 | ±100 Hz | WARC — no contests |
| 10m | 28.124600 | 28.126100 | ±100 Hz | Technician OK — outstanding DX when open |
| 6m | 50.293000 | 50.294500 | ±100 Hz | Sporadic-E / Technician OK |
| 2m | 144.489000 | 144.490500 | ±100 Hz | Mostly local/aircraft scatter |
| 70cm | 432.300000 | 432.301500 | ±100 Hz | Local only |
| 23cm | 1296.500 | 1296.501 | ±100 Hz | Microwave experimental |
★ 30m note: The 30m band (10.140 MHz TX center) is the most active WSPR band worldwide. It is a WARC band, meaning no contest operation, no phone — ideal for a 24/7 unattended beacon. For GCARC members, the TAPR HAT dial frequency is 10.1387 MHz.
2.2 The WSPR Sub-Band
On any given band, all WSPR activity is confined to a 200 Hz window centered 1,500 Hz above the dial frequency. Because each WSPR signal occupies only about 6 Hz of bandwidth, roughly 30 stations can simultaneously occupy the same 200 Hz window without mutual interference. The transmitter software picks a random audio offset within 1,400–1,600 Hz on each transmission, spreading stations evenly across the window.
On the TAPR HAT / Pi Zero 2W system, the Pi generates the RF signal directly (no SSB transceiver required). The WsprryPi software generates the four FSK tones at the correct RF frequency, eliminating the audio chain entirely. The configured frequency is the actual transmitted RF frequency, not a dial offset.
2.3 Frequency Accuracy Requirements
WSPR decoding requires the transmitter frequency to be accurate to within a few Hz. The protocol can tolerate some frequency error because the decoder searches a window, but excessive drift causes missed decodes. The Pi Zero 2W’s onboard crystal oscillator is adequate for most WSPR operation; the WsprryPi software includes a PPM (parts per million) correction parameter to compensate for individual crystal error.
A 1 PPM error at 10 MHz = 10 Hz of frequency offset. Typical Pi Zero crystals are within ±1–2 PPM, so frequency error is generally under 20 Hz — well within the decoder’s tolerance.
3. Timing and Transmission Schedule
3.1 The Two-Minute Timeslot
WSPR divides time into two-minute slots synchronized to UTC. All WSPR activity worldwide operates on this same grid: slots begin at 00:00, 00:02, 00:04 UTC, and so on throughout the day. Every WSPR operator, worldwide, on any band, is synchronized to the same timeslot boundaries.
Within each two-minute slot, the sequence is:
- T = 0:00 — Start of even UTC minute. All stations begin listening.
- T = 0:01 — Transmissions begin exactly 1 second after the even minute.
- T = 0:01 to 1:51 — Transmission in progress (110.6 seconds of continuous 4-FSK tones).
- T = 1:52 to 2:00 — Transmission ends. Decoder processes the received audio.
The 1-second offset at the start of the slot prevents transmitters from stepping on the very start of the receive window, giving the decoder a clean edge to lock onto.
3.2 Duty Cycle — How Often a Station Transmits
A WSPR station does not transmit every two-minute slot. The standard duty cycle is 20% — meaning one transmission in every five slots, on average. Most operators also configure their station to listen (receive and decode) in the remaining slots, contributing spot data back to the network.
The transmit/receive decision is made pseudo-randomly each slot. The transmit percentage is configurable — common settings are 20%, 25%, or 33%. For a pure beacon (transmit only, no receive), 100% is permitted but discouraged as it contributes nothing to the network’s receive data.
Example for a 20% duty cycle station on 30m:
00:00 UTC — Listen
00:02 UTC — Listen
00:04 UTC — TRANSMIT (110.6 sec starting at 00:04:01)
00:06 UTC — Listen
00:08 UTC — Listen
00:10 UTC — TRANSMIT
… and so on, randomly distributed at 20% rate
3.3 Clock Synchronization Requirement
Clock accuracy is critical. The receiver decoder uses the timing of the incoming signal to decode it, and the decode algorithm will fail if the transmitter’s clock is off by more than about ±1 second from UTC. The Pi Zero 2W synchronizes its clock via NTP (Network Time Protocol) over Wi-Fi. Internet connectivity must be maintained at all times during WSPR operation.
NTP on a well-connected Pi is typically accurate to within 10–50 milliseconds — far better than the ±1 second tolerance required. In practice, clock accuracy is rarely a problem with a Pi that has reliable Wi-Fi access.
4. Modulation — Continuous Phase 4-FSK
4.1 Four-Tone FSK
WSPR uses 4-tone frequency-shift keying (4-FSK), meaning the transmitter shifts between exactly four discrete frequencies to encode data. The four tones are spaced 1.4648 Hz apart (12000/8192 Hz, derived from the audio sample rate). The total occupied bandwidth of the four tones is about 6 Hz — extraordinarily narrow.
Each tone represents a 2-bit symbol (values 0, 1, 2, or 3). The modulation is “continuous phase,” meaning the transmitter never abruptly switches frequency mid-cycle; instead it smoothly transitions from one tone to the next. This suppresses splatter and keeps the signal within its 6 Hz footprint even at symbol transitions.
| Parameter | Value | Derivation / Notes |
| Tone spacing | 1.4648 Hz | 12000 ÷ 8192 samples per symbol |
| Symbol duration | 0.6827 seconds | Reciprocal of tone spacing (1 ÷ 1.4648) |
| Total symbols | 162 | (50 + 32 − 1) × 2 = 162 channel symbols |
| Total TX duration | 110.6 seconds | 162 symbols × 0.6827 s/symbol |
| Total bandwidth | ~6 Hz | 4 tones × 1.4648 Hz spacing ≈ 4.4 Hz + guard |
| Baud rate | 1.46 baud | Symbols per second |
| Bits per symbol | 2 bits | log₂(4) = 2 |
| Gross bit rate | 2.92 bits/sec | 1.46 baud × 2 bits/symbol |
| Effective info rate | ~0.45 bits/sec | 50 info bits ÷ 110.6 sec |
4.2 Why 4-FSK Instead of Binary?
Using 4-FSK instead of 2-FSK (binary) doubles the number of bits per symbol without increasing the bandwidth or symbol rate. This improves spectral efficiency. The choice of 4-FSK also simplifies the synchronization task for the decoder — the sync vector (see Section 6) is interleaved into the symbol stream as the most significant bit of each 2-bit symbol, with the data occupying the least significant bit.
5. Message Content — What Is Transmitted
5.1 The Standard WSPR Message
Every standard WSPR transmission carries exactly three pieces of information:
- Callsign — the transmitting station’s amateur radio callsign (up to 6 characters)
- Grid locator — a 4-character Maidenhead grid square identifying the transmitter’s location to within about 100 km × 110 km
- Power — the transmitter’s output power in dBm (0 to 60 dBm, in 3 dB steps)
Example message:
WB2MNF FN20 23
WB2MNF is the callsign. FN20 is the Maidenhead grid square for Mullica Hill, NJ. 23 is 23 dBm = 200 mW (the TAPR HAT’s typical output).
5.2 The Maidenhead Grid Locator
The Maidenhead Locator System divides the world into a hierarchy of grid squares. The 4-character locator (e.g., FN20) identifies a rectangle approximately 2° longitude × 1° latitude (about 111 km × 111 km in the mid-latitudes). The first two characters are letters (field), the second two are digits (square).
WSPR encodes only the 4-character locator. A 6-character locator (e.g., FN20qe) provides ~5 km precision but requires the extended 2-transmission sequence (see Section 5.4).
| Locator Chars | Grid Size | Precision | Example |
| 2 (field) | 20° × 10° | ~1,000 km | FN |
| 4 (square) | 2° × 1° | ~111 km | FN20 |
| 6 (subsquare) | 5′ × 2.5′ | ~5 km | FN20qe |
| 8 (extended) | 30″ × 15″ | ~500 m | FN20qe22 |
5.3 Power Encoding
Transmit power is reported in dBm. The WSPR protocol only accepts power values that end in 0, 3, or 7 (corresponding to the 3 dB steps of the standard power scale). Valid values are 0, 3, 7, 10, 13, 17, 20, 23, 27, 30, 33, 37, 40, 43, 47, 50, 53, 57, 60 dBm. Other values are rounded to the nearest valid step.
| dBm | Milliwatts | Typical Use |
| 0 | 1 mW | Minimum — ultra-QRP |
| 3 | 2 mW | Ultra-QRP |
| 7 | 5 mW | QRP |
| 10 | 10 mW | QRP |
| 13 | 20 mW | QRP |
| 17 | 50 mW | QRP |
| 20 | 100 mW | TAPR HAT minimum |
| 23 | 200 mW | TAPR HAT typical output ★ |
| 27 | 500 mW | QRP transceiver |
| 30 | 1 W | QRP transceiver |
| 37 | 5 W | Standard QRP limit |
| 43 | 20 W | Low power |
| 50 | 100 W | Typical HF station |
| 60 | 1,000 W | Maximum |
5.4 Extended Messages — Two-Transmission Sequence
Callsigns that don’t conform to the standard format (e.g., compound callsigns like W1AW/4, or callsigns with prefixes like OE/WB2MNF) and stations that want to report a 6-character grid square use a two-transmission sequence. The first transmission uses the standard format; the second carries the extended information. Decoders that receive both transmissions in sequence can reconstruct the full data.
For the GCARC WSPR Network, all members will use standard-format callsigns and 4-character grid squares, so the single-transmission format applies to all beacons in this project.
6. Message Encoding — From Text to Symbols
The journey from the text string “WB2MNF FN20 23” to the 162 RF symbols transmitted over the air involves five distinct steps. This section describes each step.
6.1 Step 1: Source Compression — 50 Bits
The three fields (callsign, grid, power) are compressed into exactly 50 bits using a scheme that exploits the restricted character sets in each field:
Callsign Encoding (28 bits)
The callsign is normalized to exactly 6 characters:
- If the callsign is shorter than 6 characters and the second character is a digit (standard format), pad with spaces at the end.
- If the first character is a letter but the second is not a digit (e.g., “G4JNT”), prepend a space to make the third character a digit.
The 37 valid characters are assigned numeric values: digits 0–9 → 0–9, letters A–Z → 10–35, space → 36.
The 6-character callsign encodes as:
N = (c1 × 36 × 10 × 27 × 27 × 27) + (c2 × 10 × 27 × 27 × 27) + (c3 × 27³) + (c4 × 27²) + (c5 × 27) + c6
where c1 must be 0–36 (any), c2 must be 0–36, c3 must be 0–9 (digit only),
and c4–c6 must be 0–26 (letter or space only)
Result: N fits in 28 bits (max value = 37 × 36 × 10 × 27³ – 1 ≈ 262,177,560)
Example: “WB2MNF” → W=32, B=11, 2=2, M=22, N=23, F=15
N = 32×36×10×27³ + 11×10×27³ + 2×27³ + 22×27² + 23×27 + 15
Grid Locator Encoding (15 bits)
The 4-character Maidenhead locator is encoded as:
M = (179 – 10 × (c1 – ‘A’) – (c3 – ‘0’)) × 180 + 10 × (c2 – ‘A’) + (c4 – ‘0’)
Result: M fits in 15 bits (max = 32400)
Example: “FN20” → F=5, N=13, 2=2, 0=0
M = (179 – 10×5 – 2) × 180 + 10×13 + 0 = 127 × 180 + 130 = 22,990
Power Encoding (7 bits)
Power in dBm is encoded as:
P = power_dBm + 64
Example: 23 dBm → P = 23 + 64 = 87 (fits in 7 bits, range 0–127)
Combined 50-bit Message
The three values are concatenated into a single 50-bit integer:
message_50bit = (N << 22) | (M << 7) | P
N occupies bits 49–22 (28 bits)
M occupies bits 21–7 (15 bits)
P occupies bits 6–0 (7 bits)
6.2 Step 2: Convolutional Forward Error Correction (FEC)
The 50-bit compressed message is fed into a rate-1/2 convolutional encoder with constraint length K=32. “Rate 1/2” means for every 1 input bit, 2 output bits are produced. “Constraint length 32” means the encoder looks at the current input bit plus the previous 31 bits when computing each output pair.
Input: 50 information bits + (K-1=31) tail bits of zeros = 81 input bits.
Output: 81 × 2 = 162 coded bits.
The two generator polynomials that define the convolutional code are (in octal):
G1 = 0xF2D05351 (hex) = 11110010110100000101001101010001 (binary)
G2 = 0xE4613C47 (hex) = 11100100011000010011110001000111 (binary)
The long constraint length (K=32) provides very strong error correction. It makes undetected decoding errors extremely unlikely, at the cost that the efficient Viterbi algorithm can’t be used — the decoder must use a sequential (Fano) algorithm instead. In practice the WSPR decoder achieves reliable decoding at SNRs as low as −28 dB in a 2,500 Hz reference bandwidth.
6.3 Step 3: Interleaving (Bit Reversal)
The 162 coded bits are reordered (interleaved) to spread any burst of interference across non-contiguous bit positions, making the error correction more effective. WSPR uses “bit-reversed addressing”: the bit at index I is moved to position J, where J is the 8-bit reversal of I.
For example: bit at index 1 (binary 00000001) moves to index 128 (binary 10000000). Bit at index 13 (00001101) moves to index 176 (10110000).
This complete permutation of 162 bits is a fixed, deterministic mapping — the same lookup table is used by every WSPR encoder and decoder in the world.
6.4 Step 4: Synchronization Vector
WSPR uses a fixed 162-element synchronization (sync) vector — a pseudo-random binary sequence with good autocorrelation properties. The sync vector is interleaved with the data bits to form the final 162-symbol stream. Each symbol is 2 bits wide:
symbol[i] = 2 × sync[i] + data[i]
sync[i] → most significant bit (0 or 1)
data[i] → least significant bit (0 or 1)
Result: symbol values of 0, 1, 2, or 3
The sync vector is constant — it never changes. This allows the decoder to search for a WSPR signal by correlating the received symbol sequence against the known sync pattern, even before knowing the message content. The sync provides both signal detection and fine timing alignment.
The sync vector begins:
1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,…
(162 values total — see WSPR source code for complete vector)
6.5 Step 5: Transmission
The 162 symbols (values 0–3) are transmitted as 4-FSK tones:
| Symbol Value | Tone Offset from Carrier |
| 0 | 0.0 Hz (base tone) |
| 1 | +1.4648 Hz |
| 2 | +2.9297 Hz |
| 3 | +4.3945 Hz |
Each tone lasts exactly 8192/12000 = 0.6827 seconds. Transitions between tones are continuous-phase (no abrupt jumps). The transmitter begins exactly 1 second after the even UTC minute and transmits all 162 symbols continuously, completing in 110.6 seconds.
7. The Receiver and Decoder
7.1 What the Receiver Hears
A WSPR signal sounds like a nearly continuous tone with a very slight, slow warble. The 4-FSK modulation shifts the frequency by at most 4.4 Hz over the entire 110-second transmission. At typical SNRs, the signal is completely inaudible — buried in band noise. Software decoders extract the signal by performing a detailed spectral analysis of the received audio.
7.2 Decoder Operation
At the end of each 2-minute slot, the WSPR decoder processes approximately 114 seconds of recorded audio (the 110.6-second transmission plus guard time). The steps are:
- FFT analysis — compute a high-resolution frequency spectrum with ~0.37 Hz resolution across the 200 Hz WSPR sub-band
- Sync correlation — slide the known sync vector across all frequency offsets and time offsets to find candidate signals
- Symbol extraction — for each candidate, extract the 162 symbol values from the 4 spectral bins at each symbol time
- FEC decoding — reverse the interleaving and run the sequential (Fano) convolutional decoder to recover the 50 information bits
- Message reconstruction — decode callsign, grid, and power from the 50-bit payload
- Database upload — the spot (callsign, grid, power, frequency, SNR, drift, receiving station) is uploaded to wspr.live / wsprnet.org
7.3 The SNR Figure
The decoder reports the received SNR in dB, referenced to a 2,500 Hz noise bandwidth. This is the “received SNR in 2.5 kHz” figure seen in all WSPR spot databases. Typical values range from about +10 dB (strong local signal) to −28 dB (the theoretical decoding limit). Values below −30 dB are occasionally decoded under exceptional conditions.
Since the WSPR signal occupies only ~6 Hz but the SNR is referenced to 2,500 Hz, there is an inherent “processing gain” of 10 × log₂(2500/6) ≈ +26 dB built into the system. This is why a 200 mW beacon can be decoded when it is far below audibility.
7.4 The Drift Parameter
The decoder also reports the frequency drift of the received signal in Hz/minute. A well-calibrated, thermally stable transmitter should show drift close to 0. Large drift values (>2 Hz/min) indicate oscillator instability — common with uncompensated crystal oscillators in very warm or cold environments. The Pi Zero’s crystal is generally stable enough for WSPR, but enclosures that trap heat can cause drift issues in summer months.
8. Spot Data — What Gets Logged
Every time a receiving station successfully decodes a WSPR signal, it logs a “spot” to the public databases. A spot record contains:
| Field | Example | Description |
| timestamp | 2026-03-21 14:04:00 | UTC time of the 2-minute slot start |
| tx_sign | WB2MNF | Transmitting station callsign |
| tx_loc | FN20 | Transmitting station grid square |
| tx_lat | 39.75 | Grid center latitude (derived) |
| tx_lon | -75.25 | Grid center longitude (derived) |
| power | 23 | Reported TX power in dBm |
| rx_sign | K2ABC | Receiving station callsign |
| rx_loc | EL96 | Receiving station grid square |
| rx_lat | 26.5 | Receiving station latitude (derived) |
| rx_lon | -80.5 | Receiving station longitude (derived) |
| distance | 1,842 | Path distance in km (computed) |
| azimuth | 197 | Bearing TX→RX in degrees |
| snr | -18 | Received SNR in dB re 2500 Hz BW |
| freq | 10.140152 | Actual received frequency in MHz |
| drift | 0 | Frequency drift in Hz/min |
| band | 30 | Nominal band in meters |
| version | 2.6.1 | Decoder software version |
The wspr.live ClickHouse database stores all of these fields and is queryable via a free public SQL API at https://db1.wspr.live/ — no account required. The wspr.rocks website provides a browser-based SQL query interface on top of the same database.
9. WsprryPi Configuration Reference
For GCARC members using the TAPR HAT + Pi Zero 2W, configuration is done through the WsprryPi web interface at http://[hostname].local after installation. Key parameters are:
| Parameter | Typical Value | Notes |
| callsign | WB2MNF | Your FCC callsign — must be exact |
| grid | FN20 | 4-character Maidenhead locator for your QTH |
| power | 23 | dBm — 23 dBm = 200 mW for TAPR HAT |
| frequency | 10.1387 | MHz — 30m dial frequency for TAPR HAT/Pi |
| tx_percent | 20 | Transmit 20% of slots (1 in 5) |
| ppm | 0 | Crystal frequency correction in PPM |
| ntp_server | pool.ntp.org | NTP time server — leave default |
| upload | wspr.live | Spot upload destination |
After saving configuration, the system transmits automatically at the next even UTC minute + 1 second. No reboot is required. The WsprryPi systemd service starts automatically on boot and resumes transmitting after any power cycle.
To verify operation: go to wspr.rocks within 10–15 minutes of your first transmission, click the SQL tab, and query:
SELECT * FROM wspr.rx WHERE tx_sign=’WB2MNF’ ORDER BY time DESC LIMIT 10
If your beacon is on the air and being received, spots will appear here within 2–3 minutes of transmission.
10. Quick Reference Summary
| Parameter | Value |
| Protocol type | Continuous-phase 4-FSK |
| Information content | Callsign + 4-char grid + power (dBm) |
| Source bits | 50 bits (28 callsign + 15 grid + 7 power) |
| FEC | Rate-1/2 convolutional, K=32 |
| Channel symbols | 162 symbols of 2 bits each |
| Symbol duration | 0.6827 seconds (8192/12000) |
| Tone spacing | 1.4648 Hz (12000/8192) |
| Occupied bandwidth | ~6 Hz |
| Transmission duration | 110.6 seconds |
| Timeslot period | 2 minutes (120 seconds) |
| TX start time | 1 second after even UTC minute |
| Typical duty cycle | 20% (one TX per 5 slots) |
| Min decodable SNR | −28 dB (in 2,500 Hz BW) |
| Frequency accuracy | ±a few Hz (NTP + PPM correction) |
| 30m TX center freq | 10.140200 MHz (dial: 10.1387 MHz) |
| TAPR HAT output | 100–200 mW (23 dBm nominal) |
| Spot database | wspr.live (ClickHouse SQL, 4B+ records) |
| Live map | wspr.rocks |
| Software (Pi) | WsprryPi v2.x — github.com/lbussy/WsprryPi |
Document prepared by Claude (WB2MNF session) for the GCARC WSPR Network · W2MMD · w2mmd.org · March 2026
