A

JuliaGNSS/Tracking.jl: v2.0.0

Zenodo (CERN European Organization for Nuclear Research)

Abstract

2.0.0 (2026-06-17) build(deps)!: bump to GNSSSignals v2 and update for renamed API (de2acc9) feat!: add allocation-free track! and TrackedSat wrapper (8b9c634) feat!: add remove_satellite!/remove_satellite, drop filter_out_sats (42e1f93) feat!: signals=(...) constructor; add_satellite!/add_satellite API (910804b) feat(tracking)!: per-signal coherent integration length with auto-scaled loop bandwidth (66ed6e3) fix(tracking)!: infer or require group= in the by-hand add/remove API (3bffef4) refactor!: cached per-thread scratch buffers, drop Bumper dep (ec5b778) refactor!: drop prewarm! and unexport wrap_sats (af1426a) refactor!: drop Val(sampling_frequency) plumbing for GNSSSignals 1.0.3 (018dd67), closes #52 refactor!: error on mismatched doppler_estimator type; drop silent reseed (40b2240) refactor!: generalize TrackedSat.signals to Tuple{Vararg{TrackedSignal}} (6894d56) refactor!: introduce TrackedSignal; flatten TrackedSat; drop TrackedSystem (2943a81) refactor!: remove CUDA extension (c37b4cd) refactor!: rename SystemSatsState → TrackedSystem (and consequents) (de04101) Bug Fixes address accessor gaps, error messages, and review polish from #113 (#134) (c8fa8f8) api: settle public-API naming before v2 (#132) (57b1c75), closes #113 bench: make benchmarks.jl portable across master/new constructor signatures (f105c06) benchmark: build per-signal-typed found BitBuffer in steady-state setup (785cbdc) bit_buffer: apply lock polarity to pre-sync recovered bits (35c6c4f), closes #127 bit_buffer: clamp within-bin residual to keep CFAR variance real (#124) (0d62da8), closes hi#SNR bit_buffer: decode post-sync data bits at 1-block integration (#125) (1949aab) bit_buffer: hoist Acklam constants; drop version-fragile alloc test (#124) (f839449) bit_buffer: reject/clamp non-divisor coherent-integration length (a2519ac), closes #128 bit_buffer: Welford variance, confidence clamp, signal-agnostic soft bit-edge (#124) (7381cff) ci: docs, exports, and Julia 1.10 alloc-test gating (3c70d4d) code_phase: widen wrap to one full symbol period post-sync (14a4f63) correlator: use narrow 0.1-chip DLL spacing for GPS L1C-D and L1C-P (4a1b747) docs: add @docs blocks for default_carrier/code_loop_filter_bandwidth (398eaec) docs: drop @ref to internal ScratchBuffers from public docstrings (9dc7985) ext: rename GPU kernel-launch helper, update GPU test for TrackedSat (a531337) ext: unwrap TrackedSat in GPUDownconvertAndCorrelator constructor (72531f7) galileo_e1b: drop bit-edge search — symbol is aligned with primary code (f99775f) gpsl1ca: edge-lock the L1CA bit-sync detector (#124) (f660a28) gpsl1ca: replace L1CA bit-sync with soft-decision CFAR detector (#124) (fa7f783), closes #138 measurement: promote frequency types and fix mixed-precision duration check (b585f42), closes #131 sat_state: detach Dictionary Indices in immutable slot-vector copy (c9794e9), closes #123 sat_state: validate SignalGroup band/chip-rate and use lcm for code wrap (f852045), closes #129 test: measure track! allocations from typed scope (7d7c2d3) tracking: actionable error for bands without a band_key method (9a2b5e2) tracking: honor rebuilt estimator from add_satellite! handoff (328a32b), closes #130 tracking: index code replica by absolute start_sample in tile-share kernel (543cf10) tracking: index dynamic-shifts fused kernel by absolute start_sample; unify CPU per-signal path (74206e1), closes #126 #126 #126 tracking: make fused correlator width-independent (#152) (300c397) tracking: preserve secondary-code phase in multi-block coherent integration (cde8e53) tracking: prevent deadlock when chunks are one code period (#117) (83681d4) tracking: reject ambiguous duplicate signal-type selector (647eab3) tracking: throw a consistent KeyError from remove_satellite! (d00d5f0) tracking: unify secondary-code sync into a phase-recovering rotation search (d63bec7) Features Acquisition-aware TrackState/add_satellite! constructors (3ae9110) acquisition: auto-route add_satellite! by signal type when group= omitted (525f86d) add update_estimator_on_handoff hook for shared estimator state (8daba12) bit_buffer: output soft bits alongside hard bits (08c6602) bit_buffer: per-signal sync-search buffer width via trait (f840c49) bit_buffer: user-adjustable sync tolerance via dispatch (16baf56) galileo_e1b: support GalileoE1B_BOC11 alongside GalileoE1B (5f4feac), closes GNSSSignals.jl#59 GPSL1C_D/P signal support, per-signal loop-bandwidth defaults, doc fixes (81c0e29) multi-antenna support + antenna-outer correlate for tuple kernel (a9e26fc) per-group NumAnts via SignalGroup entries + same-band agreement check (efc0ed5) per-signal accessors with integer or signal-type selector (9fbd928) singular signal kwarg on TrackState for one-signal shortcut (78afaa8) sync: Hamming tolerance on bit-edge / NH10 detectors (abe8053) sync: L1C-D one-symbol-per-block sync (trivial) (9e8add5) sync: L1C-P 1800-chip overlay-code phase search (33439d3) tracking: add reset_loop_filters! for clean integration-length handoff (0bb7965) tracking: auto-size loop bandwidth per estimator-driver signal (5556104) tracking: immutable batch add_satellite for acquisition results (d2adb2e) Performance Improvements avoid Set allocations in _validate_measurements (62627b8) bit_buffer: incremental O(L) soft bit-edge detector + drift-robust noise (#124) (0706462) bit_buffer: make the soft bit-edge detector allocation-free (#124) (54ad9a4) fused: wire ScratchBuffers tile_re/tile_im through fused fallback (c43d7c6) multi-system: walk system tuple recursively, avoid boxing (57cdcfb) sat_state: detach Dictionary Indices once at the track boundary, not per loop iteration (c50e730), closes #123 #123 tile-share fused kernel for multi-signal sats (e0538ec) track!: eliminate per-call Core.Box allocation in bit_buffer (1a32840) tracking: keep dynamic fused kernel buffer-taking only to avoid benchmark regression (6d4e903), closes #126 tuple-recursive antenna-shape validation to keep track! alloc-free (0f438a1) BREAKING CHANGES the keyword add/remove API no longer assumes a :default group; multi-group TrackStates must pass group= explicitly (previously a raw KeyError) and single named groups are now inferred. Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com track / track! no longer accept a preferred_num_code_blocks_to_integrate keyword, and the internal downconvert_and_correlate[!] / estimate_dopplers_and_filter_prompt[!] signatures drop the trailing parameter — custom AbstractDopplerEstimator implementations of estimate_dopplers_and_filter_prompt[!] must drop it too and read each signal's field instead. Configure integration length via set_preferred_num_code_blocks_to_integrate! (or the TrackedSignal constructor kwarg) before tracking. The conventional PLL/DLL estimator auto-scales each signal's effective loop bandwidth by 1/N for its integration length N, holding the loop's BL·Δt stability product at its one-primary-period value. The configured bandwidth is a per-primary-period reference; longer coherent integration (e.g. L5I 10 ms) stays stable with no manual bandwidth change. For N=1 it divides by 1 and is bit-identical. Also scopes the secondary-/overlay-aware code-replica + integration-window wrap to multi-block integration only (num_blocks > 1); a single block keeps the primary-only replica so the per-block secondary sign stays handled by the bit buffer — restoring bit-identical N=1 behavior and fixing the GPS L5I secondary-code phase-recovery test that the unscoped wrap perturbed. Full test suite (incl. Aqua) passes. Verified on a real GPS L5I capture: per-signal mixed lengths (PRN 1 at 10 ms, others at 1 ms) and a staged 1 ms->10 ms promotion both reach full coherent gain with no manual tuning. Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com TrackedSat instances must be constructed with the same doppler_estimator that the TrackState (or merge_sats target) uses. Code that built sats with the default estimator and then passed them to a TrackState with a custom estimator must now thread the estimator through both calls explicitly. The keyword add_satellite!(; prn, …) form is unaffected. filter_out_sats is removed. Use remove_satellite! (or remove_satellite) instead. The new API takes one PRN at a time; for batched removal, loop over the PRN list. TrackState now has three type parameters ({S, SG, DE}) instead of two; external callers writing TrackState{S, DE} type annotations must update them. The get_tracked_system accessor was already removed in an earlier commit. _update_tracked_sat_correlator, _update_tracked_sat_doppler, and update no longer accept a positional system argument; the per-signal system is recovered from each TrackedSignal's .signal field. SatState, TrackedSystem, get_tracked_system, and the old wrapper-shape TrackedSat are gone. Callers that built SatState directly must use TrackedSat(signal, prn, code_phase, carrier_doppler; doppler_estimator = ...) instead. Code that read sat.sat_state.x or sat.estimator_state.y now reads sat.x and sat.doppler_estimator_state.y respectively. Tracking.jl no longer supports GNSSSignals v1 or earlier. Downstream users must update their own signal-type names and AbstractGNSS uses to match the new API. GPU tracking via TrackingCUDAExt is no longer available. Use the CPU path for now; KernelAbstractions-based GPU support will land in a follow-up. SystemSatsState is renamed to TrackedSystem. Code that imports Tracking.SystemSatsState or constructs it directly must update the symbol name. MultipleSystemSatsState is renamed to TrackedSystems. Custom estimators with method signatures constraining MultipleSystemSatsState need to update to TrackedSystems. get_system_sats_state is renamed to get_tracked_system. External callers must update. TrackState's field multiple_system_sats_state::S is renamed to tracked_systems::S. The keyword argument

Authors 10

  1. RWTH Aachen University

    Affiliation as printed

    RWTH Aachen University

  2. Affiliation as printed

    @semantic-release

  3. Can Özmaden Aachen

    RWTH Aachen University

    Affiliation as printed

    RWTH Aachen University

  4. Affiliation as printed

    @JuliaComputing

  5. Affiliation as printed

    @JuliaComputing

Cited by 0 stored of 0

No patents citing this paper on Lens.org (checked 2026-10-06).

References 0