Skip to main content

geoveil-mp

GNSS code multipath analysis — Rust core, Python API

Crates.io PyPI PyPI downloads Rust Python License: MIT CI/CD

Code multipath RMS by signal — real 24 h / 30 s multi-GNSS data

Anubis/TEQC-style code multipath estimation for every pseudorange observable in a RINEX file — per-code MP linear combinations, arc-wise ambiguity debiasing, interval-aware cycle-slip detection, and SNR series export. Built for continuous station monitoring on long time series of 1 s or 30 s data, following the methodology of Hunegnaw & Teferle (Sensors 2022).

Part of the GeoVeil suite together with geoveil-cn0 (CN0 signal quality and threat detection).

Live demo: batch.geoveil-rinex.eu — the GeoVeil batch dashboard runs this library in production: per-code MP RMS, cycle-slip counts, SNR-residual wavelet spectra, Fresnel zone maps, and long-term multipath trend monitoring on daily 30 s station data.


Installation

pip install geoveil-mp

Pre-built wheels for Linux, Windows, and macOS — no Rust toolchain required.

# Rust
[dependencies]
geoveil_mp = "0.2"

Quick Start

import geoveil_mp as gm

obs = gm.read_rinex_obs("BOR100POL_R_20240010000_01D_30S_MO.rnx")
print(obs.num_epochs, obs.num_satellites, obs.interval)   # 2880 104 30.0

analyzer = gm.MultipathAnalyzer(obs, elevation_cutoff=10.0, systems=["G", "R", "E", "C"])
results = analyzer.analyze()

# One statistics row per signal code: GPSM1C, GPSM2W, GALM8X, GLOM1P, BDSM2I, ...
for s in sorted(results.statistics, key=lambda s: s.signal):
    print(f"{s.signal}  rms={s.rms:.3f} m  n={s.count}  slips={s.cycle_slips}")

# Cycle slips, counted per carrier-phase signal
print(results.cycle_slip_counts)          # {'GPSL1C': 210, 'GPSL2W': 168, ...}

# Attach precise elevations from SP3 (recomputes elevation-weighted RMS)
sp3 = gm.read_sp3("COD0MGXFIN_20240010000_01D_05M_ORB.SP3")
computed, failed = results.compute_elevations(sp3, obs.approx_position)

# SNR time series per satellite and S-code (for SNR-residual multipath analysis)
for series in obs.get_snr_series("G07"):
    print(series.code, len(series), series.values[:3])
Debiased MP series for one satellite — the oscillation is site multipath

What it computes

Per-code multipath combinations

For every pseudorange code observable P_k (C1C, C1X, C2W, C2X, C5X, ...), the ionosphere-free, geometry-free multipath combination is formed with two carrier phases:

MP_k = P_k − (1 + 2/(α−1))·Φ_i + (2/(α−1))·Φ_j        α = (f_i / f_j)²
  • Φ_i — phase on the code's own band; Φ_j — phase on a partner band chosen from a deterministic per-system priority list
  • GLONASS FDMA frequencies use the per-satellite channel numbers from the RINEX header
  • The phase-ambiguity bias is removed per continuous arc: whole-arc mean for short arcs, centered moving average (default 1500 s) for long ones
  • Arcs reset at data gaps, cycle slips, and MP jumps — slips never smear into the RMS

Signals are named in the convention used by GNSS monitoring literature: GPSM1C, GPSM2W, GLOM1P, GALM8X, BDSM2I.

Cycle-slip detection

Three detectors, thresholds that scale with the sampling interval (|Δ| > base + rate·dt):

Method Test Default threshold
Geometry-free ΔGF per phase code vs. reference band 0.10 m + 0.003·dt
Code-phase Δ(Φ − P) per code 5.0 m + 0.10·dt
LLI RINEX loss-of-lock flags (phase only)

At 30 s sampling this detects single-cycle L1 slips (GF signature ≈ 0.29 m vs. threshold 0.19 m) — rate-based thresholds tuned for 1 s data cannot. Slips are attributed and counted per signal code (GPSL2W, GLOL1C, ...).

SNR series export

RinexObsData.get_snr_series(satellite, code=None) returns per-S-code time series (unix-second timestamps, dB-Hz values) — the input for SNR-residual multipath analysis (polynomial detrending, wavelet spectra) without re-parsing the file.


Results on real data

24 h of BOR1 (EPN, Poland) 30 s multi-GNSS RINEX 3, default settings:

Constellation Best signal RMS Worst signal RMS
Galileo E5 AltBOC (M8X) 0.165 m E5b (M7X) 0.395 m
GPS L2C (M2X) 0.312 m L1 C/A (M1C) 0.342 m
BeiDou B2I (M7I) 0.295 m B3I (M6I) 0.354 m
GLONASS L2 P (M2P) 0.318 m L1 C/A (M1C) 0.566 m

