Data Lab / wspr-21year-census
Fig. 1: band distribution
Fig. 2: distance by band
Fig. 3: diurnal
Fig. 4: geographic heatmap
Fig. 5: network growth
Fig. 6: paper figure1
Fig. 7: paper figure2
Fig. 8: power distribution
Fig. 9: snr by year
WSPR 21-Year Census
11.53 billion spots, 221 months, Nov 2004 to Apr 2026
Complete statistical census of the WSPRnet raw spot archive, aggregated with
a subprocess-per-file pattern in 64 minutes of wall time on a single
workstation. No Parquet files were corrupt; the census reads every spot ever
uploaded to the central WSPRnet database.
Data Coverage
- Total spots: 11,532,770,139 (11.53 billion)
- Months analyzed: 221 (of 258 in the Nov 2004 to Apr 2026 window)
- Corrupt files: 0
- Empty months: 37, almost all in 2005 to 2007 before the WSPRnet database was widely adopted, plus two isolated gaps (Feb 2013, and parts of early 2008)
- Wall time: 3,860 s (64 min), effective throughput 3.0 M spots/s
- Method: subprocess per monthly Parquet file (
scripts/analyze_v3.pydriver andscripts/agg_one.pyworker)
1. Network Growth
The WSPR network grew from 28 spots in November 2004 (beta testing by a
handful of K1JT collaborators) to a peak of 235,252,203 spots in a single
month in March 2026, a factor of roughly over the 21-year span.
Growth milestones:
- First activity: 28 spots, November 2004 (one RX and seven TX callsigns)
- First month with >1,000 spots: March 2008 (93,890 spots, WSPR 2.0 era)
- First month with >1M spots: July 2009 (1,017,860)
- First month with >10M spots: January 2016 (10,462,998)
- First month with >100M spots: October 2021 (104,594,921)
- Peak month: March 2026, 235,252,203 spots
- Peak unique TX per month: 163,965 (March 2026)
- Peak unique RX per month: 7,035 (January 2022)
The transmit-to-receive callsign ratio is roughly 20:1 at the 2026 peak,
reflecting the network's persistent structural asymmetry: most stations
operate transmit-only and rely on a smaller pool of high-quality monitoring
receivers (KiwiSDR sites and wsprdaemon installations) for reception reports.
2. Band Usage
The HF bands dominate overwhelmingly. The three most active bands (40 m, 20 m,
and 30 m) carry 75.6 % of all census traffic; the ten amateur HF bands from
160 m through 10 m collectively account for 97.7 %.
| Band | Spots | Share (%) | Mean dist. (km) |
|---|---|---|---|
| 40 m | 3,685,787,226 | 31.96 | 1680 |
| 20 m | 3,106,992,493 | 26.94 | 2574 |
| 30 m | 1,929,991,148 | 16.73 | 2035 |
| 80 m | 873,649,381 | 7.58 | 1026 |
| 17 m | 435,810,249 | 3.78 | 3092 |
| 15 m | 425,956,358 | 3.69 | 3310 |
| 10 m | 347,790,282 | 3.02 | 3502 |
| 630 m (MF) | 208,883,265 | 1.81 | 943 |
| 160 m | 201,407,283 | 1.75 | 793 |
| 12 m | 129,970,780 | 1.13 | 3387 |
| 60 m | 129,002,093 | 1.12 | 1112 |
| 2200 m (LF) | 20,697,697 | 0.18 | 970 |
| 6 m | 13,234,292 | 0.11 | 336 |
The 630 m (MF) band appeared around 2012 after European allocation changes
and is the fifth most active band in the census. Approximately 0.02 % of
spots carry out-of-range band codes (likely firmware bugs or database
corruption) and are included in totals but excluded from band-specific
tables.
3. Distance and the Frequency-Distance Relation
Mean spot distance scales monotonically with frequency across the HF bands:
- 160 m: 793 km
- 80 m: 1,026 km
- 40 m: 1,680 km
- 30 m: 2,035 km
- 20 m: 2,574 km
- 17 m: 3,092 km
- 15 m: 3,310 km
- 12 m: 3,387 km
- 10 m: 3,502 km
- 6 m: 336 km (VHF outlier, local and sporadic-E)
This ordering is the textbook signature of HF skip-zone physics: higher
frequencies require denser ionospheric layers, which implies a shallower
reflection geometry and longer single-hop ground range. 6 m falls off the
trend because its bulk traffic is local and tropospheric rather than F2 skip.
Maximum reported distance on every HF band is between 19,900 km and
20,015 km, the full antipodal circumference of the Earth. These long-path
spots are physically plausible at the top of the solar cycle and are not
filtered out of the aggregates.
4. Geographic Coverage
Top 10 TX grid squares (lifetime)
| Rank | Grid | Spots | Location |
|---|---|---|---|
| 1 | IO91 | 239,321,189 | SE England (London) |
| 2 | JO31 | 175,763,984 | Netherlands |
| 3 | JN48 | 167,387,532 | SW Germany |
| 4 | JO01 | 161,590,393 | SE England / Kent |
| 5 | IO81 | 152,063,280 | S Wales / SW England |
| 6 | FN42 | 151,605,202 | Boston / New York |
| 7 | DN70 | 149,435,469 | Fort Collins, CO (NIST WWV) |
| 8 | JO22 | 146,843,859 | Netherlands |
| 9 | IO93 | 142,433,264 | N England |
| 10 | JO21 | 138,659,037 | Belgium / Netherlands |
Top 10 RX grid squares (lifetime)
| Rank | Grid | Spots | Location |
|---|---|---|---|
| 1 | JN47 | 416,643,234 | Switzerland / S Germany |
| 2 | JO31 | 292,408,646 | Netherlands |
| 3 | CM88 | 215,865,609 | SF Bay Area, CA |
| 4 | FM18 | 213,080,532 | Washington DC / Maryland |
| 5 | CM87 | 207,840,903 | Central California coast |
| 6 | JN48 | 204,819,435 | SW Germany |
| 7 | JN58 | 198,112,686 | Central Germany |
| 8 | JN49 | 181,533,487 | Central Germany |
| 9 | IL38 | 180,330,246 | Canary Islands |
| 10 | JO21 | 157,271,975 | Belgium / Netherlands |
Eight of the top 10 TX grids and seven of the top 10 RX grids are European.
US coverage is concentrated in two coastal clusters (CM87/CM88 on the West
Coast, FN42/FM18/FN30 on the East Coast) plus the single high-volume NIST
site at DN70.
5. Top Stations
Most Active Transmitters
| Rank | Callsign | Spots |
|---|---|---|
| 1 | WW0WWV | 132,531,243 |
| 2 | WB6CXC | 80,297,316 |
| 3 | NI5F | 61,942,465 |
| 4 | TA4/G8SCU | 56,474,340 |
| 5 | DL6NL | 56,117,639 |
| 6 | G4HSB | 54,261,030 |
| 7 | OK2SAM | 50,349,600 |
| 8 | OZ7IT | 49,077,581 |
| 9 | TI4JWC | 48,342,026 |
| 10 | DK2DB | 46,147,850 |
The transmit champion is WW0WWV, the dedicated WSPR beacon associated
with the NIST WWV time-signal station in Fort Collins, Colorado (grid
square DN70).
Most Prolific Receivers
| Rank | Callsign | Spots |
|---|---|---|
| 1 | EA8BFK | 127,456,403 |
| 2 | DK6UG | 110,845,973 |
| 3 | OE9GHV | 110,240,969 |
| 4 | WA2TP | 95,596,700 |
| 5 | KD2OM | 82,139,623 |
| 6 | N2HQI | 79,615,194 |
| 7 | LX1DQ | 78,220,930 |
| 8 | KA7OEI-1 | 77,995,423 |
| 9 | ON5KQ | 77,817,733 |
| 10 | DK8FT | 76,049,217 |
The receive champion is EA8BFK in the Canary Islands (grid square IL38),
with 127,456,403 spots. The Canary Islands sit at a favorable point for
transatlantic and trans-equatorial HF propagation.
6. Transmit Power
WSPR encodes power in 3 dB steps. Five power levels account for 87.2 % of
all census spots:
| Power | Watts | Spots | Share |
|---|---|---|---|
| 23 dBm | 200 mW | 4,833,515,604 | 41.9 % |
| 37 dBm | 5 W | 2,330,490,641 | 20.2 % |
| 30 dBm | 1 W | 1,476,220,540 | 12.8 % |
| 33 dBm | 2 W | 792,984,117 | 6.9 % |
| 20 dBm | 100 mW | 625,964,192 | 5.4 % |
| 10 dBm | 10 mW | 239,236,025 | 2.1 % |
| 40 dBm | 10 W | 184,012,857 | 1.6 % |
200 mW is the single most common power level (41.9 % of all spots).
This is the default for the widely used ZachTek WSPR-TX "Desktop" and "Mini"
beacons that dominate the low-end transmitter market. Only 2.93 % of spots
are transmitted at 10 W or higher, and powers below 10 mW account for less
than 1 % of traffic. WSPR operation is overwhelmingly QRP (low-power).
7. SNR and Diurnal Patterns
Aggregate SNR
Spot-weighted mean SNR across all bands and all years is -15.1 dB in the
standard 2,500 Hz WSPR reference bandwidth.
By band
| Band | Mean SNR (dB) |
|---|---|
| 40 m | -14.48 |
| 60 m | -14.96 |
| 80 m | -14.97 |
| 160 m | -15.05 |
| 20 m | -15.19 |
| 30 m | -15.60 |
| 10 m | -16.04 |
| 15 m | -16.38 |
| 17 m | -16.59 |
| 12 m | -16.87 |
| 6 m | -9.49 (sporadic-E and local outlier) |
By year
| Year | Mean SNR (dB) |
|---|---|
| 2008 | -13.88 |
| 2009 | -13.69 |
| 2010 | -13.72 |
| 2011 | -13.59 |
| 2012 | -13.41 |
| 2013 | -13.51 |
| 2014 | -13.46 |
| 2015 | -13.84 |
| 2016 | -14.43 |
| 2017 | -14.97 |
| 2018 | -15.13 |
| 2019 | -15.84 |
| 2020 | -15.73 |
| 2021 | -15.40 |
| 2022 | -15.21 |
| 2023 | -15.08 |
| 2024 | -14.93 |
| 2025 | -15.11 |
| 2026 | -15.03 |
Annual mean SNR varies within a narrow ~2 dB band after network
stabilization in 2008. This paper does not attempt to decompose the
variation into solar-cycle, band-mix, and station-turnover components;
see the wspr-ionospheric-baseline and wspr-transient-anomalies
workspaces for dedicated treatments.
Diurnal
| Hour (UTC) | Spots (millions) |
|---|---|
| 00 | 454.4 |
| 04 | 375.4 (minimum) |
| 08 | 462.2 |
| 12 | 490.5 |
| 15 | 564.1 (maximum) |
| 18 | 534.2 |
| 20 | 516.4 |
| 23 | 496.6 |
Total-network diurnal amplitude is modest (max/min ratio = 1.50) because the
global 24-hour receiving network averages over local day-night asymmetries.
Individual bands show much stronger diurnal structure.
8. Data Quality
- Zero corrupt files out of 258 monthly Parquet files: every spot was
read successfully.
- 37 empty months in the nominal 258-month window: 35 are in 2005 to 2007
(database not yet widely used), plus Feb 2013 and parts of early 2008
(apparent database outages).
- ~0.02 % spurious band codes: a long tail of integer band values that
do not correspond to any amateur allocation (likely firmware bugs or
corrupted uploads). Included in totals, excluded from band-specific
statistics.
- SNR outliers: the archive contains entries with SNR values as high as
+127 dB that are physically impossible (the WSPR decoder caps at ~+30 dB).
These are early-decoder software bugs or database corruption artifacts.
- Top-k merging: callsign and grid lists are merged from per-file
top-200 and top-100 lists. Top-50 entries are exact at the precision shown;
long-tail callsigns with fewer than 200 per-month spots could be undercounted.
Files
| File | Description |
|---|---|
scripts/analyze_v3.py | Driver: subprocess-per-file aggregation over 258 Parquet files |
scripts/agg_one.py | Worker: aggregates a single monthly file, emits JSON on stdout |
scripts/analyze.py | v1 analysis script (superseded, kept for reference) |
scripts/analyze_v2.py | v2 analysis script (superseded, kept for reference) |
scripts/visualize.py | v1 Plotly HTML chart generator (superseded, kept for reference) |
scripts/make_figures.py | Static PNG figures for the paper (reads data/results.json) |
data/results.json | Final aggregates: every number in the paper comes from this file |
paper/paper.tex | Formal LaTeX paper |
paper/paper.pdf | Compiled paper |
paper/figure1.png | Network growth figure |
paper/figure2.png | Band usage + mean distance figure |
Reproduce
cd workspaces/wspr-21year-census
python scripts/analyze_v3.py # re-run the full 64-min census
python scripts/make_figures.py # regenerate figure1.png, figure2.png
cd paper && pdflatex paper.tex && pdflatex paper.tex Author: —
Published: — · Updated: —
Data files: results.json
Scripts: agg_one.py, analyze.py, analyze_v2.py, analyze_v3.py, make_figures.py, make_plotly.py, visualize.py