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


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.0.tar.gz (128.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.0-cp312-cp312-win_amd64.whl (492.8 kB view details)

Uploaded CPython 3.12Windows x86-64

geoveil_mp-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (557.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (523.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

geoveil_mp-0.2.0-cp311-cp311-win_amd64.whl (492.5 kB view details)

Uploaded CPython 3.11Windows x86-64

geoveil_mp-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (556.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (523.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

geoveil_mp-0.2.0-cp310-cp310-win_amd64.whl (492.5 kB view details)

Uploaded CPython 3.10Windows x86-64

geoveil_mp-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (556.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (523.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

geoveil_mp-0.2.0-cp39-cp39-win_amd64.whl (493.1 kB view details)

Uploaded CPython 3.9Windows x86-64

geoveil_mp-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (557.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

geoveil_mp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl (524.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: geoveil_mp-0.2.0.tar.gz
  • Upload date:
  • Size: 128.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.0.tar.gz
Algorithm Hash digest
SHA256 e3cc524843426aa502ef44123c30e9a9cfdf717366061cb5b98b69567a86204e
MD5 6ffa52b1da2b413261d17a11c461bd2a
BLAKE2b-256 a426f0e5532966890cf313c83c997281a713b1f1805fad470fa1ebc26044cea8

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0.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.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 492.8 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ec0ac113f11932e33b85c92a03407fbc985ca7e42ac8b21755e537af06b0cbb1
MD5 7dfd009f3f8cdbd30cebbb66f962133e
BLAKE2b-256 b1390172bc13965c77c9b8c6a67b7998dba4038e0d5be27558ae7b507dc3e080

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 034ace8b41ca5fdfc533df17e794da973f732c86558f64a1c794e6a05c48f034
MD5 e4ba296084d720247af0c0130a7026b2
BLAKE2b-256 e656bd502a4f7450bdee4ae4fad3959d1a52e5825e652987867e9cda9f7db8bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3bc6c43dd2924d0a923a1d9baf2b7d05e6ddca657273134d492a5c41f6709014
MD5 8eb665ba6368436b10e27b3de839e38d
BLAKE2b-256 7836fa75bc7fbbe37724022d2a2bc2f7a30c4013a47d7f8ed7a6a926a0512625

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 492.5 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 79ecaf3fedbc2ea5afb90d590772c21cad4663ab009daac59f5799a26f4f4396
MD5 ab298f96b25ed7035aa18d89d3a35603
BLAKE2b-256 2669761fce96ef2d5c57eb47ce2761456c7358fcc3364833438172fad351bbd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 57a7e11759646c6ab9e8bbbc1772825aa211f0707b66bb45bee8571a3fb19ffe
MD5 4ea5ffd9093e1ad055c1b0189848e009
BLAKE2b-256 588af810f464e5055aa4b56dcd6f954a87da22f34e3d731d6f42fe66a1e3d0d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f4e67cf58b9e533a1b58a2f46619f2c6bac43798fd5bdfd9da4de1b7fd3060f7
MD5 26a50821e7ac33f0940124c97564ee50
BLAKE2b-256 316ab026bd62123df1493648c24fc2e3de8f7fd83af5a67446e24028d1053867

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 492.5 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5d1a9f408920341cb99b2db8bfe737889553fc9f1c2a9d3340517a1a3524fde4
MD5 b74abc5a94f406d6d50b2178cdb67862
BLAKE2b-256 ee7ba691e5cb9c991cf956133b7771cb1234bb8aa4c17020be9bec929b434ab2

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 857254993c3dfaab3cb4e25b3237baf6a9219c2d72b3a795eea6bec85954d270
MD5 78bd9603ba897e5c6bb4bdd2063a3702
BLAKE2b-256 0e38ba33c23365f2da26ec18320a26c2dfe2915630b56325c3e05c39501ff31f

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 70c96d428973db6b7f646bcdd3065086daad5f7da68869d6626ee7c3663d0a9f
MD5 b6a62cf37563ac5082aefae31c02f800
BLAKE2b-256 f559b2129adbbb085eb2c3245ef13d65482546876b2b6de5231d049e5d56827e

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: geoveil_mp-0.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 493.1 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.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3dc80f63afd65f598277b75a3328c244d7503cb6bac9b5a2485b3549ee51a2b9
MD5 27fd0966b5a70e1cf6eed7973b647550
BLAKE2b-256 13b6a4e064162694f6dad3d4a01c37c55c235db815cefa0bfd100bc2f2649e17

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1b9f78982fcb91687c6c6c8ede5457ee91966fe8345231f7afba9ff7f7457db0
MD5 8d0fd11282efd4f6d03c8ab538e8c6a8
BLAKE2b-256 822e69cbbde4e4857c07adecc73e2f4398458ecc8b57c3d7946d6a3c82d67dc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for geoveil_mp-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1883dc433a0994fc5190a13fe178f2cb49474ba7831ea633a9e2691ed1a2f33c
MD5 89a5b1cdb769a1c4d181aad2149dd7ce
BLAKE2b-256 3efeb37365560aed8066e16a19e671d4f04ca095354784ff775b856ca203fa85

See more details on using hashes here.

Provenance

The following attestation bundles were made for geoveil_mp-0.2.0-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