Skip to content

Signal Architecture

bijux-gnss-signal owns reusable GNSS signal meaning and computation. It connects foundational identities and units to receiver-ready catalogs, codes, samples, replicas, spectra, and validation without owning a receiver session. Use this section to decide where signal behavior belongs and which boundary a change must preserve.

Architectural Route

flowchart LR
    core["core identities, units,<br/>samples, observations"]
    catalog["catalog and<br/>physical relationships"]
    codes["primary, secondary,<br/>and data-symbol codes"]
    samples["raw-IQ and<br/>sample contracts"]
    dsp["timing, replicas,<br/>spectra, loops"]
    validation["signal-level<br/>observation checks"]
    api["curated signal API"]
    consumers["receiver, navigation,<br/>infrastructure, tests"]

    core --> catalog
    core --> samples
    catalog --> codes --> dsp
    samples --> dsp
    catalog --> validation
    core --> validation
    catalog --> api
    codes --> api
    samples --> api
    dsp --> api
    validation --> api --> consumers

The curated signal API is the supported downstream surface. Source placement helps maintainers find an implementation; it does not grant stability to private modules.

Find the Owning Region

Reader question Start here Expected owner
Which signals, bands, components, frequencies, or wavelengths are supported? Catalog architecture catalog
How is a primary, secondary, or data-symbol sequence generated and sampled? Code-family architecture constellation code family
How are raw bytes described, normalized, or quantized? Raw-IQ contract and sample conversion raw-IQ metadata and sample conversion
How are phase, timing, replicas, front-end response, spectra, and tracking math computed? DSP architecture reusable DSP primitive
Which observation pairs or epoch structures are signal-compatible? Signal validation observation validation
Should a behavior be a trait or a free function? Trait contracts public integration seam only when polymorphism is required
Which crate should own a cross-package behavior? Signal boundary lowest crate that can express it without higher-level policy

Computation Versus Orchestration

The boundary is not “state is forbidden.” An NCO must retain phase, a front-end FIR filter must retain its delay line, and a tracking-adaptation primitive can retain the values needed for its next deterministic update. Those remain signal-owned when the caller decides when and why to advance them.

flowchart TD
    behavior["candidate behavior"]
    meaning{"defines reusable signal<br/>meaning or math?"}
    context{"needs one receiver session,<br/>channel history, or scheduling?"}
    evidence{"chooses operational outcome<br/>or persists evidence?"}
    signal["signal primitive"]
    receiver["receiver orchestration"]
    infra["infrastructure persistence"]

    behavior --> meaning
    meaning -- no --> context
    meaning -- yes --> context
    context -- no --> signal
    context -- yes --> receiver
    receiver --> evidence
    evidence -- repository layout --> infra
    evidence -- runtime decision --> receiver

Signal owns a computation when its inputs state all physical context and its result is reusable outside one run. Receiver owns work selection, channel coordination, lock lifecycle, retries, and session evidence. Infrastructure owns capture discovery, run layout, and persisted repository records. Navigation owns orbit, correction, estimation, integrity, PPP, and RTK meaning.

Architectural Invariants

Explicit physical context

Sample rate, code rate, carrier frequency, signal identity, component role, phase origin, time basis, units, and GLONASS frequency channel must be explicit where they affect a result. A generic helper must not erase a constellation-specific requirement.

Chunk-independent continuity

Code and carrier generation over adjacent blocks must agree with generation over the joined interval within the documented numerical tolerance. APIs that evolve phase need an absolute sample/time origin or state whose update rule preserves that invariant.

Deterministic reference behavior

Catalog lookup, code generation, assignment tables, quantization, and DSP helpers must produce deterministic results for the same declared inputs. Reference tests should compare against independent data or separately expressed models, not production output copied into a fixture.

Curated exposure

A new public export needs durable downstream use, units and validity, error behavior, and proof at the first affected consumer. Public exposure is not a substitute for choosing an owner.

Effect ownership

Signal traits describe minimal source, sink, and correlator needs. Implementing crates own file, device, network, buffering, retry, and lifecycle effects. Add a trait method only when every implementation should support the same durable operation.

Choose the Detailed Guide

If the change concerns Read
package ownership and exclusions Boundary and dependency direction
source organization Module map and code navigation
stateful computational behavior Execution model and state and persistence
package handoffs Integration seams
error categories and refusal Signal error model
adding a signal family or DSP capability Extensibility model
known structural hazards Architecture risks

The full architecture guide defines the package-level flow, and the signal proof inventory maps each region to its verification families.