All research

How to detect GPS jamming: a free, reproducible method

Data card: we ran a real GPS jamming detector on free public data. 27.99 station-hours of live CDDIS data processed, 0 synchronized multi-station interference events detected, 16 isolated single-station 5-sigma blips all ruled out as noise, 7 IGS stations monitored including LAMA station in Poland.

Short answer: you do not need proprietary hardware or a classified feed. Most GNSS receivers already compute carrier-to-noise ratio (CNR, also written C/N0), a number describing how cleanly they are hearing each satellite, and NASA's CDDIS archive publishes that value for free from over 500 public IGS ground stations worldwide, updated within minutes. A 2025 University of Texas at Austin method (Clements & Humphreys) mines that same free archive to catch real GPS interference: difference each satellite's CNR against itself a few seconds earlier, average across every satellite a station tracks, and watch for a synchronized spike at multiple stations hundreds of kilometers apart at the same moment. A spike at one station alone, with no echo anywhere else, is noise, not jamming. We built this detector and ran it live against 27.99 station-hours of real CDDIS data across 7 stations in the Baltic and Central Europe, including LAMA in Poland. Our window was quiet: 16 isolated single-station anomalies, zero synchronized multi-station events. Below is the full method, the real data, and what separates a genuine detection from a coincidence.

What this is A working reproduction of a published academic GNSS-interference detector, run against real public data we pulled ourselves, reported honestly including the null result. We did not detect jamming in our window, and this is not a claim that any location is currently jammed, or currently safe. We probed nothing but NASA's own public archive and named no victim.

Why this matters now

GPS and GNSS interference in the Baltic Sea region has gone from a niche electronic-warfare topic to mainstream news. Aviation and maritime authorities in Poland, Lithuania, and Finland have reported a sharp rise in jamming and spoofing since 2022, and outlets from Defense News to Euronews have covered phones, drones, and ships losing GPS fix across the region through 2026. Pilots track it daily on community boards like OPSGROUP; a public heatmap, gpsjam.org, aggregates aircraft ADS-B navigation-accuracy reports into a live map. That is a genuinely useful operational tool, but it infers interference indirectly, from how aircraft behave. It does not read the receiver's actual signal quality.

Search for "how to detect GPS jamming" today and the results are almost entirely fleet-tracker vendors selling hardware, with generic "signs to watch for" listicles attached. None of them show you a real detection pipeline running against real data. That is the gap this post fills: a signal-layer method, built on data anyone can download for free, with the code and the real numbers shown rather than asserted.

The method: time-differenced carrier-to-noise ratio

Carrier-to-noise ratio describes how strongly a receiver hears a given satellite's signal relative to the background noise floor, in dB-Hz. It varies naturally with satellite elevation, antenna quality, and atmospheric conditions, which makes a raw CNR threshold a poor jamming detector: a low satellite near the horizon looks similar to a jammed one. The fix used by Clements and Humphreys is to threshold the short-lag time difference instead, which cancels out slow, natural drift and isolates fast transients:

What we actually ran

A skeptic should be able to rebuild this, so here is the whole pipeline.

What 27.99 quiet station-hours actually look like

LAMA, our headline station, was the calmest of the seven. Its Λ[k] noise floor measured just 0.124 dB-Hz standard deviation, and it produced zero threshold crossings at either 5σ or 6σ across the full four-hour window. This is what a genuinely clean signal looks like, not a flat line, real noise bouncing within a well-behaved band, never once stepping outside it.

Line chart of the Lambda k CNR time-difference statistic for LAMA station, Poland, over a 4-hour window on 29 September 2026, oscillating in a narrow band around zero with no threshold crossings at plus or minus 6 sigma.
LAMA station (Lamkówko, Poland), Λ[k] over the full 4-hour window, our own live computation against real CDDIS data. Red lines mark the ±6σ threshold, 0.74 dB-Hz. Not one epoch crosses it.

Across all seven stations, the same picture holds at different noise levels. GANP in Slovakia ran the noisiest, at 0.219 dB-Hz standard deviation, and produced the single largest individual spike we recorded anywhere in the dataset.

