Skip to main content

GNSS CN0 Analysis Library - Interference, Jamming & Spoofing Detection

Project description

geoveil-cn0

PyPI version License: MIT Python 3.8+ GitHub

High-performance GNSS CN0 (Carrier-to-Noise) Signal Quality Analysis Library

A Rust-powered Python library for analyzing GNSS signal quality from RINEX observation files. Detect interference, jamming, spoofing, and multipath effects with research-grade algorithms.

Features

  • 🛰️ Multi-GNSS Support: GPS, GLONASS, Galileo, BeiDou, QZSS, NavIC
  • 📊 CN0 Analysis: Signal strength statistics, timeseries, and quality scoring
  • 🚨 Threat Detection: Jamming, spoofing, and interference indicators
  • 📈 Anomaly Detection: Configurable sensitivity for signal anomalies
  • 🗺️ Skyplot Data: Satellite positions with azimuth/elevation (requires NAV file)
  • High Performance: Rust core with Python bindings via PyO3
  • 📁 RINEX Support: Parse RINEX 2.x, 3.x, and 4.x observation files
  • 🧭 Navigation Files: BRDC broadcast ephemeris and SP3 precise orbits

Installation

pip install geoveil-cn0

Quick Start

import geoveil_cn0 as gcn0

# Create analysis configuration
config = gcn0.AnalysisConfig(
    min_elevation=5.0,           # Elevation mask (degrees)
    time_bin_seconds=60,         # Time binning for statistics
    detect_anomalies=True,       # Enable anomaly detection
    anomaly_sensitivity=0.3,     # Sensitivity (0-1, lower = fewer false positives)
    interference_threshold_db=8.0,  # CN0 drop threshold for interference
)

# Create analyzer
analyzer = gcn0.CN0Analyzer(config)

# Analyze observation file (with optional navigation for skyplots)
result = analyzer.analyze_with_nav("observation.rnx", "navigation.rnx")

# Access results
print(f"Quality Score: {result.quality_score.overall}/100 ({result.quality_score.rating})")
print(f"Average CN0: {result.avg_cn0:.1f} dB-Hz")
print(f"Jamming Detected: {result.jamming_detected}")
print(f"Spoofing Detected: {result.spoofing_detected}")
print(f"Anomalies: {result.anomaly_count}")

# Get detailed data
for constellation in result.constellations:
    stats = result.get_constellation_summary(constellation)
    print(f"{constellation}: {stats['satellites_observed']} sats, CN0={stats['cn0_mean']:.1f} dB-Hz")

# Export to JSON
json_data = result.to_json()

Quality Score Components

The quality score (0-100) is computed from multiple factors:

Component Weight Description
CN0 Quality 35% Signal strength relative to thresholds
Availability 20% Satellite availability vs expected
Continuity 20% Data continuity (gaps, cycle slips)
Stability 15% CN0 variance over time
Diversity 10% Multi-constellation coverage

Threat Detection Thresholds

Based on research from ITU-R M.1902-1, Stanford GPS Lab, and GPS Solutions journal:

  • Jamming: Rapid CN0 drops >6 dB in <3 seconds
  • Spoofing: Abnormally uniform CN0 (std <2 dB) or elevated average
  • Interference: CN0 degradation >4 dB from baseline (ITU I/N=-6dB criterion)

API Reference

AnalysisConfig

config = gcn0.AnalysisConfig(
    min_elevation=5.0,              # Elevation cutoff in degrees
    time_bin_seconds=60,            # Time bin for statistics
    systems=['G', 'R', 'E', 'C'],   # GNSS systems to analyze
    detect_anomalies=True,          # Enable anomaly detection
    anomaly_sensitivity=0.3,        # 0-1, lower = stricter
    interference_threshold_db=8.0,  # dB drop for interference flag
    verbose=False,                  # Print debug info
)

CN0Analyzer

analyzer = gcn0.CN0Analyzer(config)

# Analyze without navigation (no skyplots)
result = analyzer.analyze_file("observation.rnx")

# Analyze with navigation (enables skyplots and elevation filtering)
result = analyzer.analyze_with_nav("observation.rnx", "navigation.rnx")

AnalysisResult

Property Type Description
quality_score QualityScore Overall quality metrics
avg_cn0 float Mean CN0 in dB-Hz
cn0_std_dev float CN0 standard deviation
min_cn0, max_cn0 float CN0 range
jamming_detected bool Jamming indicator
spoofing_detected bool Spoofing indicator
interference_detected bool Interference indicator
anomaly_count int Number of anomalies
constellations list Available constellations
duration_hours float Observation duration
epoch_count int Number of epochs

