mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 07:13:03 +00:00 
			
		
		
		
	Galileo E1b/c tracking improvement and code cleaning
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@255 64b25241-fba3-4117-9849-534c7e92360d
This commit is contained in:
		| @@ -7,7 +7,7 @@ | ||||
|  | ||||
| ;######### GLOBAL OPTIONS ################## | ||||
| ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. | ||||
| GNSS-SDR.internal_fs_hz=8000000 | ||||
| GNSS-SDR.internal_fs_hz=4000000 | ||||
|  | ||||
| ;######### CONTROL_THREAD CONFIG ############ | ||||
| ControlThread.wait_for_flowgraph=false | ||||
| @@ -17,13 +17,13 @@ ControlThread.wait_for_flowgraph=false | ||||
| SignalSource.implementation=File_Signal_Source | ||||
|  | ||||
| ;#filename: path to file with the captured GNSS signal samples to be processed | ||||
| SignalSource.filename=/media/DATA/Proyectos/Signals/cttc_2012_07_26/cp_cttc_2012_07_26_n6_8Msps.dat | ||||
| SignalSource.filename=/media/DATALOGGER_/signals/CTTC captures/cp_cttc_1_galileo_4Msps.dat | ||||
|  | ||||
| ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. | ||||
| SignalSource.item_type=gr_complex | ||||
|  | ||||
| ;#sampling_frequency: Original Signal sampling frequency in [Hz]  | ||||
| SignalSource.sampling_frequency=8000000 | ||||
| SignalSource.sampling_frequency=4000000 | ||||
|  | ||||
| ;#freq: RF front-end center frequency in [Hz]  | ||||
| SignalSource.freq=1575420000 | ||||
| @@ -157,7 +157,7 @@ Resampler.dump_filename=../data/resampler.dat | ||||
| Resampler.item_type=gr_complex | ||||
|  | ||||
| ;#sample_freq_in: the sample frequency of the input signal | ||||
| Resampler.sample_freq_in=8000000 | ||||
| Resampler.sample_freq_in=4000000 | ||||
|  | ||||
| ;#sample_freq_out: the desired sample frequency of the output signal | ||||
| Resampler.sample_freq_out=2000000 | ||||
| @@ -165,7 +165,7 @@ Resampler.sample_freq_out=2000000 | ||||
|  | ||||
| ;######### CHANNELS GLOBAL CONFIG ############ | ||||
| ;#count: Number of available satellite channels. | ||||
| Channels.count=2 | ||||
| Channels.count=1 | ||||
| ;#in_acquisition: Number of channels simultaneously acquiring | ||||
| Channels.in_acquisition=1 | ||||
|  | ||||
| @@ -234,14 +234,14 @@ Channel0.system=Galileo | ||||
| Channel0.signal=1B | ||||
|  | ||||
| ;#satellite: Satellite PRN ID for this channel. Disable this option to random search | ||||
| Channel0.satellite=11 | ||||
| Channel0.satellite=12 | ||||
| Channel0.repeat_satellite=true | ||||
|  | ||||
| ;######### CHANNEL 1 CONFIG ############ | ||||
|  | ||||
| Channel1.system=Galileo | ||||
| Channel1.signal=1B | ||||
| Channel1.satellite=12 | ||||
| Channel1.satellite=11 | ||||
| Channel1.repeat_satellite=true | ||||
|  | ||||
| ;######### CHANNEL 2 CONFIG ############ | ||||
| @@ -251,41 +251,6 @@ Channel2.signal=1C | ||||
| ;Channel2.satellite=16 | ||||
| Channel2.repeat_satellite=false | ||||
|  | ||||
| ;######### CHANNEL 3 CONFIG ############ | ||||
|  | ||||
| Channel3.system=GPS | ||||
| Channel3.signal=1C | ||||
| ;Channel3.satellite=21 | ||||
| Channel3.repeat_satellite=false | ||||
|  | ||||
| ;######### CHANNEL 4 CONFIG ############ | ||||
|  | ||||
| Channel4.system=GPS | ||||
| Channel4.signal=1C | ||||
| ;Channel4.satellite=3 | ||||
| Channel4.repeat_satellite=false | ||||
|  | ||||
| ;######### CHANNEL 5 CONFIG ############ | ||||
|  | ||||
| Channel5.system=GPS | ||||
| Channel5.signal=1C | ||||
| ;Channel5.satellite=21 | ||||
| ;Channel5.repeat_satellite=false | ||||
|  | ||||
| ;######### CHANNEL 6 CONFIG ############ | ||||
|  | ||||
| Channel6.system=GPS | ||||
| Channel6.signal=1C | ||||
| ;Channel6.satellite=21 | ||||
| ;Channel6.repeat_satellite=false | ||||
|  | ||||
| ;######### CHANNEL 7 CONFIG ############ | ||||
|  | ||||
| Channel7.system=GPS | ||||
| Channel7.signal=1C | ||||
| ;Channel7.satellite=21 | ||||
| ;Channel7.repeat_satellite=false | ||||
|  | ||||
| ;######### ACQUISITION GLOBAL CONFIG ############ | ||||
|  | ||||
| ;#dump: Enable or disable the acquisition internal data file logging [true] or [false]  | ||||
| @@ -305,7 +270,7 @@ Acquisition.sampled_ms=4 | ||||
| ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] | ||||
| Acquisition0.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition | ||||
| ;#threshold: Acquisition threshold | ||||
| Acquisition0.threshold=50 | ||||
| Acquisition0.threshold=70 | ||||
| ;#doppler_max: Maximum expected Doppler shift [Hz] | ||||
| Acquisition0.doppler_max=10000 | ||||
| ;#doppler_max: Doppler step in the grid search [Hz] | ||||
| @@ -315,7 +280,7 @@ Acquisition0.cboc=true | ||||
|  | ||||
| ;######### ACQUISITION CH 1 CONFIG ############ | ||||
| Acquisition1.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition | ||||
| Acquisition1.threshold=50 | ||||
| Acquisition1.threshold=70 | ||||
| Acquisition1.doppler_max=10000 | ||||
| Acquisition1.doppler_step=125 | ||||
| Acquisition1.cboc=true | ||||
| @@ -388,7 +353,7 @@ Tracking.dump=true | ||||
| Tracking.dump_filename=../data/veml_tracking_ch_ | ||||
|  | ||||
| ;#pll_bw_hz: PLL loop filter bandwidth [Hz] | ||||
| Tracking.pll_bw_hz=30.0; | ||||
| Tracking.pll_bw_hz=15.0; | ||||
|  | ||||
| ;#dll_bw_hz: DLL loop filter bandwidth [Hz] | ||||
| Tracking.dll_bw_hz=2.0; | ||||
|   | ||||
| @@ -79,16 +79,12 @@ galileo_e1_dll_pll_veml_make_tracking_cc( | ||||
|             fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips, very_early_late_space_chips)); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void galileo_e1_dll_pll_veml_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 | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( | ||||
|         long if_freq, | ||||
|         long fs_in, | ||||
| @@ -112,8 +108,8 @@ galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( | ||||
|     d_fs_in = fs_in; | ||||
|     d_vector_length = vector_length; | ||||
|     d_dump_filename = dump_filename; | ||||
|     d_code_loop_filter = Tracking_2nd_DLL_filter(0.004); | ||||
|     d_carrier_loop_filter = Tracking_2nd_PLL_filter(0.004); | ||||
|     d_code_loop_filter = Tracking_2nd_DLL_filter(Galileo_E1_CODE_PERIOD); | ||||
|     d_carrier_loop_filter = Tracking_2nd_PLL_filter(Galileo_E1_CODE_PERIOD); | ||||
|  | ||||
|     // Initialize tracking  ========================================== | ||||
|  | ||||
| @@ -159,8 +155,6 @@ galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( | ||||
|     d_rem_code_phase_samples = 0.0; | ||||
|     // Residual carrier phase | ||||
|     d_rem_carr_phase_rad = 0.0; | ||||
|     // Phase step | ||||
|     d_code_phase_step_chips = d_code_freq_chips / (float)d_fs_in; //[chips] | ||||
|  | ||||
|     // sample synchronization | ||||
|     d_sample_counter = 0; | ||||
| @@ -181,15 +175,9 @@ galileo_e1_dll_pll_veml_tracking_cc::galileo_e1_dll_pll_veml_tracking_cc( | ||||
|     d_carrier_lock_fail_counter = 0; | ||||
|     d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; | ||||
|  | ||||
|     //systemName["G"] = std::string("GPS"); | ||||
|     //systemName["R"] = std::string("GLONASS"); | ||||
|     //systemName["S"] = std::string("SBAS"); | ||||
|     systemName["E"] = std::string("Galileo"); | ||||
|     //systemName["C"] = std::string("Compass"); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void galileo_e1_dll_pll_veml_tracking_cc::start_tracking() | ||||
| { | ||||
|     d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; | ||||
| @@ -197,10 +185,8 @@ void galileo_e1_dll_pll_veml_tracking_cc::start_tracking() | ||||
|     d_acq_sample_stamp =  d_acquisition_gnss_synchro->Acq_samplestamp_samples; | ||||
|  | ||||
|     // DLL/PLL filter initialization | ||||
|     d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); //initialize the carrier filter | ||||
|     // THE PARAMETER IS NOT USED!! | ||||
|     d_code_loop_filter.initialize(d_acq_code_phase_samples); //initialize the code filter | ||||
|     // THE PARAMETER IS NOT USED!! | ||||
|     d_carrier_loop_filter.initialize(); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(); //initialize the code filter | ||||
|  | ||||
|     // generate local reference ALWAYS starting at chip 2 (2 samples per chip) | ||||
|     galileo_e1_code_gen_complex_sampled(&d_ca_code[2],d_acquisition_gnss_synchro->Signal, false, d_acquisition_gnss_synchro->PRN, 2*Galileo_E1_CODE_CHIP_RATE_HZ, 0); | ||||
| @@ -213,12 +199,11 @@ void galileo_e1_dll_pll_veml_tracking_cc::start_tracking() | ||||
|     d_carrier_lock_fail_counter = 0; | ||||
|     d_rem_code_phase_samples = 0.0; | ||||
|     d_rem_carr_phase_rad = 0; | ||||
|     d_next_rem_code_phase_samples = 0; | ||||
|     d_acc_carrier_phase_rad = 0; | ||||
|  | ||||
|     d_code_phase_samples = d_acq_code_phase_samples; // Never used? | ||||
|     d_acc_code_phase_secs = 0; | ||||
|     d_carrier_doppler_hz = d_acq_carrier_doppler_hz; | ||||
|     d_next_prn_length_samples = d_vector_length; | ||||
|     d_current_prn_length_samples = d_vector_length; | ||||
|  | ||||
|     std::string sys_ = &d_acquisition_gnss_synchro->System; | ||||
|     sys = sys_.substr(0,1); | ||||
| @@ -236,9 +221,6 @@ void galileo_e1_dll_pll_veml_tracking_cc::start_tracking() | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| void galileo_e1_dll_pll_veml_tracking_cc::update_local_code() | ||||
| { | ||||
|     double tcode_half_chips; | ||||
| @@ -275,27 +257,20 @@ void galileo_e1_dll_pll_veml_tracking_cc::update_local_code() | ||||
|     memcpy(d_very_late_code, &d_very_early_code[2*very_early_late_spc_samples], d_current_prn_length_samples* sizeof(gr_complex)); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| void galileo_e1_dll_pll_veml_tracking_cc::update_local_carrier() | ||||
| { | ||||
|     float phase_rad, phase_step_rad; | ||||
|  | ||||
|     // Compute the carrier phase step for the K-1 carrier doppler estimation | ||||
|     phase_step_rad = (float)GPS_TWO_PI*d_carrier_doppler_hz / (float)d_fs_in; | ||||
|     // Initialize the carrier phase with the remanent carrier phase of the K-2 loop | ||||
|     phase_rad = d_rem_carr_phase_rad; | ||||
|     for(int i = 0; i < d_current_prn_length_samples; i++) | ||||
|         { | ||||
|             d_carr_sign[i] = gr_complex(cos(phase_rad), -sin(phase_rad)); | ||||
|             phase_rad += phase_step_rad; | ||||
|         } | ||||
|     d_rem_carr_phase_rad = fmod(phase_rad, GPS_TWO_PI); | ||||
|     d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + d_rem_carr_phase_rad; // Why here???? | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| galileo_e1_dll_pll_veml_tracking_cc::~galileo_e1_dll_pll_veml_tracking_cc() | ||||
| { | ||||
|     d_dump_file.close(); | ||||
| @@ -331,16 +306,14 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|             if (d_pull_in == true) | ||||
|                 { | ||||
|                     /* | ||||
|                      * Signal alignment (skip samples until the incoming signal is aligned with local replica | ||||
|                      * Signal alignment (skip samples until the incoming signal is aligned with local replica) | ||||
|                      */ | ||||
|                     int samples_offset; | ||||
|                     float acq_trk_shif_correction_samples; | ||||
|                     int acq_to_trk_delay_samples; | ||||
|                     acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp; | ||||
|                     acq_trk_shif_correction_samples = d_next_prn_length_samples - fmod((float)acq_to_trk_delay_samples, (float)d_next_prn_length_samples); | ||||
|                     acq_trk_shif_correction_samples = d_current_prn_length_samples - fmod((float)acq_to_trk_delay_samples, (float)d_current_prn_length_samples); | ||||
|                     samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); | ||||
|                     // /todo: Check if the sample counter sent to the next block as a time reference should be incremented AFTER sended or BEFORE | ||||
|                     //d_sample_counter_seconds = d_sample_counter_seconds + (((double)samples_offset) / (double)d_fs_in); | ||||
|                     d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples | ||||
|                     d_pull_in = false; | ||||
|                     d_debug_counter++; | ||||
| @@ -350,7 +323,6 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|  | ||||
|             // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder | ||||
|             Gnss_Synchro current_synchro_data; | ||||
|  | ||||
|             // Fill the acquisition data | ||||
|             current_synchro_data = *d_acquisition_gnss_synchro; | ||||
|  | ||||
| @@ -358,11 +330,7 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|             const gr_complex* in = (gr_complex*) input_items[0]; | ||||
|             Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; | ||||
|  | ||||
|             // Update the prn length based on code freq (variable) and sampling frequency (fixed) | ||||
|             // variable code PRN sample block size | ||||
|             d_current_prn_length_samples = d_next_prn_length_samples; | ||||
|  | ||||
|             // Generate local code and carrier replicas | ||||
|             // Generate local code and carrier replicas (using \hat{f}_d(k-1)) | ||||
|             update_local_code(); | ||||
|             update_local_carrier(); | ||||
|  | ||||
| @@ -382,38 +350,46 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|                     d_Very_Late, | ||||
|                     is_unaligned()); | ||||
|  | ||||
|  | ||||
|             // ################## PLL ########################################################## | ||||
|             // PLL discriminator | ||||
|             carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / (float)GPS_TWO_PI; | ||||
|             // Implement carrier loop filter and generate NCO command | ||||
|             // Carrier discriminator filter | ||||
|             carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); | ||||
|             // Modify carrier freq based on NCO command | ||||
|             // New carrier Doppler frequency estimation | ||||
|             d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz; | ||||
|             // New code Doppler frequency estimation | ||||
|             d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ + ((d_carrier_doppler_hz * Galileo_E1_CODE_CHIP_RATE_HZ) / Galileo_E1_FREQ_HZ); | ||||
|             //carrier phase accumulator for (K) doppler estimation | ||||
|             d_acc_carrier_phase_rad=d_acc_carrier_phase_rad+GPS_TWO_PI*d_carrier_doppler_hz*Galileo_E1_CODE_PERIOD; | ||||
|             //remanent carrier phase to prevent overflow in the code NCO | ||||
|             d_rem_carr_phase_rad=d_rem_carr_phase_rad+GPS_TWO_PI*d_carrier_doppler_hz*Galileo_E1_CODE_PERIOD; | ||||
|             d_rem_carr_phase_rad=fmod(d_rem_carr_phase_rad,GPS_TWO_PI); | ||||
|  | ||||
|             // ################## DLL ########################################################## | ||||
|             // DLL discriminator | ||||
|             code_error_chips = dll_nc_vemlp_normalized(*d_Very_Early, *d_Early, *d_Late, *d_Very_Late); | ||||
|             // Implement code loop filter and generate NCO command | ||||
|             code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); | ||||
|             // Modify code freq based on NCO command | ||||
|             d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ + (((d_carrier_doppler_hz + d_if_freq) * Galileo_E1_CODE_CHIP_RATE_HZ) / Galileo_E1_FREQ_HZ) - code_error_filt_chips; | ||||
|             // Update the phase step based on code freq (variable) and sampling frequency (fixed) | ||||
|             d_code_phase_step_chips = d_code_freq_chips / (float)d_fs_in; //[chips] | ||||
|             code_error_chips = dll_nc_vemlp_normalized(*d_Very_Early, *d_Early, *d_Late, *d_Very_Late); //[chips/Ti] | ||||
|             // Code discriminator filter | ||||
|             code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second] | ||||
|             //Code phase accumulator | ||||
|             float code_error_filt_secs; | ||||
|             code_error_filt_secs=(Galileo_E1_CODE_PERIOD*code_error_filt_chips)/Galileo_E1_CODE_CHIP_RATE_HZ; //[seconds] | ||||
|             //code_error_filt_secs=T_prn_seconds*code_error_filt_chips*T_chip_seconds*(float)d_fs_in; //[seconds] | ||||
|             d_acc_code_phase_secs=d_acc_code_phase_secs+code_error_filt_secs; | ||||
|  | ||||
|             // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT ####################### | ||||
|             // keep alignment parameters for the next input buffer | ||||
|             float T_chip_seconds; | ||||
|             float T_prn_seconds; | ||||
|             float T_prn_samples; | ||||
|             float K_blk_samples; | ||||
|             // Compute the next buffer lenght based in the new period of the PRN sequence and the code phase error estimation | ||||
|             T_chip_seconds = 1 / d_code_freq_chips; | ||||
|             T_prn_seconds = T_chip_seconds * Galileo_E1_B_CODE_LENGTH_CHIPS; | ||||
|             T_prn_samples = T_prn_seconds * d_fs_in; | ||||
|             d_rem_code_phase_samples = d_next_rem_code_phase_samples; | ||||
|             K_blk_samples = T_prn_samples + d_rem_code_phase_samples; | ||||
|             d_next_prn_length_samples = round(K_blk_samples); //round to a discrete samples | ||||
|             d_next_rem_code_phase_samples = K_blk_samples - d_next_prn_length_samples; //rounding error | ||||
|             /*! | ||||
|              * \todo Improve the lock detection algorithm! | ||||
|              */ | ||||
|             T_prn_samples = T_prn_seconds * (float)d_fs_in; | ||||
|             K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs*(float)d_fs_in; | ||||
|             d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples | ||||
|             d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample | ||||
|  | ||||
|             // ####### CN0 ESTIMATION AND LOCK DETECTORS ###### | ||||
|             if (d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES) | ||||
|                 { | ||||
| @@ -443,8 +419,6 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|                     if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) | ||||
|                         { | ||||
|                             std::cout << "Channel " << d_channel << " loss of lock!" << std::endl ; | ||||
|                             //tracking_message = 3; //loss of lock | ||||
|                             //d_channel_internal_queue->push(tracking_message); | ||||
|                             ControlMessageFactory* cmf = new ControlMessageFactory(); | ||||
|                             if (d_queue != gr_msg_queue_sptr()) | ||||
|                                 { | ||||
| @@ -462,7 +436,7 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|             current_synchro_data.Prompt_Q = (double)(*d_Prompt).imag(); | ||||
|             // Tracking_timestamp_secs is aligned with the PRN start sample | ||||
|             current_synchro_data.Tracking_timestamp_secs = ((double)d_sample_counter + | ||||
|                     (double)d_next_prn_length_samples + (double)d_next_rem_code_phase_samples) / (double)d_fs_in; | ||||
|                     (double)d_current_prn_length_samples + (double)d_rem_code_phase_samples) / (double)d_fs_in; | ||||
|             // This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0 | ||||
|             current_synchro_data.Code_phase_secs = 0; | ||||
|             current_synchro_data.Carrier_phase_rads = (double)d_acc_carrier_phase_rad; | ||||
| @@ -482,10 +456,7 @@ int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vect | ||||
|                             std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl; | ||||
|                             std::cout << "Tracking CH " << d_channel <<  ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) | ||||
|                                                             << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; | ||||
|                             //std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl; | ||||
|                             //if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock! | ||||
|                             //std::cout<<"d_carrier_lock_test="<<d_carrier_lock_test<<std::endl; | ||||
|                             //std::cout<<"d_carrier_lock_fail_counter="<<d_carrier_lock_fail_counter<<std::endl; | ||||
|  | ||||
|                         } | ||||
|                 } | ||||
|             else | ||||
|   | ||||
| @@ -134,8 +134,6 @@ private: | ||||
|     float d_early_late_spc_chips; | ||||
|     float d_very_early_late_spc_chips; | ||||
|  | ||||
|     float d_code_phase_step_chips; | ||||
|  | ||||
|     gr_complex* d_ca_code; | ||||
|  | ||||
|     gr_complex* d_very_early_code; | ||||
| @@ -153,7 +151,6 @@ private: | ||||
|  | ||||
|     // remaining code phase and carrier phase between tracking loops | ||||
|     float d_rem_code_phase_samples; | ||||
|     float d_next_rem_code_phase_samples; | ||||
|     float d_rem_carr_phase_rad; | ||||
|  | ||||
|     // PLL and DLL filter library | ||||
| @@ -170,12 +167,11 @@ private: | ||||
|     // tracking vars | ||||
|     float d_code_freq_chips; | ||||
|     float d_carrier_doppler_hz; | ||||
|     float d_acc_carrier_phase_rad; | ||||
|     float d_code_phase_samples; | ||||
|     double d_acc_carrier_phase_rad; | ||||
|     double d_acc_code_phase_secs; | ||||
|  | ||||
|     //PRN period in samples | ||||
|     int d_current_prn_length_samples; | ||||
|     int d_next_prn_length_samples; | ||||
|     //double d_sample_counter_seconds; | ||||
|  | ||||
|     //processing samples counters | ||||
|   | ||||
| @@ -209,8 +209,8 @@ void Galileo_E1_Tcp_Connector_Tracking_cc::start_tracking() | ||||
|     d_acq_sample_stamp =  d_acquisition_gnss_synchro->Acq_samplestamp_samples; | ||||
|  | ||||
|     // DLL/PLL filter initialization | ||||
|     d_carrier_loop_filter.initialize(d_acq_carrier_doppler_hz); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(d_acq_code_phase_samples); //initialize the code filter | ||||
|     d_carrier_loop_filter.initialize(); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(); //initialize the code filter | ||||
|  | ||||
|  | ||||
|     // generate local reference ALWAYS starting at chip 2 (2 samples per chip) | ||||
|   | ||||
| @@ -124,6 +124,9 @@ Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc( | ||||
|     // Initialize tracking variables ========================================== | ||||
|     d_carrier_loop_filter.set_params(fll_bw_hz,pll_bw_hz,order); | ||||
|  | ||||
|     d_code_loop_filter=Tracking_2nd_DLL_filter(GPS_L1_CA_CODE_PERIOD); | ||||
|     d_code_loop_filter.set_DLL_BW(dll_bw_hz); | ||||
|  | ||||
|     // 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]; | ||||
|  | ||||
| @@ -346,6 +349,7 @@ int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::general_work (int noutput_items, gr_vecto | ||||
| { | ||||
|  | ||||
|     double code_error_chips = 0; | ||||
|     double code_error_filt_chips =0; | ||||
|     double correlation_time_s = 0; | ||||
|     double PLL_discriminator_hz = 0; | ||||
|     double carr_nco_hz = 0; | ||||
| @@ -433,6 +437,8 @@ int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::general_work (int noutput_items, gr_vecto | ||||
|              */ | ||||
|             // Compute DLL error | ||||
|             code_error_chips = dll_nc_e_minus_l_normalized(*d_Early,*d_Late); | ||||
|             // Compute DLL filtered error | ||||
|             code_error_filt_chips=d_code_loop_filter.get_code_nco(code_error_chips); | ||||
|  | ||||
|             //compute FLL error | ||||
|             correlation_time_s = ((double)d_current_prn_length_samples) / d_fs_in; | ||||
| @@ -456,7 +462,9 @@ int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::general_work (int noutput_items, gr_vecto | ||||
|              */ | ||||
|             carr_nco_hz = d_carrier_loop_filter.get_carrier_error(d_FLL_discriminator_hz, PLL_discriminator_hz, correlation_time_s); | ||||
|             d_carrier_doppler_hz = d_if_freq + carr_nco_hz; | ||||
|             d_code_freq_hz = GPS_L1_CA_CODE_RATE_HZ + (((d_carrier_doppler_hz + d_if_freq) * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ) - code_error_chips; | ||||
|  | ||||
|  | ||||
|             d_code_freq_hz = GPS_L1_CA_CODE_RATE_HZ + (((d_carrier_doppler_hz + d_if_freq) * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); | ||||
|  | ||||
|             /*! | ||||
|              * \todo Improve the lock detection algorithm! | ||||
| @@ -528,7 +536,12 @@ int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::general_work (int noutput_items, gr_vecto | ||||
|             T_chip_seconds = 1/d_code_freq_hz; | ||||
|             T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; | ||||
|             T_prn_samples = T_prn_seconds * d_fs_in; | ||||
|             K_blk_samples = T_prn_samples + d_rem_code_phase_samples; | ||||
|  | ||||
|             float code_error_filt_samples; | ||||
|             code_error_filt_samples=T_prn_seconds*code_error_filt_chips*T_chip_seconds*(float)d_fs_in; //[seconds] | ||||
|             d_acc_code_phase_samples=d_acc_code_phase_samples+code_error_filt_samples; | ||||
|  | ||||
|             K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_samples; | ||||
|             d_current_prn_length_samples = round(K_blk_samples); //round to a discrete sample | ||||
|             d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error | ||||
|  | ||||
| @@ -598,7 +611,7 @@ int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc::general_work (int noutput_items, gr_vecto | ||||
|                     //DLL commands | ||||
|                     tmp_float=(float)code_error_chips; | ||||
|                     d_dump_file.write((char*)&tmp_float, sizeof(float)); | ||||
|                     tmp_float=(float)d_code_phase_samples; | ||||
|                     tmp_float=(float)code_error_filt_chips; | ||||
|                     d_dump_file.write((char*)&tmp_float, sizeof(float)); | ||||
|  | ||||
|                     // CN0 and carrier lock test | ||||
|   | ||||
| @@ -47,6 +47,7 @@ | ||||
| #include "concurrent_queue.h" | ||||
| #include "gps_sdr_signal_processing.h" | ||||
| #include "tracking_FLL_PLL_filter.h" | ||||
| #include "tracking_2nd_DLL_filter.h" | ||||
| #include "gnss_synchro.h" | ||||
| //#include "GPS_L1_CA.h" | ||||
| #include "correlator.h" | ||||
| @@ -184,6 +185,9 @@ private: | ||||
|     double d_FLL_discriminator_hz; // This is a class variable because FLL needs to have memory | ||||
|     Tracking_FLL_PLL_filter d_carrier_loop_filter; | ||||
|     double d_acc_carrier_phase_rad; | ||||
|     double d_acc_code_phase_samples; | ||||
|  | ||||
|     Tracking_2nd_DLL_filter d_code_loop_filter; | ||||
|  | ||||
|     unsigned long int d_sample_counter; | ||||
|  | ||||
|   | ||||
| @@ -229,8 +229,8 @@ void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::start_tracking() | ||||
|  | ||||
|     d_carrier_doppler_hz = d_acq_carrier_doppler_hz; | ||||
|     // DLL/PLL filter initialization | ||||
|     d_carrier_loop_filter.initialize(d_carrier_doppler_hz); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(d_acq_code_phase_samples); //initialize the code filter | ||||
|     d_carrier_loop_filter.initialize(); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(); //initialize the code filter | ||||
|  | ||||
|     // generate local reference ALWAYS starting at chip 1 (1 sample per chip) | ||||
|     gps_l1_ca_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN, 0); | ||||
|   | ||||
| @@ -227,8 +227,8 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking() | ||||
|  | ||||
|     d_carrier_doppler_hz = d_acq_carrier_doppler_hz; | ||||
|     // DLL/PLL filter initialization | ||||
|     d_carrier_loop_filter.initialize(d_carrier_doppler_hz); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(d_acq_code_phase_samples); //initialize the code filter | ||||
|     d_carrier_loop_filter.initialize(); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(); //initialize the code filter | ||||
|  | ||||
|     // generate local reference ALWAYS starting at chip 1 (1 sample per chip) | ||||
|     gps_l1_ca_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN, 0); | ||||
|   | ||||
| @@ -248,8 +248,8 @@ void Gps_L1_Ca_Tcp_Connector_Tracking_cc::start_tracking() | ||||
|  | ||||
|     d_carrier_doppler_hz = d_acq_carrier_doppler_hz; | ||||
|     // DLL/PLL filter initialization | ||||
|     d_carrier_loop_filter.initialize(d_carrier_doppler_hz); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(d_acq_code_phase_samples); //initialize the code filter | ||||
|     d_carrier_loop_filter.initialize(); //initialize the carrier filter | ||||
|     d_code_loop_filter.initialize(); //initialize the code filter | ||||
|  | ||||
|     // generate local reference ALWAYS starting at chip 1 (1 sample per chip) | ||||
|     gps_l1_ca_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN, 0); | ||||
|   | ||||
| @@ -59,7 +59,7 @@ void Tracking_2nd_DLL_filter::set_DLL_BW(float dll_bw_hz) | ||||
|  | ||||
|  | ||||
|  | ||||
| void Tracking_2nd_DLL_filter::initialize(float d_acq_code_phase_samples) | ||||
| void Tracking_2nd_DLL_filter::initialize() | ||||
| { | ||||
|     // code tracking loop parameters | ||||
|     d_old_code_nco   = 0.0; | ||||
|   | ||||
| @@ -60,7 +60,7 @@ private: | ||||
|  | ||||
| public: | ||||
|     void set_DLL_BW(float dll_bw_hz);                //! Set DLL filter bandwidth [Hz] | ||||
|     void initialize(float d_acq_code_phase_samples); //! Start tracking with acquisition information | ||||
|     void initialize(); //! Start tracking with acquisition information | ||||
|     float get_code_nco(float DLL_discriminator);     //! Numerically controlled oscillator | ||||
|     Tracking_2nd_DLL_filter(float pdi_code); | ||||
|     Tracking_2nd_DLL_filter(); | ||||
|   | ||||
| @@ -58,7 +58,7 @@ void Tracking_2nd_PLL_filter::set_PLL_BW(float pll_bw_hz) | ||||
|  | ||||
|  | ||||
|  | ||||
| void Tracking_2nd_PLL_filter::initialize(float d_acq_carrier_doppler_hz) | ||||
| void Tracking_2nd_PLL_filter::initialize() | ||||
| { | ||||
|     // carrier/Costas loop parameters | ||||
|     d_old_carr_nco   = 0.0; | ||||
| @@ -66,8 +66,11 @@ void Tracking_2nd_PLL_filter::initialize(float d_acq_carrier_doppler_hz) | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * PLL second order FIR filter | ||||
|  * Req Input in [Hz/Ti] | ||||
|  * The output is in [Hz/s]. | ||||
|  */ | ||||
| float Tracking_2nd_PLL_filter::get_carrier_nco(float PLL_discriminator) | ||||
| { | ||||
|     float carr_nco; | ||||
|   | ||||
| @@ -61,7 +61,7 @@ private: | ||||
|     void calculate_lopp_coef(float* tau1,float* tau2, float lbw, float zeta, float k); | ||||
| public: | ||||
| 	void set_PLL_BW(float pll_bw_hz);  //! Set PLL loop bandwidth [Hz] | ||||
| 	void initialize(float d_acq_carrier_doppler_hz); | ||||
| 	void initialize(); | ||||
| 	float get_carrier_nco(float PLL_discriminator); | ||||
|     Tracking_2nd_PLL_filter(float pdi_carr); | ||||
| 	Tracking_2nd_PLL_filter(); | ||||
|   | ||||
| @@ -49,6 +49,7 @@ const double F                = -4.442807633e-10; //!< Constant, [s/(m)^(1/2)] | ||||
| const double  GPS_L1_FREQ_HZ              = 1.57542e9; //!< L1 [Hz] | ||||
| const double  GPS_L1_CA_CODE_RATE_HZ      = 1.023e6;   //!< GPS L1 C/A code rate [chips/s] | ||||
| const double  GPS_L1_CA_CODE_LENGTH_CHIPS = 1023.0;    //!< GPS L1 C/A code length [chips] | ||||
| const double  GPS_L1_CA_CODE_PERIOD		= 0.001;    //!< GPS L1 C/A code period [seconds] | ||||
|  | ||||
| /*! | ||||
|  * \brief Maximum Time-Of-Arrival (TOA) difference between satellites for a receiver operated on Earth surface is 20 ms | ||||
|   | ||||
| @@ -38,6 +38,7 @@ | ||||
| // carrier and code frequencies | ||||
| const double Galileo_E1_FREQ_HZ = 1.57542e9; //!< E1 [Hz] | ||||
| const double Galileo_E1_CODE_CHIP_RATE_HZ = 1.023e6; //!< Galileo E1 code rate [chips/s] | ||||
| const double Galileo_E1_CODE_PERIOD = 0.004; //!< Galileo E1 code period [s] | ||||
| const double Galileo_E1_SUB_CARRIER_A_RATE_HZ = 1.023e6; //!< Galileo E1 sub-carrier 'a' rate [Hz] | ||||
| const double Galileo_E1_SUB_CARRIER_B_RATE_HZ = 6.138e6; //!< Galileo E1 sub-carrier 'b' rate [Hz] | ||||
| const double Galileo_E1_B_CODE_LENGTH_CHIPS = 4092.0; //!< Galileo E1-B code length [chips] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas