Example #1
0
  def __init__(self, params):
    """
    Initialize L2C tracking channel with L2C specific data.

    Parameters
    ----------
    params : dictionary
    L2C tracking initialization parameters

    """
    # Convert acquisition SNR to C/N0
    cn0_0 = 10 * np.log10(params['acq'].snr)
    cn0_0 += 10 * np.log10(defaults.L2C_CHANNEL_BANDWIDTH_HZ)
    params['cn0_0'] = cn0_0
    params['coherent_ms'] = 20
    params['coherent_iter'] = 1
    params['loop_filter_params'] = defaults.l2c_loop_filter_params
    params['lock_detect_params'] = defaults.l2c_lock_detect_params_20ms
    params['IF'] = params['samples'][gps_constants.L2C]['IF']
    params['prn_code'] = L2CMCodes[params['acq'].prn]
    params['code_freq_init'] = params['acq'].doppler * \
        gps_constants.l2c_chip_rate / gps_constants.l2
    params['chipping_rate'] = gps_constants.l2c_chip_rate

    TrackingChannel.__init__(self, params)

    self.cnav_msg = CNavMsg()
    self.cnav_msg_decoder = CNavMsgDecoder()
Example #2
0
class TrackingChannelL2C(TrackingChannel):
  """
  L2C tracking channel.
  """

  def __init__(self, params):
    """
    Initialize L2C tracking channel with L2C specific data.

    Parameters
    ----------
    params : dictionary
    L2C tracking initialization parameters

    """
    # Convert acquisition SNR to C/N0
    cn0_0 = 10 * np.log10(params['acq'].snr)
    cn0_0 += 10 * np.log10(defaults.L2C_CHANNEL_BANDWIDTH_HZ)
    params['cn0_0'] = cn0_0
    params['coherent_ms'] = 20
    params['coherent_iter'] = 1
    params['loop_filter_params'] = defaults.l2c_loop_filter_params
    params['lock_detect_params'] = defaults.l2c_lock_detect_params_20ms
    params['IF'] = params['samples'][gps_constants.L2C]['IF']
    params['prn_code'] = L2CMCodes[params['acq'].prn]
    params['code_freq_init'] = params['acq'].doppler * \
        gps_constants.l2c_chip_rate / gps_constants.l2
    params['chipping_rate'] = gps_constants.l2c_chip_rate

    TrackingChannel.__init__(self, params)

    self.cnav_msg = CNavMsg()
    self.cnav_msg_decoder = CNavMsgDecoder()

  def is_pickleable(self):
    """
    L2C tracking channel object is not pickleable due to complexity
    of serializing cnav_msg_decoder Cython object.

    out : bool
       False - the L2C tracking object is not pickleable
    """
    return False

  def _short_n_long_preprocess(self):
    if self.short_n_long:
      # When simulating short and long cycles, short step resets EPL
      # registers, and long one adds up to them
      if self.short_step:
        self.E = self.P = self.L = 0.j
        # L2C CM code is only half of the PRN code length.
        # The other half is CL code. Thus multiply by 2.
        self.code_chips_to_integrate = \
          int(2 * defaults.l2c_short_step_chips)
      else:
        # L2C CM code is only half of the PRN code length.
        # The other half is CL code. Thus multiply by 2.
        self.code_chips_to_integrate = \
          2 * gps_constants.l2_cm_chips_per_code - \
          self.code_chips_to_integrate + self.code_phase
      code_chips_to_integrate = self.code_chips_to_integrate
    else:
      self.E = self.P = self.L = 0.j
      code_chips_to_integrate = 2 * gps_constants.l2_cm_chips_per_code

    return self.coherent_iter, code_chips_to_integrate

  def _short_n_long_postprocess(self):
    more_integration_needed = False
    if self.short_n_long:
      if self.short_step:
        # In case of short step - go to next integration period
        self.short_step = False
        self.alias_detect.first(self.P.real, self.P.imag)
        more_integration_needed = True
      else:
        # Next step is short cycle
        self.short_step = True

    return more_integration_needed

  def _run_postprocess(self):
    """
    Run L2C coherent integration postprocessing.
    Runs navigation bit sync decoding operation.

    """

    symbol = 0xFF if np.real(self.P) >= 0 else 0x00
    res, delay = self.cnav_msg_decoder.decode(symbol, self.cnav_msg)
    if res:
      logger.debug("[PRN: %d (%s)] CNAV message decoded: "
                   "prn=%d msg_id=%d tow=%d alert=%d delay=%d" %
                   (self.prn + 1,
                    self.signal,
                    self.cnav_msg.getPrn(),
                    self.cnav_msg.getMsgId(),
                    self.cnav_msg.getTow(),
                    self.cnav_msg.getAlert(),
                    delay))
      tow = self.cnav_msg.getTow() * 6000 + delay * 20
      logger.debug("[PRN: %d (%s)] ToW %d" %
                   (self.prn + 1, self.signal, tow))
      self.track_result.tow[self.i] = tow
    else:
      self.track_result.tow[self.i] = self.track_result.tow[self.i - 1] + \
          self.coherent_ms