/*! * \file gps_l1_ca_dll_pll_tracking_cc.cc * \brief code DLL + carrier PLL * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com * Javier Arribas, 2011. jarribas(at)cttc.es * * Code DLL + carrier PLL according to the algorithms described in [1] * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach, Birkha user, 2007 * * ------------------------------------------------------------------------- * * Copyright (C) 2010-2011 (see AUTHORS file for a list of contributors) * * GNSS-SDR is a software defined Global Navigation * Satellite Systems receiver * * This file is part of GNSS-SDR. * * GNSS-SDR is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * GNSS-SDR is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNSS-SDR. If not, see . * * ------------------------------------------------------------------------- */ #include "gps_l1_ca_dll_pll_tracking_cc.h" #include "gps_sdr_signal_processing.h" #include "tracking_discriminators.h" #include "CN_estimators.h" #include "GPS_L1_CA.h" #ifdef GNSS_SDR_USE_BOOST_ROUND #include #endif #include "control_message_factory.h" #include #include #include #include #include "math.h" #include #include #include /*! * \todo Include in definition header file */ #define CN0_ESTIMATION_SAMPLES 10 #define MINIMUM_VALID_CN0 25 #define MAXIMUM_LOCK_FAIL_COUNTER 200 using google::LogMessage; gps_l1_ca_dll_pll_tracking_cc_sptr gps_l1_ca_dll_pll_make_tracking_cc(unsigned int satellite, long if_freq, long fs_in, unsigned int vector_length, gr_msg_queue_sptr queue, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) { return gps_l1_ca_dll_pll_tracking_cc_sptr(new gps_l1_ca_dll_pll_tracking_cc(satellite, if_freq, fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); } void gps_l1_ca_dll_pll_tracking_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required){ ninput_items_required[0] =(int)d_vector_length*2; //set the required available samples in each call } gps_l1_ca_dll_pll_tracking_cc::gps_l1_ca_dll_pll_tracking_cc(unsigned int satellite, long if_freq, long fs_in, unsigned int vector_length, gr_msg_queue_sptr queue, bool dump, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, float early_late_space_chips) : gr_block ("gps_l1_ca_dll_pll_tracking_cc", gr_make_io_signature (1, 1, sizeof(gr_complex)), gr_make_io_signature(5, 5, sizeof(double))) { //gr_sync_decimator ("gps_l1_ca_dll_pll_tracking_cc", gr_make_io_signature (1, 1, sizeof(gr_complex)), // gr_make_io_signature(3, 3, sizeof(float)),vector_length) { // initialize internal vars d_queue = queue; d_dump = dump; d_satellite = satellite; d_if_freq = if_freq; d_fs_in = fs_in; d_vector_length = vector_length; d_dump_filename =dump_filename; // Initialize tracking ========================================== d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_PLL_BW(pll_bw_hz); //--- DLL variables -------------------------------------------------------- d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) // Initialization of local code replica // Get space for a vector with the C/A code replica sampled 1x/chip d_ca_code=new gr_complex[(int)GPS_L1_CA_CODE_LENGTH_CHIPS+2]; // Get space for the resampled early / prompt / late local replicas d_early_code= new gr_complex[d_vector_length*2]; d_prompt_code=new gr_complex[d_vector_length*2]; d_late_code=new gr_complex[d_vector_length*2]; // space for carrier wipeoff and signal baseband vectors d_carr_sign=new gr_complex[d_vector_length*2]; //--- Perform initializations ------------------------------ // define initial code frequency basis of NCO d_code_freq_hz = GPS_L1_CA_CODE_RATE_HZ; // define residual code phase (in chips) d_rem_code_phase_samples = 0.0; // define residual carrier phase d_rem_carr_phase_rad = 0.0; // sample synchronization d_sample_counter=0; d_sample_counter_seconds=0; d_acq_sample_stamp=0; d_enable_tracking=false; d_pull_in=false; d_last_seg=0; d_current_prn_length_samples=(int)d_vector_length; // CN0 estimation and lock detector buffers d_cn0_estimation_counter=0; d_Prompt_buffer=new gr_complex[CN0_ESTIMATION_SAMPLES]; d_carrier_lock_test=1; d_CN0_SNV_dB_Hz=0; d_carrier_lock_fail_counter=0; d_carrier_lock_threshold=5; } void gps_l1_ca_dll_pll_tracking_cc::start_tracking(){ /*! * correct the code phase according to the delay between acq and trk */ unsigned long int acq_trk_diff_samples; float acq_trk_diff_seconds; acq_trk_diff_samples=d_sample_counter-d_acq_sample_stamp;//-d_vector_length; std::cout<<"acq_trk_diff_samples="<d_satellite<< std::endl; DLOG(INFO) << "Start tracking for satellite "<d_satellite<<" received "; // enable tracking d_pull_in=true; d_enable_tracking=true; std::cout<<"PULL-IN Doppler [Hz]= "<MINIMUM_VALID_CN0) { d_carrier_lock_fail_counter++; }else{ if (d_carrier_lock_fail_counter>0) d_carrier_lock_fail_counter--; } if (d_carrier_lock_fail_counter>MAXIMUM_LOCK_FAIL_COUNTER) { std::cout<<"Channel "<push(tracking_message); d_carrier_lock_fail_counter=0; d_enable_tracking=false; // TODO: check if disabling tracking is consistent with the channel state machine } //std::cout<<"d_carrier_lock_fail_counter"<(d_channel)); d_dump_filename.append(".dat"); d_dump_file.exceptions ( std::ifstream::failbit | std::ifstream::badbit ); d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); std::cout<<"Tracking dump enabled on channel "< *channel_internal_queue) { d_channel_internal_queue = channel_internal_queue; }