The ranking (Galileo AltBOC best, GLONASS C/A worst) reproduces published station-monitoring results. Parsing the file takes ~0.4 s; the full 15-signal analysis with slip detection ~1.4 s (306 k estimates).


Analyzer options

gm.MultipathAnalyzer(
    obs,
    elevation_cutoff=10.0,        # degrees; applied when elevations are known
    systems=["G", "R", "E", "C"], # G R E C J S I
    bias_window_seconds=1500.0,   # moving-average window; None = whole-arc mean
    min_arc_seconds=300.0,        # drop shorter arcs
    arc_gap_factor=5.0,           # arc break at gap > factor × interval
    include_codes=["C1C", "GC5X"],# restrict codes ("C1C" any system, "GC5X" GPS only)
    exclude_codes=[],
    max_epochs=None,              # uniform decimation guard for huge files
    detect_cycle_slips=True,
    ion_delta_base=0.10, ion_delta_rate=0.003,   # GF slip threshold (m, m/s)
    cp_delta_base=5.0,   cp_delta_rate=0.10,     # code-phase slip threshold
)

API surface

Object Key members
RinexObsData num_epochs, num_satellites, interval, marker_name, approx_position, satellites(), observation_types(sys), glonass_fcn(), snr_codes(sat), get_snr_series(sat, code=None)
MultipathAnalyzer analyze()AnalysisResults
AnalysisResults estimates, statistics, cycle_slips, cycle_slip_counts, total_estimates(), total_cycle_slips(), compute_elevations(sp3, receiver)
MultipathEstimate satellite, system, signal ("C1C"), epoch, mp_value, elevation, azimuth, snr
MultipathStats signal ("GPSM1C"), system, code, count, rms, weighted_rms, mean, std_dev, min, max, cycle_slips
CycleSlip satellite, epoch, signal, system, magnitude, threshold, method ("gf", "code_phase", "lli")
SnrSeries satellite, system, code, times, values, epochs_iso()
Sp3Data satellites(), get_position(sat, epoch), num_epochs, interval
Functions read_rinex_obs, read_rinex_obs_bytes, read_sp3, calculate_azel, compute_elevation, get_frequency, get_wavelength, version

Supported input: RINEX v2 / v3 / v4 observation files, SP3-c/d orbits, broadcast ephemerides (Keplerian + GLONASS RK4).


Pipeline

flowchart LR
    A[RINEX v2/v3/v4] --> B[Parse<br/>code + phase + SNR]
    B --> C[Per-code combos<br/>deterministic phase pairing]
    B --> D[Cycle-slip detection<br/>GF · code-phase · LLI]
    D --> E[Arc splitting]
    C --> E
    E --> F[Ambiguity debiasing<br/>mean / moving average]
    F --> G[Per-signal statistics<br/>RMS · weighted RMS]
    H[SP3 orbits] -.-> I[Elevations / azimuths]
    I -.-> G

CLI

geoveil-mp analyze --obs station.rnx --sp3 orbits.sp3 --elevation 10 --output results/
geoveil-mp info --obs station.rnx

References

  • Hunegnaw, A.; Teferle, F.N. Evaluation of the Multipath Environment Using Electromagnetic-Absorbing Materials at Continuous GNSS Stations. Sensors 2022, 22, 3384.
  • Estey, L.H.; Meertens, C.M. TEQC: The Multi-Purpose Toolkit for GPS/GLONASS Data. GPS Solutions 1999, 3, 42–49.
  • Václavovic, P.; Douša, J. G-Nut/Anubis: Open-Source Tool for Multi-GNSS Data Monitoring. IAG Symposia 2016, 143.

License

MIT — see LICENSE.

Author

Miluta Dulea-Fluerasmiluta.flueras@cartografie.ro

Citation

