115 lines
5.3 KiB
Markdown
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.
|