GNSS CN0 Analysis Library - Interference, Jamming & Spoofing Detection
Project description
geoveil-cn0
High-performance GNSS signal quality analysis library — Rust core, Python API
Analyze RINEX observation files to compute signal quality scores, detect threats (jamming, spoofing, interference), generate per-constellation statistics, and produce skyplot data. Used in production geodetic monitoring, precision agriculture, and GNSS security research.
Installation
pip install geoveil-cn0
No Rust toolchain required — pre-built wheels for Linux (x86_64 + ARM/piwheels), Windows, and macOS.
Quick Start
import geoveil_cn0 as gcn0
print(gcn0.VERSION) # e.g. "0.3.7"
# Configure analysis
config = gcn0.AnalysisConfig(
min_elevation=5.0, # Elevation mask in degrees
time_bin=60, # Time-binning interval for statistics (seconds)
systems=["G", "R", "E", "C"], # GPS, GLONASS, Galileo, BeiDou
detect_anomalies=True,
anomaly_sensitivity=0.3, # 0.1 = very sensitive, 1.0 = major events only
interference_threshold_db=8.0,
)
analyzer = gcn0.CN0Analyzer(config)
# Analyze with BRDC navigation file (enables elevation filtering + skyplots)
result = analyzer.analyze_with_nav("observation.rnx", "navigation.rnx")
# — or without navigation (CN0 analysis only) —
result = analyzer.analyze_file("observation.rnx")
# Core metrics
print(f"Quality: {result.quality_score.overall:.1f}/100 ({result.quality_score.rating})")
print(f"Mean CN0: {result.avg_cn0:.1f} dB-Hz std: {result.cn0_std_dev:.1f}")
print(f"Jamming: {result.jamming_detected} Spoofing: {result.spoofing_detected}")
print(f"Anomalies: {result.anomaly_count}")
# Per-constellation breakdown
for sys in result.get_systems():
s = result.get_constellation_summary(sys)
print(f" {sys}: {s['satellites_observed']} sats, CN0={s['cn0_mean']:.1f} dB-Hz, avail={s['availability_ratio']}")
# Export full result
json_str = result.to_json()
Supported File Formats
| Type | Extensions | Versions |
|---|---|---|
| Observation | .obs, .rnx, .crx, .YYo (e.g. .26o) |
RINEX 2.x / 3.x / 4.x |
| Navigation | .nav, .rnx, .YYn, .YYg, .YYp |
BRDC mixed / GPS / GLONASS |
| Precise orbits | .sp3, .SP3 |
SP3-c, SP3-d |
| Compressed | .gz, .Z, .crx |
Gzip, Unix-compress, Hatanaka |
Quality Score
Composite 0–100 score with letter rating (A–F), weighted from five components:
| Component | Weight | Basis |
|---|---|---|
| CN0 Quality | 35% | Signal strength vs. constellation thresholds |
| Availability | 20% | Observed vs. expected satellite count |
| Continuity | 20% | Data-gap and cycle-slip rate |
| Stability | 15% | CN0 variance over observation window |
| Diversity | 10% | Multi-constellation coverage |
Threat Detection
Algorithms derived from ITU-R M.1902-1, Stanford GPS Lab, and GPS Solutions journal:
| Threat | Detection Method | Default Threshold |
|---|---|---|
| Jamming | Rapid CN0 drop rate | >6 dB in <3 seconds |
| Spoofing | CN0 uniformity anomaly | std <2 dB with elevated mean |
| Interference | Sustained CN0 degradation | >4 dB from baseline (ITU I/N=−6 dB) |
All thresholds are configurable via AnalysisConfig.
API Reference
AnalysisConfig
config = gcn0.AnalysisConfig(
min_elevation=5.0, # Elevation cutoff (degrees)
time_bin=60, # Statistics time bin (seconds)
systems=["G", "R", "E", "C"], # G=GPS R=GLONASS E=Galileo C=BeiDou J=QZSS I=NavIC
detect_anomalies=True,
anomaly_sensitivity=0.3, # 0.1–1.0
interference_threshold_db=8.0, # CN0 drop threshold (dB)
verbose=False,
)
CN0Analyzer
| Method | Parameters | Returns |
|---|---|---|
analyze_file(obs_path) |
RINEX obs path | AnalysisResult |
analyze_with_nav(obs_path, nav_path) |
obs + nav/SP3 path | AnalysisResult |
AnalysisResult — Properties
| Property | Type | Unit | Description |
|---|---|---|---|
quality_score |
QualityScore |
— | Composite quality object |
avg_cn0 / mean_cn0 |
float | dB-Hz | Mean carrier-to-noise ratio |
cn0_std_dev |
float | dB-Hz | CN0 standard deviation |
min_cn0, max_cn0 |
float | dB-Hz | CN0 range |
jamming_detected |
bool | — | Jamming indicator |
spoofing_detected |
bool | — | Spoofing indicator |
interference_detected |
bool | — | Interference indicator |
anomaly_count |
int | — | Total anomaly events |
duration_hours |
float | h | Observation window length |
epoch_count |
int | — | Number of epochs parsed |
constellations |
list[str] | — | Constellation names present |
rinex_version |
str | — | File format version |
station_name |
str | — | Marker name from RINEX header |
AnalysisResult — Methods
result.get_systems() # -> List[str] constellation codes
result.get_constellation_summary("GPS") # -> Dict per-constellation stats
result.get_anomalies() # -> List[Dict] anomaly event list
result.get_timeseries_data() # -> Dict time-binned CN0 series
result.get_timestamps() # -> List[str] ISO timestamp strings
result.get_mean_cn0_series() # -> List[float]
result.get_satellite_count_series() # -> List[int]
result.get_skyplot_data() # -> List[Dict] satellite az/el tracks (needs nav)
result.to_json() # -> str full JSON export
QualityScore
qs = result.quality_score
qs.overall # float 0–100
qs.rating # str "A (Excellent)" … "F (Very Poor)"
qs.cn0_quality # float component score
qs.availability # float component score
qs.continuity # float component score
qs.stability # float component score
qs.diversity # float component score
Jupyter Notebook Widget
An interactive analysis widget is included (notebooks/geoveil-cn0-widget.ipynb):
pip install geoveil-cn0 plotly pandas ipywidgets matplotlib
jupyter notebook notebooks/geoveil-cn0-widget.ipynb
Features:
- RINEX file upload or path input
- BRDC navigation auto-download from IGS/MGEX
- Interactive Plotly charts: CN0 timeseries, skyplot, signal heatmap, quality radar
- Per-constellation signal statistics
- Anomaly event list
- One-click HTML report export
Batch Processing
For large-scale production use, geoveil-cn0-batch wraps this library in a scalable microservices stack:
- FastAPI REST + WebSocket API
- Celery + Redis distributed task queue
- MongoDB result storage
- MinIO RINEX and graph data storage
- React web dashboard with live progress, skyplots, and export
Supports hundreds of RINEX files per session with per-session analysis settings, automatic ephemeris download, and multi-worker horizontal scaling.
Requirements
- Python 3.9+
- No runtime dependencies (pure Rust binary)
Optional (notebooks):
plotly,pandas,ipywidgets,matplotlib
License
MIT — see LICENSE.
Author
Miluta Dulea-Flueras — miluta.flueras@cartografie.ro
Contributing
Issues and pull requests welcome at github.com/miluta7/geoveil-cn0.
Citation
@software{geoveil_cn0,
author = {Dulea-Flueras, Miluta},
title = {geoveil-cn0: High-Performance GNSS CN0 Signal Quality Analysis Library},
year = {2026},
version = {0.3.7},
url = {https://github.com/miluta7/geoveil-cn0},
license = {MIT}
}
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geoveil_cn0-0.3.8.tar.gz.
File metadata
- Download URL: geoveil_cn0-0.3.8.tar.gz
- Upload date:
- Size: 115.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
525e31f59e18c94edb2b63ae5c01cb6bcc51665b176b9e53f6a788277906c5ba
|
|
| MD5 |
a38b1f2ea27a5ccaeaff42b37b35f7e0
|
|
| BLAKE2b-256 |
3d96e491d09351d21f7c7bfcea316daac423b71e4c68acae47c8976e010523b8
|
File details
Details for the file geoveil_cn0-0.3.8-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 435.4 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f5ace492b7b7869e50333bd5ed55eaa01df4aeeae46ddb8147f26ac79c3717e
|
|
| MD5 |
3cc05d10bd07d15802b800061c7ae04a
|
|
| BLAKE2b-256 |
2ddb385543130b5df64c4e7283025063a82e71d95a8fb62e01f639c8a72b6461
|
File details
Details for the file geoveil_cn0-0.3.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 489.3 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
498746d55710f978f890d2c67f86c90abea4a545f78f740b04d7fac123574018
|
|
| MD5 |
d9a60b4d82c2bc01831b668e9c2354f5
|
|
| BLAKE2b-256 |
a96156132eefde31d66d8caf83439163ba630b673e82f66f65ed1cf60e17ad4c
|
File details
Details for the file geoveil_cn0-0.3.8-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 444.2 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25b6b02c6b21495468580dd3f669d04996f34c0d382ef9d10c3ac41ac6ebfabc
|
|
| MD5 |
f4da18bfc16a7bed5c47066e17f08f19
|
|
| BLAKE2b-256 |
b580c8fff8901a0705efaffa971e9629389341aaa1a81329518e6dd72bec3bac
|
File details
Details for the file geoveil_cn0-0.3.8-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 435.2 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
541093afbd5e23163de148e967ae27593da0f6304b88e90b48ee29615fce030e
|
|
| MD5 |
08042fcdb76e32f055556e0937df2918
|
|
| BLAKE2b-256 |
5d31e0b57d5a58a76b1e006f348745ffa0c8fb505188e703f139dce9c734d39b
|
File details
Details for the file geoveil_cn0-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 488.6 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
828e4dfe0dd4a519565f53a12bd47a75fe0d6681e303123d100e294e4128f749
|
|
| MD5 |
7256c66e2a83cdb49704cfa31c4355b1
|
|
| BLAKE2b-256 |
8e1ead2ad25b61bb1ac23ab3085e0b6c05fb7e73b53d6c736db94d42fb033fd8
|
File details
Details for the file geoveil_cn0-0.3.8-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 444.2 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
383dc587a432ffaed6bb1edd44ac9ab4673f5f66d0ead2718affd393afcce4a7
|
|
| MD5 |
293f8dfa3263094047520581ddd457fa
|
|
| BLAKE2b-256 |
6a9a0941d3766d1d6bd22bd3e1b775b85985bae179003e4d06711867bd440e12
|
File details
Details for the file geoveil_cn0-0.3.8-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 435.2 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dacb0bfb114eb05223bc00f5d045c98e36d53f14eefc912c90bfbf54d4640232
|
|
| MD5 |
ddc8554b92cc897094dba4d66feee787
|
|
| BLAKE2b-256 |
ca4287a00039254cc7c46f157fe8eea3e4b3a3c1c13ed1852a7f5349cc08609a
|
File details
Details for the file geoveil_cn0-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 488.1 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3dccee5cbf12fe9b8a3b0dfe808bdb77032868bd5973fc246297e9ffd502cf7
|
|
| MD5 |
e830c542ff562f32e229854c8343be23
|
|
| BLAKE2b-256 |
8a11b60d34bf2531ed6b635dd003e2dce79e354e5d2488a1583a52fcb150dc2c
|
File details
Details for the file geoveil_cn0-0.3.8-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 444.2 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a135652c6f8cb91b0d21ea8ccf56423f087466bc7b4580bb19380cf2a748becb
|
|
| MD5 |
9f89bbec6d82a17759d9d1ee71865bed
|
|
| BLAKE2b-256 |
e7d3587f0b3ad0a8a728603cab07ded52b58291fd738b295e906ec66703140fa
|
File details
Details for the file geoveil_cn0-0.3.8-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 435.6 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e08c7502286443cade3da02390027ee85667b5c73f48ebbc12debc7db15ab9c
|
|
| MD5 |
03577c346f3cd034151cd556de4d117f
|
|
| BLAKE2b-256 |
411237ae7398d82d24300167e24bb38b0258b3cab34680f57f4cad4a406be0f7
|
File details
Details for the file geoveil_cn0-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 488.6 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
265acb0545e9fce3a806b3f5754cfbfa3430d62184fe5dc92276b14100a7b9e8
|
|
| MD5 |
0cd95e63700623336ad3f40a2692e29c
|
|
| BLAKE2b-256 |
1450f53dbea3f8324d4ab434c09bed42ac29ba8c89e14258e5d12d300cb62a2d
|
File details
Details for the file geoveil_cn0-0.3.8-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: geoveil_cn0-0.3.8-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 444.8 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cca2a0fb113b0a9ca2c0ccda31d78d4955349183a2cf2088751928e8ee3adbdb
|
|
| MD5 |
9aadbc6393035ab085b7139aae336792
|
|
| BLAKE2b-256 |
00190a108ebebb2f1445bce3c7df3432ea507f336fc842b88397ba8b31193fe4
|