Λ[k] noise floor and threshold crossings, by station, 4-hour window
StationCountryNoise floor (σ, dB-Hz)5σ crossings6σ crossings
ONSA (Onsala)Sweden0.125112
GANP (Ganovce)Slovakia0.21942
GOPE (Pecny)Czechia0.18710
WTZR (Wettzell)Germany0.15200
METG (Metsähovi)Finland0.12800
MAR6 (Mårtsbo)Sweden0.12400
LAMA (Lamkówko)Poland0.12400

Totals: 16 isolated single-station crossings at 5σ, collapsing to 4 at 6σ. That collapse is itself a useful, honest data point for anyone tuning a detector like this: loosening the threshold by one sigma roughly quadrupled our false-alarm count, with zero of either set corresponding to a real multi-station event.

Overlaid line chart of Lambda k for GANP, GOPE, and LAMA stations over the same 4-hour window, showing a single sharp spike on the GANP line near the 27-minute mark that is absent from the other two stations.
Λ[k] overlaid for GANP (Slovakia), GOPE (Czechia), and LAMA (Poland) across the same window. The one visually obvious feature in 12 combined station-hours is a single GANP spike, confined entirely to that one station.

The one near-miss, and why it does not count

Twenty-eight station-hours of real-world RF noise produced exactly one coincidence worth walking through, because a credible post shows you the borderline case, not just the clean ones. At 07:27:38 UTC, ONSA crossed its 5σ threshold at +0.656 dB-Hz. Two seconds later, at 07:27:40 UTC, GANP crossed its own 5σ threshold at −1.2 dB-Hz. Two stations, five seconds apart, both flagged: on paper, exactly the shape of a candidate multi-station event.

It is not one, for two reasons the paper's own spatial-simultaneity check is built to catch. First, the sign is wrong: a real wide-area interference source depresses CNR at every station it reaches, it does not raise it at one and lower it at another. Second, the magnitude does not match: ONSA's crossing barely cleared its threshold while GANP's was roughly double the size of its own. At the stricter 6σ threshold, ONSA's 07:27:38 reading no longer qualifies at all, and the coincidence disappears entirely. That GANP spike, incidentally, is also a clean illustration of a known artifact of this method: a true instantaneous step in one station's CNR shows up in Λ[k] as a matched positive-then-negative pair exactly L seconds apart, here +1.9 dB-Hz at 07:27:26 followed by −1.8 dB-Hz at 07:27:29. That pairing is diagnostic of a real, local event at GANP's receiver or antenna. It staying confined to GANP alone, with nothing echoed at GOPE or LAMA 300 to 600 km away, is exactly what rules out a shared physical cause.

What this does not prove

Honest limits, because a number without its caveats is marketing.

How to run this yourself

Everything here is available to anyone for free. Pick a set of geographically dispersed IGS high-rate stations from the current network list at network.igs.org. Pull 15-minute RINEX v3 blocks via anonymous FTP-SSL from CDDIS's public archive, no account required. Decompress and parse with open-source tooling such as georinex, extracting the CNR observable for your constellation and frequency of interest. Compute Λ[k] exactly as described above, fit your own stations' noise floors, and, critically, never call a single-station crossing a detection on its own. The spatial-simultaneity check across dispersed stations is what turns a receiver hiccup into a defensible claim, and it is also the step that correctly threw out our one near-miss.

Why this matters

The value of a method like this is that it reads ground truth at the signal layer, from infrastructure nobody has to trust a vendor's dashboard for. gpsjam.org and similar tools do valuable work inferring interference from how aircraft and ships behave downstream. This approach reads the cause more directly, in data that a global network of geodetic-grade receivers already publishes for free, hour by hour, and has for decades. That combination, a real academic detection method, public data with no access barrier beyond a free FTP login, and a fully reproducible pipeline, is rare in a space otherwise dominated by vendor sales pages and classified feeds. We ran it honestly, including the result we did not expect to be the most useful part: a clean baseline, with real false-alarm numbers attached, is exactly what anyone deploying this method needs to know before they trust its first alert.

Related reading