@software{geoveil_mp,
  author  = {Dulea-Flueras, Miluta},
  title   = {geoveil-mp: GNSS Code Multipath Analysis Library},
  year    = {2026},
  version = {0.2.0},
  url     = {https://github.com/miluta7/geoveil-mp},
  license = {MIT}
}

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

geoveil_mp-0.2.1.tar.gz (117.9 kB view details)

Uploaded Source

Built Distributions

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

geoveil_mp-0.2.1-cp312-cp312-win_amd64.whl (494.5 kB view details)

Uploaded CPython 3.12Windows x86-64

geoveil_mp-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (559.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.1-cp312-cp312-macosx_11_0_arm64.whl (525.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

geoveil_mp-0.2.1-cp311-cp311-win_amd64.whl (494.1 kB view details)

Uploaded CPython 3.11Windows x86-64

geoveil_mp-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (558.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (525.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

geoveil_mp-0.2.1-cp310-cp310-win_amd64.whl (494.3 kB view details)

Uploaded CPython 3.10Windows x86-64

geoveil_mp-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (558.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.1-cp310-cp310-macosx_11_0_arm64.whl (525.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

geoveil_mp-0.2.1-cp39-cp39-win_amd64.whl (495.0 kB view details)

Uploaded CPython 3.9Windows x86-64

geoveil_mp-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (559.3 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.1-cp39-cp39-macosx_11_0_arm64.whl (526.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file geoveil_mp-0.2.1.tar.gz.

File metadata

  • Download URL: geoveil_mp-0.2.1.tar.gz
  • Upload date:
  • Size: 117.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for geoveil_mp-0.2.1.tar.gz
Algorithm Hash digest
SHA256 472bba520d579094ecfc58acd0359e97eeaddecea211b0d969a889da350bda80
MD5 5afaa72ee87f98515eb58d2b0483d22b
BLAKE2b-256 b62fe845db3b63f3fd4ca6d5e775a7db3a3312d726959550dc611843ca910329

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1.tar.gz:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 494.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for geoveil_mp-0.2.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 61484529a3b0cc41ec67badbe40e2ee4233bddb0dc5c10b0e448de4b2e5d5af4
MD5 7f077a9318f8b98bd5a667e91ddc36c5
BLAKE2b-256 f6b6938629c2f7e76c65499ea8162f7c7983f73362dce4e63131e90128b23502

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp312-cp312-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 831cc687d12dfc5a9546ebe23bc3d2ab02a44f651e62db34bfec6cf84a68c853
MD5 55d403c25b99f3f244597e9551046f9c
BLAKE2b-256 d59740e5b5c6622432176404304dba009ec45cd42bbf7b9b19522ef6bc6a4da9

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ca2291f2e48b64a09c610144310fe00f05656c5b7a0b381e77ef6e17f6809a2
MD5 8e2b7bd39eb40c79940fba0cb5e7ee9d
BLAKE2b-256 9207e49aa3c08554494a4be4e877ae7a45878983932371786a92ca54ebeb0e99

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 494.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for geoveil_mp-0.2.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f32ee48481c71a0badaee342db9b47b871479682d712a87d5e55fde5d1b824ed
MD5 8689f744803eac0d7842ca0b451c8582
BLAKE2b-256 d50467e8130191013f777baf57ff78419c0c331e0359cb7c0a34a9227bea7196

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp311-cp311-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8644af0b504ca0bde1def23c0e9f6e02c5835c75de2a2f678077090ba8cfb928
MD5 b5fa15dcabad78d876ba473265b4a3a7
BLAKE2b-256 9a8bdb1c31d0d37230c91c0af5b044bffe2a62815e5d648f450c86b9260d8164

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 895bbb4666cc0d0c625e7ca9f2523df5918f173dff200fb88de8237b5f51dacd
MD5 60f500450cee691f679365d85c8f38f9
BLAKE2b-256 36faa569acb3fbb0ae9b6621800ecd106dee0c22015ee8797889d6234a2a2674

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 494.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for geoveil_mp-0.2.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4df63e5b813a589c55b2854cb9daeec8d679c17fbbea312bc9a760fe4ba6e6e9
MD5 3e70b553f5d23c4d1d08bbf3ad2e6821
BLAKE2b-256 64c30ea9ecdbe3c4517b482d2bedcd65c99b406a1ed847cc793b4ee5adff5fe8

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp310-cp310-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 736a719c67d7393c3e9b30447da2805a94c3a47f76105c9f7ec434ca00b6b586
MD5 8e906ec5ce55f0efa023f70065ea0a9d
BLAKE2b-256 88bbd52848a2eb2a4bc3eac011c4390ec00b5d529ca9fc9fdfa601c385e26ecf

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dbc41765ae90c070c4f4f176399087f206c5b769409e64ecbcffdff476be2b2f
MD5 689d511715c0a2e9320dd43ebf50ddbe
BLAKE2b-256 3c4fc683661b3bcd8943b267621cc19a6fc9f14cd27cda532e4793ed0c2bd294

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 495.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for geoveil_mp-0.2.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 790053f03ff57681a69aacafb0a50216c305ec7cf74fe197687ce541ec58a5a6
MD5 0818b8dadc496f9fd1fb667e7fd3c608
BLAKE2b-256 806dce5cd1f450968ee01c81cf37de9804a6fd48b14a1408ed3b64e98e85d171

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp39-cp39-win_amd64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d574d45fbe38890b0fce6a8cc00e462ded7521c77b94c865894a66bd513a7b48
MD5 57ef3baa392dc2817daa0a901b53753e
BLAKE2b-256 bddb6f9f65e4ab68cefa3966059bb1adda7ea4ed0c5b933924b4d1c6534e1a3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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_mp-0.2.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 601e05de962b0e3e94f648cf1ab979ea5d644d7eee192340f3714af3b932d1e6
MD5 4ce58d75da1234cd80186ba888f32a21
BLAKE2b-256 91d97ee44ac04078ce05af20277cfbcd8fe262e3570b23c9bcbe1aaa8485dd4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.1-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: ci.yml on miluta7/geoveil-mp

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 Sentry Error logging StatusPage Status page