Files
galileo/docs/cboc_support.md
T

5.3 KiB

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

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

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 and Markdown report are produced by:

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.