016c (3/3): Galileo E1-B/E1-C memory codes + CBOC(6,1,1/11) generator, gal_e1bc Tier-1 flip #24

Merged
ykp merged 1 commit from feat/016c3-e1-cboc into main 2026-09-24 10:12:01 +02:00
Owner

Final increment of backlog step 016c, stacked on merged 016c-1/2 (PR #22)
and 016c-2/2 (PR #23). Completes the Galileo line except full AltBOC.

Data provenance (important): the E1-B/E1-C primary codes are optimised
MEMORY codes - the OS SIS ICD (v2.1 and v2.2 alike) states they are provided
ONLY in the electronic Annex C, which is distributed via the GSC PRN-assignment
process and is not publicly fetchable (candidate URLs 404). The complete
tables (50 PRNs x 2 components x 4092 chips, hex) are therefore taken from
gnss-sdr (src/core/system_parameters/Galileo_E1.h), whose E1 replicas have
been validated against live Galileo signals for a decade. Consistency check
against the ICD: gnss-sdr's GALILEO_E1_C_SECONDARY_CODE reproduces the ICD's
published CS25_1 binary example bit-for-bit. Source and rationale documented
in codes.py.

Implementation

  • codes.py: GAL_E1_CODES (100 hex memory codes), galileo_e1_code(prn, 'b'|'c'),
    galileo_e1c_secondary() (CS25_1, 25 chips)
  • generator.py: gal_e1bc data_mode 'e1' - BOTH components IN PHASE (the CBOC
    composite is real): E1-B on (asc_a + bsc_b), E1-C x CS25_1 on
    (asc_a - bsc_b), a = sqrt(10/11), b = sqrt(1/11); E1B:E1C = 1:1
  • signals.py: gal_e1bc flipped to Tier 1
  • harness.py: E1 data replica carries the CBOC-positive subcarrier branch
  • README Tier-1 matrix refreshed

Tests (7): E1-B PRN-1 chips from the baked hex, table well-formedness
(50 PRNs x 4092 chips per component, B != C), unknown-PRN/component errors,
CS25_1 vs the ICD example, CBOC data/pilot recovery at amp/sqrt(2), 50/50
power split, end-to-end harness acquisition at a 3.5 ms delay.

016c status after this PR: Galileo E1 + E5 COMPLETE (Tier 1).
Remaining from 016c: GLONASS CDMA (ICD appendices 403-gated - documented
as infeasible from public sources) and full AltBOC(15,10) (deferred;
registry stays QPSK(10) SSB). GPS L1C (TMBOC, IS-GPS-800) also remains
deferred from 016b.

Local verification: pytest 180 passed + 1 gui skip, ruff clean (Python 3.14).

Note (process): NOT to be merged by automation - awaiting manual review/merge.

Final increment of backlog step 016c, stacked on merged 016c-1/2 (PR #22) and 016c-2/2 (PR #23). Completes the Galileo line except full AltBOC. **Data provenance (important):** the E1-B/E1-C primary codes are optimised MEMORY codes - the OS SIS ICD (v2.1 and v2.2 alike) states they are provided ONLY in the electronic Annex C, which is distributed via the GSC PRN-assignment process and is not publicly fetchable (candidate URLs 404). The complete tables (50 PRNs x 2 components x 4092 chips, hex) are therefore taken from gnss-sdr (src/core/system_parameters/Galileo_E1.h), whose E1 replicas have been validated against live Galileo signals for a decade. Consistency check against the ICD: gnss-sdr's GALILEO_E1_C_SECONDARY_CODE reproduces the ICD's published CS25_1 binary example bit-for-bit. Source and rationale documented in codes.py. **Implementation** - codes.py: GAL_E1_CODES (100 hex memory codes), galileo_e1_code(prn, 'b'|'c'), galileo_e1c_secondary() (CS25_1, 25 chips) - generator.py: gal_e1bc data_mode 'e1' - BOTH components IN PHASE (the CBOC composite is real): E1-B on (a*sc_a + b*sc_b), E1-C x CS25_1 on (a*sc_a - b*sc_b), a = sqrt(10/11), b = sqrt(1/11); E1B:E1C = 1:1 - signals.py: gal_e1bc flipped to Tier 1 - harness.py: E1 data replica carries the CBOC-positive subcarrier branch - README Tier-1 matrix refreshed **Tests** (7): E1-B PRN-1 chips from the baked hex, table well-formedness (50 PRNs x 4092 chips per component, B != C), unknown-PRN/component errors, CS25_1 vs the ICD example, CBOC data/pilot recovery at amp/sqrt(2), 50/50 power split, end-to-end harness acquisition at a 3.5 ms delay. **016c status after this PR:** Galileo E1 + E5 COMPLETE (Tier 1). Remaining from 016c: GLONASS CDMA (ICD appendices 403-gated - documented as infeasible from public sources) and full AltBOC(15,10) (deferred; registry stays QPSK(10) SSB). GPS L1C (TMBOC, IS-GPS-800) also remains deferred from 016b. Local verification: pytest 180 passed + 1 gui skip, ruff clean (Python 3.14). Note (process): NOT to be merged by automation - awaiting manual review/merge.
016c-3/3(core): Galileo E1-B/E1-C memory codes (gnss-sdr-provenanced) + CBOC(6,1,1/11) in-phase composite, tier flip
All checks were successful
ci / test (3.12) (push) Successful in 1m15s
ci / test (3.14) (push) Successful in 1m21s
ci / test (3.14) (pull_request) Successful in 3m46s
ci / test (3.12) (pull_request) Successful in 3m59s
d7c5a50726
ykp merged commit 6ba2f4b3c9 into main 2026-09-24 10:12:01 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
ykp/gengnss!24
No description provided.