/** Initialise a simple tracking loop. * * For a full description of the loop filter parameters, see calc_loop_gains(). * * \param s The tracking loop state struct to initialise. * \param code_freq The initial code phase rate (i.e. frequency). * \param code_bw The code tracking loop noise bandwidth. * \param code_zeta The code tracking loop damping ratio. * \param code_k The code tracking loop gain. * \param carr_freq The initial carrier frequency. * \param carr_bw The carrier tracking loop noise bandwidth. * \param carr_zeta The carrier tracking loop damping ratio. * \param carr_k The carrier tracking loop gain. */ void simple_tl_init(simple_tl_state_t *s, float loop_freq, float code_freq, float code_bw, float code_zeta, float code_k, float carr_freq, float carr_bw, float carr_zeta, float carr_k) { float b0, b1; calc_loop_gains(code_bw, code_zeta, code_k, loop_freq, &b0, &b1); s->code_freq = code_freq; simple_lf_init(&(s->code_filt), code_freq, b0, b1); calc_loop_gains(carr_bw, carr_zeta, carr_k, loop_freq, &b0, &b1); s->carr_freq = carr_freq; simple_lf_init(&(s->carr_filt), carr_freq, b0, b1); }
/** Initialise a simple tracking loop. * * For a full description of the loop filter parameters, see calc_loop_gains(). * * \param s The tracking loop state struct to initialise. * \param code_freq The initial code phase rate (i.e. frequency). * \param code_bw The code tracking loop noise bandwidth. * \param code_zeta The code tracking loop damping ratio. * \param code_k The code tracking loop gain. * \param carr_freq The initial carrier frequency. * \param carr_bw The carrier tracking loop noise bandwidth. * \param carr_zeta The carrier tracking loop damping ratio. * \param carr_k The carrier tracking loop gain. */ void simple_tl_init(simple_tl_state_t *s, float loop_freq, float code_freq, float code_bw, float code_zeta, float code_k, float carr_freq, float carr_bw, float carr_zeta, float carr_k) { float pgain, igain; calc_loop_gains(code_bw, code_zeta, code_k, loop_freq, &pgain, &igain); s->code_freq = code_freq; simple_lf_init(&(s->code_filt), code_freq, pgain, igain); calc_loop_gains(carr_bw, carr_zeta, carr_k, loop_freq, &pgain, &igain); s->carr_freq = carr_freq; simple_lf_init(&(s->carr_filt), carr_freq, pgain, igain); }
/** Initialise a code/carrier phase complimentary filter tracking loop. * * For a full description of the loop filter parameters, see calc_loop_gains(). * * This filter implements gain scheduling. Before `sched` iterations of the * loop filter the behaviour will be identical to the simple loop filter. After * `sched` iterations, carrier phase information will be used in the code * tracking loop. * * Note, this filter requires that the code and carrier frequencies are * expressed as a difference from the nominal frequncy (e.g. 1.023MHz nominal * GPS C/A code phase rate, 4.092MHz IF for the carrier). * * \param s The tracking loop state struct to initialise. * \param code_freq The initial code phase rate (i.e. frequency) difference * from nominal. * \param code_bw The code tracking loop noise bandwidth. * \param code_zeta The code tracking loop damping ratio. * \param code_k The code tracking loop gain. * \param carr_freq The initial carrier frequency difference from nominal, i.e. * Doppler shift. * \param carr_bw The carrier tracking loop noise bandwidth. * \param carr_zeta The carrier tracking loop damping ratio. * \param carr_k The carrier tracking loop gain. * \param tau The complimentary filter cross-over frequency. * \param cpc The number of carrier cycles per complete code, or equivalently * the ratio of the carrier frequency to the nominal code frequency. * \param sched The gain scheduling count. */ void comp_tl_init(comp_tl_state_t *s, float loop_freq, float code_freq, float code_bw, float code_zeta, float code_k, float carr_freq, float carr_bw, float carr_zeta, float carr_k, float tau, float cpc, u32 sched) { float b0, b1; calc_loop_gains(code_bw, code_zeta, code_k, loop_freq, &b0, &b1); s->code_freq = code_freq; simple_lf_init(&(s->code_filt), code_freq, b0, b1); calc_loop_gains(carr_bw, carr_zeta, carr_k, loop_freq, &b0, &b1); s->carr_freq = carr_freq; simple_lf_init(&(s->carr_filt), carr_freq, b0, b1); s->n = 0; s->sched = sched; s->carr_to_code = 1.f / cpc; s->A = 1.f - (1.f / (loop_freq * tau)); }
/** Initialise an aided tracking loop. * * For a full description of the loop filter parameters, see calc_loop_gains(). * * TODO, add carrier aiding to the code loop. * * \param s The tracking loop state struct to initialise. * \param code_freq The initial code phase rate (i.e. frequency). * \param code_bw The code tracking loop noise bandwidth. * \param code_zeta The code tracking loop damping ratio. * \param code_k The code tracking loop gain. * \param carr_freq The initial carrier frequency. * \param carr_bw The carrier tracking loop noise bandwidth. * \param carr_zeta The carrier tracking loop damping ratio. * \param carr_k The carrier tracking loop gain. */ void aided_tl_init(aided_tl_state_t *s, float loop_freq, float code_freq, float code_bw, float code_zeta, float code_k, float carr_freq, float carr_bw, float carr_zeta, float carr_k, float carr_freq_b1) { float b0, b1; s->carr_freq = carr_freq; s->prev_I = 1.0f; // This works, but is it a really good way to do it? s->prev_Q = 0.0f; calc_loop_gains(carr_bw, carr_zeta, carr_k, loop_freq, &b0, &b1); aided_lf_init(&(s->carr_filt), carr_freq, b0, b1, carr_freq_b1); calc_loop_gains(code_bw, code_zeta, code_k, loop_freq, &b0, &b1); s->code_freq = code_freq; simple_lf_init(&(s->code_filt), code_freq, b0, b1); }