Ejemplo n.º 1
0
/** 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);
}
Ejemplo n.º 2
0
/** 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);
}
Ejemplo n.º 3
0
/** 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));
}
Ejemplo n.º 4
0
/** 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);
}