Initial Galileo receiver and SignalSim integration

This commit is contained in:
2026-07-30 23:26:03 +03:00
commit 2a6ccfc23d
153 changed files with 8080 additions and 0 deletions
+126
View File
@@ -0,0 +1,126 @@
# Galileo receiver baseband model
This repository is a modular Python reference model for a Galileo receiver
baseband and a starting point for bit-true/RTL verification. It currently
implements E1B data and E1C pilot processing with a BOC(1,1) local replica,
streaming real-IF or complex-IQ front ends, FFT PCPS acquisition, independent
tracking channels, fixed-point boundary models, and hardware sizing models.
The floating reference uses `numpy.float64`/`numpy.complex128` throughout;
single-precision formats are accepted only when explicitly reading legacy files.
The repository intentionally contains **no fabricated Galileo PRN sequences**.
`SyntheticCodeProvider` creates deterministic non-ICD codes for closed-loop
verification. These codes cannot receive a live Galileo signal. Validated
official tables can be installed under `data/` and loaded through
`FileCodeProvider` without changing acquisition or tracking APIs.
An external `globsky/SignalSim` checkout is now validated as a second code and
sample source. `SignalSimCodeProvider` parses that checkout at run time without
copying its tables. The installed commit generates combined E1B/E1C BOC(1,1)
complex IQ; both acquisition and tracking pass on its IQ8 output. See the
[measured SignalSim integration report](docs/signalsim_integration.md).
## Status and limitations
- E1 profile: 1.023 Mcps, 4092 chips, 4 ms, 1575.42 MHz.
- BOC(1,1) is implemented; CBOC and unambiguous BOC are API extension points.
- E1B bit-transition hypotheses and E1C secondary wipeoff/search are available
for acquisition. E1C tracking supports known-phase wipeoff.
- The code-table provider, not the DSP engine, determines whether codes are
synthetic or official.
- The floating-point model is executable. The fixed PCPS model is bit-true at
I/O, FFT output, product, power, and accumulator boundaries; an FFT
vendor/butterfly schedule must be selected before claiming bit identity with
a particular RTL FFT core.
- Channel impairments include Doppler rate, sampling-clock offset, carrier
offset, AWGN, clipping, and quantization. Multipath, jerk, oscillator phase
noise, and interference are future channel-model plug-ins.
- Combined E1B/E1C tracking is represented by separate manager channels; a
weighted combining policy is intentionally not assumed.
## Install and test
Python 3.11 or newer is required.
```bash
python -m pip install -e '.[test]'
python -m pytest
```
All automated tests use deterministic seeds and run headlessly. Plots import
Matplotlib only when explicitly requested.
## Configuration and CLI
YAML keys map to strict dataclasses in `galileo_rx.config`; unknown keys and
unsafe long integrations raise descriptive errors. Physical quantities carry
unit suffixes. See [configuration details](docs/configuration.md).
```bash
python -m galileo_rx.cli generate --config configs/acquisition_example.yaml --output samples.bin
python -m galileo_rx.cli acquire --config configs/acquisition_example.yaml --input samples.bin --output acquisition.json
python -m galileo_rx.cli track --config configs/tracking_example.yaml --input samples.bin --acquisition-result acquisition.json --output tracking.csv
python -m galileo_rx.cli run --config configs/acquisition_example.yaml --input samples.bin
python -m galileo_rx.cli compare-fixed --config configs/acquisition_example.yaml --input samples.bin
python -m galileo_rx.cli validate-signalsim --signalsim-path signalsim/SignalSim --config configs/signalsim_validation.yaml --output-dir reports/signalsim_validation
```
The CLI uses synthetic codes by design. Replace the provider with
`FileCodeProvider` after installing independently validated tables for live
signal work.
`validate-signalsim` is the exception: it explicitly uses the detected external
SignalSim table and IQ conventions and writes quantitative JSON/Markdown/plot
artifacts. Its quick regression is:
```bash
MPLBACKEND=Agg pytest -m signalsim -v
```
Runnable source examples are in `examples/`:
```bash
python examples/generate_e1_signal.py
python examples/run_acquisition.py
python examples/run_tracking.py
python examples/run_complete_receiver.py
```
## Architecture
The generic acquisition and tracking engines depend on `SignalProfile` and
`CodeProvider`, not E1 constants. Adding E5a/E5b therefore means defining a
profile, modulation replica, and validated code provider; engine interfaces do
not change.
```text
sample source -> streaming front end -> sample buffer -> PCPS acquisition
| |
+---- tracking manager
+-- E1B channel
+-- E1C channel
float blocks <-> fixed block boundaries <-> cycle transactions <-> RTL
```
The floating algorithms and equations are in [algorithms.md](docs/algorithms.md),
fixed-point assumptions and starting widths in
[fixed_point_plan.md](docs/fixed_point_plan.md), and the two acquisition plus two
tracking hardware options in [rtl_mapping.md](docs/rtl_mapping.md). The
module-level contract is duplicated close to the code in
`src/galileo_rx/rtl_model/architecture.md`.
Exact phase-gate test and example commands are recorded in
[development_phases.md](docs/development_phases.md).
## Phase completion record
1. Profiles, typed configuration, code providers, BOC, generator, and I/O.
2. Streaming front end, FFT PCPS, detector metrics, long integration, plots.
3. Stateful EPL/VEVL tracking, FLL/PLL/DLL, locks, C/N0.
4. Multi-channel manager and separate E1B/E1C handling.
5. Fixed formats, NCO, mixer/correlator, PCPS boundary model, comparison/sweep.
6. Cycle transaction types, scheduler/resource equations, RTL documentation.
Assumptions and unresolved implementation choices are called out in the linked
documents rather than hidden in constants.