Methods

# Get constellation-specific statistics
stats = result.get_constellation_summary("GPS")  # Returns dict

# Get anomaly list
anomalies = result.get_anomalies()  # Returns list of dicts

# Get timeseries data for plotting
ts_data = result.get_timeseries_data()  # Returns dict with timestamps, cn0_mean, etc.

# Get skyplot data (requires navigation file)
skyplot = result.get_skyplot_data()  # Returns list of satellite traces

# Export to JSON
json_str = result.to_json()

Jupyter Notebook Widget

A ready-to-use interactive widget is included:

# In Jupyter notebook
exec(open("geoveil_cn0_gui.py").read())

Features:

  • File upload or path input
  • Auto-download BRDC navigation files
  • Interactive Plotly charts
  • Quality radar, skyplots, heatmaps, timeseries
  • HTML report export

Data Sources

The library supports navigation data from:

  • BRDC: IGS combined broadcast ephemeris
  • SP3: Precise orbits from ESA, GFZ, CODE, WHU
  • TLE: CelesTrak GNSS TLE (fallback)

Requirements

  • Python 3.8+
  • No runtime dependencies (Rust binary)

Optional for notebooks:

  • plotly - Interactive charts
  • pandas - Data manipulation
  • ipywidgets - Jupyter widgets

License

MIT License - see LICENSE for details.

Author

Miluta Dulea-Flueras

Contributing

Contributions welcome! Please open an issue or pull request on GitHub.

Citation

If you use this library in research, please cite:

