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()
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