3.7 KiB
Algorithms and conventions
Signal and downconversion
The analytic sampled signal uses
[ x[n]=A,c(\tau_n)b(\tau_n)s_{BOC}(\tau_n) e^{j(\phi_0+2\pi(f_{IF}+f_D)n/f_s+\pi\dot f_D(n/f_s)^2)}+w[n]. ]
The generator defines a positive Doppler as positive complex phase rotation. Digital downconversion and a candidate Doppler wipeoff therefore use
[ y[n]=x[n]e^{-j2\pi(f_{IF}+f_{bin})n/f_s}. ]
The phase-accumulator NCO has modulus (2^P), frequency-control word (FCW=\operatorname{round}(f_o2^P/f_s)), and update (phase_{n+1}=(phase_n+FCW)\bmod 2^P).
Code and FFT acquisition
Fractional code phase advances by (f_c/f_s) chips per sample and indexes the
chip with floor(phase) mod code_length. The BOC(1,1) sine-phased square wave
is +1 for the first half of a chip and -1 for the second half. This convention
is shared by generation, acquisition, and tracking.
The circular correlation is
[ R_f[k]=\operatorname{IFFT}{\operatorname{FFT}(y_f[n]) \operatorname{FFT}(c[n])^*}[k]. ]
For coherent interval (T_c), the complex correlator output is retained before power formation. Noncoherent accumulation is explicitly
[ P_f[k]=\sum_{m=0}^{M-1}|R_{f,m}[k]|^2, \quad T_{obs}=M T_c. ]
Differential combining uses adjacent complex results before magnitude. E1B hypothesis mode enumerates primary-epoch signs (limited to eight periods to bound exponential work). E1C search enumerates secondary phase; known-phase wipeoff uses phase zero at the first observation epoch. Delay results are reported over one 4 ms primary period even for longer coherent integrations.
Zero-padding can provide a convenient FFT size or a denser interpolation of a particular numerical representation, but it does not increase signal bandwidth, physical information, or fundamental delay resolution.
Detection
After circularly excluding a guard interval around the main peak, the model computes
[ M_2=P_{max}/P_{second},\qquad M_\mu=P_{max}/\bar P_N, ]
plus (peak-noise_mean)/(sidelobe-noise_mean) and a CFAR-style
(peak-noise_median)/noise_std. The acquisition C/N0 diagnostic is
[ \widehat{C/N_0}=10\log_{10}\left((P_{max}-P_N)/(P_NT_c)\right). ]
It is an estimator, not a calibrated RF measurement. Half-chip competitive BOC
neighbors set a side-peak flag. flag is the implemented mitigation; an
unambiguous BOC/CBOC strategy plugs into the detector without changing results.
Parabolic interpolation preserves raw Doppler and sample bins.
Tracking
Each component channel owns carrier/code NCO phase, loop states, correlation history, lock counters, C/N0 history, and state-machine state. Phases advance at every accepted sample and never reset on Python block boundaries.
Carrier discriminators are
[ e_{PLL,2}=\tan^{-1}(Q/I),\qquad e_{PLL,4}=\operatorname{atan2}(Q,I) ]
in radians. The cross/phase-difference FLL is
[ e_{FLL}=\angle(P_kP_{k-1}^*)/(2\pi T)\quad[Hz]. ]
The normalized envelope DLL reports a locally calibrated chip error
[ e_{DLL}=d\frac{|E|-|L|}{|E|+|L|}\quad[chips], ]
with power and dot-product alternatives. A BOC false-lock flag compares VEVL and prompt magnitudes.
For a second-order filter, noise bandwidth and damping generate
[ \omega_n=\frac{8\zeta B_n}{4\zeta^2+1},\quad k_p=2\zeta\omega_n,\quad k_i=\omega_n^2. ]
The third-order starting model places three repeated stable poles derived from the same (\omega_n): correction (3\omega_ne+3\omega_n^2\int e+\omega_n^3\iint e). These are physical starting coefficients, not final optimized receiver-loop values.
Carrier NCO frequency is corrected in hertz; code NCO frequency is nominal code rate plus DLL correction and optional carrier aiding (f_{code,aid}=f_{carrier}f_c/f_{RF}). Prompt C/N0 uses coherent versus total prompt moments over a sliding window and divides the ratio by integration time.