@software{geoveil_cn0,
  author = {Dulea-Flueras, Miluta},
  title = {geoveil-cn0: GNSS CN0 Signal Quality Analysis Library},
  year = {2026},
  url = {https://github.com/miluta7/geoveil-cn0}
}

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.4.tar.gz (123.4 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.4-cp312-cp312-win_amd64.whl (442.6 kB view details)

Uploaded CPython 3.12Windows x86-64

geoveil_cn0-0.3.4-cp312-cp312-manylinux_2_39_x86_64.whl (503.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.4-cp312-cp312-macosx_11_0_arm64.whl (450.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

geoveil_cn0-0.3.4-cp311-cp311-win_amd64.whl (441.4 kB view details)

Uploaded CPython 3.11Windows x86-64

geoveil_cn0-0.3.4-cp311-cp311-manylinux_2_39_x86_64.whl (502.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.4-cp311-cp311-macosx_11_0_arm64.whl (451.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

geoveil_cn0-0.3.4-cp310-cp310-win_amd64.whl (441.4 kB view details)

Uploaded CPython 3.10Windows x86-64

geoveil_cn0-0.3.4-cp310-cp310-manylinux_2_39_x86_64.whl (502.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.4-cp310-cp310-macosx_11_0_arm64.whl (451.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

geoveil_cn0-0.3.4-cp39-cp39-win_amd64.whl (441.6 kB view details)

Uploaded CPython 3.9Windows x86-64

geoveil_cn0-0.3.4-cp39-cp39-manylinux_2_39_x86_64.whl (503.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.4-cp39-cp39-macosx_11_0_arm64.whl (451.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

geoveil_cn0-0.3.4-cp38-cp38-win_amd64.whl (441.8 kB view details)

Uploaded CPython 3.8Windows x86-64

geoveil_cn0-0.3.4-cp38-cp38-manylinux_2_39_x86_64.whl (503.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.4-cp38-cp38-macosx_11_0_arm64.whl (451.8 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

Details for the file geoveil_cn0-0.3.4.tar.gz.

File metadata

  • Download URL: geoveil_cn0-0.3.4.tar.gz
  • Upload date:
  • Size: 123.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4.tar.gz
Algorithm Hash digest
SHA256 87efda13423bec6510b6bc2e4a1d62e340e846e41a6942bc7b4fa453199d12b1
MD5 51615daf756fdbb91bdb0001d4905d88
BLAKE2b-256 cb36ef93b9179c8618fde2621c7f2974a32a8411f6fdbc932fd2ca9db69547d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4.tar.gz:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 442.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8222384a5f6c5270991c0c1e2ed010c22b06c3ad215ca7501975d509d50b5038
MD5 9ce810479e54da0de2484c648462bcb2
BLAKE2b-256 5b5782fab3c0321b0cca76a7475036a9967cdbc1c9d8a2f51bdd6c0318149e08

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp312-cp312-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 908052477dfe54bba0c94c5a95213117bd6fe8bf6ff0dc0d3cd682b5003198a0
MD5 8bed6eb4d7e8faca37eb6dcc1f0f49b2
BLAKE2b-256 65ec296473a5df9cd36f6610d05f23f10b912dd9551c4393ec889d04fc30559c

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp312-cp312-manylinux_2_39_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ed54e0fd487c9870381b47d5ba8db9435816387cf611ff0eea1eacf1f8c6672d
MD5 b8ebc8acce7a15948361413720a22e60
BLAKE2b-256 95a1c912259c28e47136ac639ff101943e98a10639e4d898a78a20141a541ff1

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 441.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 aeee54705b1de22c674e5bd40eb7766153457eac36b268415b5ff1b12e943bf8
MD5 6543e3a6eac72c9044c62f764f5f1662
BLAKE2b-256 f8a9d83f9ae64b86a070f919c8c6396690a25bf5817f4e699ab16332d62ad28c

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp311-cp311-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 5bf4ecdbdcd8e6df4035513a92c06e10fce12b0679429daaef7d0e5131f6eb82
MD5 949405571ad7f115d78ca9cd9a7610a3
BLAKE2b-256 c2d82f12a5fd01ef0e92141622a9975ebf7a721a5112d4cbe6f69cdf533aab08

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp311-cp311-manylinux_2_39_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c605397d0c8564a041c6175a1bd752ee3d59ac7d6b75341d8a827c791b42940f
MD5 9dda45e7ec09f969471c2bcbe5950412
BLAKE2b-256 af4b1e5f2dc78f3cc30f9bd630c8f87f17a9f1d7a49e7d505c0e80f0ae956170

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 441.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5e1141632b789ba463adcd65a8737b51a3b32a8f927d876d732b94f124c53674
MD5 23053fe205d5212b14f3407693a8ca7b
BLAKE2b-256 b005d3bffe247517c92ae9c24345f6d87af32d2f43649d0962f776b8ef841af6

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp310-cp310-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f93a4713cf992d3d068cd893050d6bd95d6ef53bfe508112792015e29c0582aa
MD5 b016d8e130902e57449467960f5a90be
BLAKE2b-256 4a0172d1bfbc846ca27aa6fb0bdc288180a1f894d9c53efcfd1cb36f36c8fbf9

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp310-cp310-manylinux_2_39_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c85e778bc3f9f8a0148cff183f750c1bb8f9e3b50166f22cce62013b06c0abab
MD5 555a83c3c1de2e3d78a150960f1518bd
BLAKE2b-256 019c0deedbafb176c15e599b378879a98e7bec29dcbd3833572adc2c49c8e764

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 441.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 324dd366a2d2e3803d422a02fae369fdf25ad890e57822d524a871d2578e97a0
MD5 963def849d9a172a8496cc6e42947a28
BLAKE2b-256 b986dbb117021d568a794de2794dd29102042701e61e80f1e308acf596c30982

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp39-cp39-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp39-cp39-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp39-cp39-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 dae5de3f1db6f0dcccb8d4fc9ecb802ce1bcad8a33bb6c9d991e4fea213f2fe7
MD5 79c73a0776805c15ecaa363f30c58b2a
BLAKE2b-256 4a351820888defa5d17efd90eff03a0adfb47bcb030da42434eb147aab574271

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp39-cp39-manylinux_2_39_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 06fcc0ece2a4384269b7568636b85ebe762ad90163c955dffa3f1a97e05994ac
MD5 5f622efd01b0367b92f685e76bbf018d
BLAKE2b-256 5eb8e0a9e7c955bf9aab0f723ed52dfbbd566436257994cfba09f5a0115689c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 441.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for geoveil_cn0-0.3.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 fe432196aba8ae42e561cb2d9f763804c73b45153e46df6ba54044ff20b5cf02
MD5 54070b63cf13c885aa59c8e67fcd0a54
BLAKE2b-256 cab2ca41e89bb717289cfe4cfb8824a5ff266149101c2a87d9229618cfca4798

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp38-cp38-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp38-cp38-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp38-cp38-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b305caa8f961467072c01ae5a1b32886e9c01b5d6064c915e188dde20a882112
MD5 897179adadd001271ea3cc40b3d9ffe7
BLAKE2b-256 b104329080abeb69e54e9daba28faac4fd65d3f3a56b3b5560631a0aae5f179b

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp38-cp38-manylinux_2_39_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file geoveil_cn0-0.3.4-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 23e07b8ffc5b59a881da5416649095dbbdec844ec69fe64f83dd11741d201565
MD5 cb5427a2b0180a0dfdca24fb59241fcd
BLAKE2b-256 c0603dd0b1728082f83df4a89ef23db60e230bf8b4d0699751a28b0e1ea27ac0

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.4-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-cn0

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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