Skip to main content

GNSS CN0 Analysis Library - Interference, Jamming & Spoofing Detection

Project description

geoveil-cn0

PyPI version PyPI downloads License: MIT Python 3.9+ Rust GitHub Stars

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-Fluerasmiluta.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

geoveil_cn0-0.3.8.tar.gz (115.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

geoveil_cn0-0.3.8-cp312-cp312-win_amd64.whl (435.4 kB view details)

Uploaded CPython 3.12Windows x86-64

geoveil_cn0-0.3.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (489.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

geoveil_cn0-0.3.8-cp312-cp312-macosx_11_0_arm64.whl (444.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

geoveil_cn0-0.3.8-cp311-cp311-win_amd64.whl (435.2 kB view details)

Uploaded CPython 3.11Windows x86-64

geoveil_cn0-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (488.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

geoveil_cn0-0.3.8-cp311-cp311-macosx_11_0_arm64.whl (444.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

geoveil_cn0-0.3.8-cp310-cp310-win_amd64.whl (435.2 kB view details)

Uploaded CPython 3.10Windows x86-64

geoveil_cn0-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (488.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

geoveil_cn0-0.3.8-cp310-cp310-macosx_11_0_arm64.whl (444.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

geoveil_cn0-0.3.8-cp39-cp39-win_amd64.whl (435.6 kB view details)

Uploaded CPython 3.9Windows x86-64

geoveil_cn0-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (488.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

geoveil_cn0-0.3.8-cp39-cp39-macosx_11_0_arm64.whl (444.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Hashes for geoveil_cn0-0.3.8.tar.gz
Algorithm Hash digest
SHA256 525e31f59e18c94edb2b63ae5c01cb6bcc51665b176b9e53f6a788277906c5ba
MD5 a38b1f2ea27a5ccaeaff42b37b35f7e0
BLAKE2b-256 3d96e491d09351d21f7c7bfcea316daac423b71e4c68acae47c8976e010523b8

See more details on using hashes here.

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

Hashes for geoveil_cn0-0.3.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1f5ace492b7b7869e50333bd5ed55eaa01df4aeeae46ddb8147f26ac79c3717e
MD5 3cc05d10bd07d15802b800061c7ae04a
BLAKE2b-256 2ddb385543130b5df64c4e7283025063a82e71d95a8fb62e01f639c8a72b6461

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 498746d55710f978f890d2c67f86c90abea4a545f78f740b04d7fac123574018
MD5 d9a60b4d82c2bc01831b668e9c2354f5
BLAKE2b-256 a96156132eefde31d66d8caf83439163ba630b673e82f66f65ed1cf60e17ad4c

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 25b6b02c6b21495468580dd3f669d04996f34c0d382ef9d10c3ac41ac6ebfabc
MD5 f4da18bfc16a7bed5c47066e17f08f19
BLAKE2b-256 b580c8fff8901a0705efaffa971e9629389341aaa1a81329518e6dd72bec3bac

See more details on using hashes here.

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

Hashes for geoveil_cn0-0.3.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 541093afbd5e23163de148e967ae27593da0f6304b88e90b48ee29615fce030e
MD5 08042fcdb76e32f055556e0937df2918
BLAKE2b-256 5d31e0b57d5a58a76b1e006f348745ffa0c8fb505188e703f139dce9c734d39b

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 828e4dfe0dd4a519565f53a12bd47a75fe0d6681e303123d100e294e4128f749
MD5 7256c66e2a83cdb49704cfa31c4355b1
BLAKE2b-256 8e1ead2ad25b61bb1ac23ab3085e0b6c05fb7e73b53d6c736db94d42fb033fd8

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 383dc587a432ffaed6bb1edd44ac9ab4673f5f66d0ead2718affd393afcce4a7
MD5 293f8dfa3263094047520581ddd457fa
BLAKE2b-256 6a9a0941d3766d1d6bd22bd3e1b775b85985bae179003e4d06711867bd440e12

See more details on using hashes here.

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

Hashes for geoveil_cn0-0.3.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dacb0bfb114eb05223bc00f5d045c98e36d53f14eefc912c90bfbf54d4640232
MD5 ddc8554b92cc897094dba4d66feee787
BLAKE2b-256 ca4287a00039254cc7c46f157fe8eea3e4b3a3c1c13ed1852a7f5349cc08609a

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c3dccee5cbf12fe9b8a3b0dfe808bdb77032868bd5973fc246297e9ffd502cf7
MD5 e830c542ff562f32e229854c8343be23
BLAKE2b-256 8a11b60d34bf2531ed6b635dd003e2dce79e354e5d2488a1583a52fcb150dc2c

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a135652c6f8cb91b0d21ea8ccf56423f087466bc7b4580bb19380cf2a748becb
MD5 9f89bbec6d82a17759d9d1ee71865bed
BLAKE2b-256 e7d3587f0b3ad0a8a728603cab07ded52b58291fd738b295e906ec66703140fa

See more details on using hashes here.

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

Hashes for geoveil_cn0-0.3.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8e08c7502286443cade3da02390027ee85667b5c73f48ebbc12debc7db15ab9c
MD5 03577c346f3cd034151cd556de4d117f
BLAKE2b-256 411237ae7398d82d24300167e24bb38b0258b3cab34680f57f4cad4a406be0f7

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 265acb0545e9fce3a806b3f5754cfbfa3430d62184fe5dc92276b14100a7b9e8
MD5 0cd95e63700623336ad3f40a2692e29c
BLAKE2b-256 1450f53dbea3f8324d4ab434c09bed42ac29ba8c89e14258e5d12d300cb62a2d

See more details on using hashes here.

File details

Details for the file geoveil_cn0-0.3.8-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.8-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cca2a0fb113b0a9ca2c0ccda31d78d4955349183a2cf2088751928e8ee3adbdb
MD5 9aadbc6393035ab085b7139aae336792
BLAKE2b-256 00190a108ebebb2f1445bce3c7df3432ea507f336fc842b88397ba8b31193fe4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page