Files
galileo/docs/cboc_support.md

115 lines
5.3 KiB
Markdown

# Galileo E1 CBOC support
## Definition and convention
The implementation follows *Galileo Open Service Signal-in-Space Interface
Control Document*, Issue 2.2 (November 2025), section 2.3.3, Table 10 and
equation (12). With sine-phased square subcarriers
```text
sc_n(t) = sgn(sin(2 pi n R_c t)), R_c = 1.023 MHz
alpha = sqrt(10/11)
beta = sqrt(1/11)
```
the complete transmitted multiplex and its component replicas are
```text
s_E1(t) = (1/sqrt(2)) {
e_E1B(t) [alpha sc_1(t) + beta sc_6(t)]
- e_E1C(t) [alpha sc_1(t) - beta sc_6(t)]
}
CBOC_E1B(t) = alpha sc_1(t) + beta sc_6(t)
CBOC_E1C(t) = alpha sc_1(t) - beta sc_6(t)
```
The complete transmitted E1 equation contains a common `1/sqrt(2)` power split
and an additional outer minus sign on the E1C component. The outer sign is a
constant carrier-phase ambiguity for an individual component receiver; it is
not folded into the internal CBOC(-) weighting above. E1B and E1C occupy the
same RF carrier and are not modeled as independent RF I/Q branches.
At an exact subcarrier transition, the discrete convention selects the new
half-cycle (`+1` at integer phase, `-1` at half-integer phase). A `1e-12`-cycle
boundary tolerance makes vector and arbitrarily chunked float64 phase
accumulators deterministic.
## Architecture boundaries
- Acquisition PRN/subcarrier replica: `signals/galileo_e1.py`, called and FFT
cached by `acquisition/fft_pcps.py`.
- Acquisition carrier wipeoff: `fft_pcps.py`; it remains
`input * exp(-j 2 pi (IF + Doppler) n/Fs)` and is independent of modulation.
- Tracking replicas: `tracking/correlator.py`; one reusable bank creates
VE/E/P/L/VL replicas for either modulation.
- Tracking carrier wipeoff and coherent sums: `CorrelatorBank.correlate_with_phases`.
- Physical parameters: `RfConfig` owns sampling rate and IF, `SignalProfile`
owns carrier/code rates, and `AcquisitionConfig`/`TrackingConfig` own the
explicit modulation choice.
The tracking correlator carries independent float64 state for carrier phase,
code phase, BOC(1,1) phase, and BOC(6,1) phase. The subcarrier frequency words
follow the code-NCO frequency. The E1C pilot-aided E1B class shares those phase
vectors between its pilot and data correlator branches; only E1B Prompt I/Q is
sent to I/NAV recovery.
## Full-band generator
`FullBandE1SignalGenerator` defaults to 65.472 Msps internal generation, a
129-tap Kaiser-window FIR with 12 MHz one-sided bandwidth, and integer
decimation to 32.736 Msps. Filter coefficients, bandwidth, tap count, and
oversampling are configurable. Its complex FIR state and all carrier/code
states persist between calls. The causal FIR group delay is included in
`GenerationTruth`; simulator truth is used only after receiver processing.
This is intentionally distinct from SignalSim commit
`80b262113e77c4482ca9f5cbfef9bcada402ed28`, whose Galileo E1 vector is a
BOC(1,1) approximation and remains labeled only as BOC(1,1) validation.
## Measured 32.736 Msps matrix
The checked-in [JSON report](../reports/cboc_validation_report.json) and
[Markdown report](../reports/cboc_validation_report.md) are produced by:
```bash
python tools/run_cboc_validation.py --output-dir reports --duration-s 0.30
```
All three cases acquired the correct 1250 Hz Doppler and 81.25-chip filtered
delay, synchronized the E1C secondary code with correlation above 0.9997 and
zero sign errors, and ended with carrier and code lock. No cycle slips,
discontinuities, or side-peak indications occurred.
Using a BOC11 replica on the CBOC vector reduced acquisition peak power by
0.317 dB relative to the matched CBOC replica. It produced no measurable delay
bias at the 1/32-chip acquisition grid. Tail code biases were -0.00085 chips
(compatibility) and -0.00087 chips (matched). The existing lock thresholds were
not changed: all modes had the same 184 ms confirmed-lock interval after the
configured 25-epoch smoother and three-epoch confirmation delay.
The matched CBOC DLL discriminator RMS was 0.0527 chips versus 0.0351 chips in
compatibility mode for this short run. The NCO state and code bias remained
bounded, so this is recorded as a correlator-shape/discriminator calibration
observation, not silently corrected by threshold or loop retuning.
For the configured 55 dB-Hz source, the existing moment estimator reported
47.88 dB-Hz for filtered BOC11 and approximately 42.31 dB-Hz for both CBOC
receiver modes. Since matched and compatibility CBOC estimates agree while
their lock/NCO states remain stable, this is retained as a front-end/CBOC C/N0
calibration limitation rather than used to retune the loops or lock thresholds.
The matched CBOC tail main-peak fraction remained above 0.915, its side-peak
metric below 0.045, and it produced no side-peak flags.
## Limitations
- The focused CBOC matrix uses deterministic synthetic codes, not fabricated
Galileo code tables, and E1C pilot only. E1B page count is therefore reported
as not enabled. Official-code BOC11 E1B I/NAV/ephemeris coverage remains the
independent SignalSim regression.
- The generator models a configurable linear front-end FIR, AWGN, Doppler,
code Doppler, clipping, and I/Q quantization. It does not yet model analog
group-delay ripple, oscillator phase noise, multipath, or interference.
- No unambiguous CBOC acquisition discriminator is claimed. Side-peak
monitoring remains explicit.