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.5.tar.gz (123.6 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.5-cp312-cp312-win_amd64.whl (443.5 kB view details)

Uploaded CPython 3.12Windows x86-64

geoveil_cn0-0.3.5-cp312-cp312-manylinux_2_39_x86_64.whl (504.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.5-cp312-cp312-macosx_11_0_arm64.whl (450.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

geoveil_cn0-0.3.5-cp311-cp311-win_amd64.whl (442.1 kB view details)

Uploaded CPython 3.11Windows x86-64

geoveil_cn0-0.3.5-cp311-cp311-manylinux_2_39_x86_64.whl (503.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.5-cp311-cp311-macosx_11_0_arm64.whl (450.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

geoveil_cn0-0.3.5-cp310-cp310-win_amd64.whl (442.5 kB view details)

Uploaded CPython 3.10Windows x86-64

geoveil_cn0-0.3.5-cp310-cp310-manylinux_2_39_x86_64.whl (503.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.5-cp310-cp310-macosx_11_0_arm64.whl (451.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

geoveil_cn0-0.3.5-cp39-cp39-win_amd64.whl (442.7 kB view details)

Uploaded CPython 3.9Windows x86-64

geoveil_cn0-0.3.5-cp39-cp39-manylinux_2_39_x86_64.whl (504.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.5-cp39-cp39-macosx_11_0_arm64.whl (451.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

geoveil_cn0-0.3.5-cp38-cp38-win_amd64.whl (442.9 kB view details)

Uploaded CPython 3.8Windows x86-64

geoveil_cn0-0.3.5-cp38-cp38-manylinux_2_39_x86_64.whl (504.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.39+ x86-64

geoveil_cn0-0.3.5-cp38-cp38-macosx_11_0_arm64.whl (451.9 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: geoveil_cn0-0.3.5.tar.gz
  • Upload date:
  • Size: 123.6 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.5.tar.gz
Algorithm Hash digest
SHA256 7d808d321dbb650f4bb96dd8e7932dde3466385cb29888f810e8af9fd0df9fe6
MD5 c39c2abe1605ab6d10733691b7530ca7
BLAKE2b-256 7a7764c885b95233e8e834d3b0610ebf67a83add7be41d4490900536c80141da

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5.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.5-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 443.5 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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2a8e43fd02093eafef16483e56c82a1dbafec5cb584cfa85dc777598776543e7
MD5 8df2a77382b43937cf51751fa6f1fe14
BLAKE2b-256 da05e194cc006a6569155700e29db3e3a3837cb07562d1d2d541e74a19629d11

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 cf911f41feac3eb9772b56ef4966532274d13849ba2bb17ff05898d2af90a430
MD5 54c6b6edacd20e19ded5a8e78559db96
BLAKE2b-256 7d160ba9538d91979fb9e3cb29505ba2c6586dcf81d4c494d6c8de8c9a3278d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ef1f9a263a3e5834d09ed443dc85ba9633e6b417b7b413963581b2509d5535d
MD5 a7c3e936926ff21e20edfa8e7f65fcfb
BLAKE2b-256 9682115526bf2cc9fda01dbf9e70e70b728bb46d23a397cef3e801a9291834db

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 442.1 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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fead82a3ad8b7b88396ed2518185d579a8de5fc355d19f32e20b32b8b46bbb50
MD5 da802501c8645306b0450866b2fdd2d6
BLAKE2b-256 e1aecf247f3cb50e986b6b2b22f966b607f4df3e573882e295d40b9e3409220e

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 4d887c2936237f5bb09efe3a77385cff56d6d9addd1e199960c725f93274f108
MD5 9da8121c28368932af5a96e5dcef7fa5
BLAKE2b-256 6896545d2b8a790ac0641e74c967375ed7e04f11cbd389628160ae5981bb19d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72ae77ae853698b7e6b53410e8787661315e2503d0e0a33872dfbedb7d74b05d
MD5 90cf9cfa04c0aa21135a94bf769a3f39
BLAKE2b-256 a220aa5e0c208aff4f0e2262f9c1d58f9ae2b0f4d09a2cd3956086620ecc5099

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 442.5 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.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4f79a512fd89d92e27f42cb05d5c53ec28b471d90675c813e7c3b152c2f52dc
MD5 4d3247264083217348faac1a9599190e
BLAKE2b-256 bc2ae7f6a05cd2a92b34603b0a366aebf9738ee2c69c929e814ad635552b2e25

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 8676dfabbc246afb726ec1c699c98c6c697a7828e04ecdea2e53fed748062bea
MD5 eacf5a55b9ba0d7386b1f861bd376a69
BLAKE2b-256 18ed09d49884814ad68de3c81506b1fddc7f7af70c35cd704338d6992d1e7ac1

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f3ce65ad9949d1249e16d2337b6f309066f076b43e8035d746ae92fedfb69dd
MD5 a6f370d37b194c97de5c1717d50a3670
BLAKE2b-256 5a91f77c3369d24a3c70bb4372592b04e8801e047b1933b0104c2b69b68bec78

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 442.7 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.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 87be2b100f8035da1c39f9b5fe64a315c8437fafa320216ff9363880d7658e9f
MD5 dece0443dc47df7c4de3e4842ae1f458
BLAKE2b-256 d0b75a794613ccd25bc3ccf7ee43decfb68cc6f2139c1eaf41764f5f32ef839c

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp39-cp39-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp39-cp39-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 87563931d726926c7c76c6cc48b041a667bbfc935cdcad81033994e437dbe519
MD5 d84f562d7705db1a1ff7911acb7c7ce2
BLAKE2b-256 1e6edb345c90168874a3a91df438a31a681e60483febf9d859840518528fd74a

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fcfe921c0d128bcedaee63fa9b0159c59bf2853650dd3565d30fe301166b885e
MD5 1fe934ade767dc73263e3d70022e2db6
BLAKE2b-256 723a15d78dbd4ef4378d7c22de509e7d2edf8fe5a353fb6dce0ccfd2a8c8f6ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: geoveil_cn0-0.3.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 442.9 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.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 38e7b95b0f40a5b9e82d7f50cf4f5184bcdb23e73abeafaeae44e776312df070
MD5 ea524ab19391b920b3893d78df0ec858
BLAKE2b-256 a018d72b8763609799a278a2ff3d3a59e9d5ca27e31dbc7b079dc7a72fba39f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp38-cp38-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp38-cp38-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 ffc903086475e4d18527dc6022413e579eec91b9573c58e5cd38b5ee3c70d752
MD5 422dcd89d049322f4bc7d813634ae0ac
BLAKE2b-256 ca54e44e5ccbccc18aa72c49e03de1a78c3f4e40720fbafea8d0feef2298f72d

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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.5-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_cn0-0.3.5-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e513699f2c031c677f86df265f2a7e935ef49f1e52cfb6306a06f97e83e1be3f
MD5 bf81bf373724b07423cf54b5191b527b
BLAKE2b-256 3c0a550cf5c9f11e8f618dce0febc63a5f48255ed603569b61ce24cd1c70a2c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_cn0-0.3.5-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