mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-30 23:03:05 +00:00 
			
		
		
		
	Fixing bugs in extended correlator for GPS L1
This commit is contained in:
		
							
								
								
									
										347
									
								
								conf/gnss-sdr_Hybrid_gr_complex.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								conf/gnss-sdr_Hybrid_gr_complex.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,347 @@ | ||||
| ; Default configuration file | ||||
| ; You can define your own receiver and invoke it by doing | ||||
| ; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf | ||||
| ; | ||||
|  | ||||
| [GNSS-SDR] | ||||
|  | ||||
| ;######### GLOBAL OPTIONS ################## | ||||
| ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. | ||||
| GNSS-SDR.internal_fs_hz=4092000 | ||||
|  | ||||
| ;######### CONTROL_THREAD CONFIG ############ | ||||
| ControlThread.wait_for_flowgraph=false | ||||
| ;######### SIGNAL_SOURCE CONFIG ############ | ||||
| ;#implementation: Use [File_Signal_Source] [Nsr_File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) | ||||
| SignalSource.implementation=File_Signal_Source | ||||
|  | ||||
| ;#filename: path to file with the captured GNSS signal samples to be processed | ||||
| SignalSource.filename=/home/javier/signals/GPS_sim1.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=4092000 | ||||
|  | ||||
| ;#freq: RF front-end center frequency in [Hz] | ||||
| SignalSource.freq=1575420000 | ||||
|  | ||||
| ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. | ||||
| SignalSource.samples=0 | ||||
|  | ||||
| ;#repeat: Repeat the processing file. Disable this option in this version | ||||
| SignalSource.repeat=false | ||||
|  | ||||
| ;#dump: Dump the Signal source data to a file. Disable this option in this version | ||||
| SignalSource.dump=false | ||||
|  | ||||
| SignalSource.dump_filename=../data/signal_source.dat | ||||
|  | ||||
|  | ||||
| ;#enable_throttle_control: Enabling this option tells the signal source to keep the delay between samples in post processing. | ||||
| ; it helps to not overload the CPU, but the processing time will be longer. | ||||
| SignalSource.enable_throttle_control=false | ||||
|  | ||||
|  | ||||
| ;######### SIGNAL_CONDITIONER CONFIG ############ | ||||
| ;## It holds blocks to change data type, filter and resample input data. | ||||
|  | ||||
| ;#implementation: Use [Pass_Through] or [Signal_Conditioner] | ||||
| ;#[Pass_Through] disables this block and the [DataTypeAdapter], [InputFilter] and [Resampler] blocks | ||||
| ;#[Signal_Conditioner] enables this block. Then you have to configure [DataTypeAdapter], [InputFilter] and [Resampler] blocks | ||||
| SignalConditioner.implementation=Pass_Through | ||||
|  | ||||
| ;######### DATA_TYPE_ADAPTER CONFIG ############ | ||||
| ;## Changes the type of input data. | ||||
| ;#implementation: [Pass_Through] disables this block | ||||
| DataTypeAdapter.implementation=Pass_Through | ||||
| DataTypeAdapter.item_type=gr_complex | ||||
|  | ||||
| ;######### INPUT_FILTER CONFIG ############ | ||||
| ;## Filter the input data. Can be combined with frequency translation for IF signals | ||||
|  | ||||
| ;#implementation: Use [Pass_Through] or [Fir_Filter] or [Freq_Xlating_Fir_Filter] | ||||
| ;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation | ||||
| ;# that shifts IF down to zero Hz. | ||||
|  | ||||
| InputFilter.implementation=Pass_Through | ||||
|  | ||||
| ;#dump: Dump the filtered data to a file. | ||||
| InputFilter.dump=false | ||||
|  | ||||
| ;#dump_filename: Log path and filename. | ||||
| InputFilter.dump_filename=../data/input_filter.dat | ||||
|  | ||||
| ;#The following options are used in the filter design of Fir_Filter and Freq_Xlating_Fir_Filter implementation. | ||||
| ;#These options are based on parameters of gnuradio's function: gr_remez. | ||||
| ;#These function calculates the optimal (in the Chebyshev/minimax sense) FIR filter inpulse | ||||
| ;#reponse given a set of band edges, the desired reponse on those bands, | ||||
| ;#and the weight given to the error in those bands. | ||||
|  | ||||
| ;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. | ||||
| InputFilter.input_item_type=gr_complex | ||||
|  | ||||
| ;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. | ||||
| InputFilter.output_item_type=gr_complex | ||||
|  | ||||
| ;#taps_item_type: Type and resolution for the taps of the filter. Use only float in this version. | ||||
| InputFilter.taps_item_type=float | ||||
|  | ||||
| ;#number_of_taps: Number of taps in the filter. Increasing this parameter increases the processing time | ||||
| InputFilter.number_of_taps=5 | ||||
|  | ||||
| ;#number_of _bands: Number of frequency bands in the filter. | ||||
| InputFilter.number_of_bands=2 | ||||
|  | ||||
| ;#bands: frequency at the band edges [ b1 e1 b2 e2 b3 e3 ...]. | ||||
| ;#Frequency is in the range [0, 1], with 1 being the Nyquist frequency (Fs/2) | ||||
| ;#The number of band_begin and band_end elements must match the number of bands | ||||
|  | ||||
| InputFilter.band1_begin=0.0 | ||||
| InputFilter.band1_end=0.45 | ||||
| InputFilter.band2_begin=0.55 | ||||
| InputFilter.band2_end=1.0 | ||||
|  | ||||
| ;#ampl: desired amplitude at the band edges [ a(b1) a(e1) a(b2) a(e2) ...]. | ||||
| ;#The number of ampl_begin and ampl_end elements must match the number of bands | ||||
|  | ||||
| InputFilter.ampl1_begin=1.0 | ||||
| InputFilter.ampl1_end=1.0 | ||||
| InputFilter.ampl2_begin=0.0 | ||||
| InputFilter.ampl2_end=0.0 | ||||
|  | ||||
| ;#band_error: weighting applied to each band (usually 1). | ||||
| ;#The number of band_error elements must match the number of bands | ||||
| InputFilter.band1_error=1.0 | ||||
| InputFilter.band2_error=1.0 | ||||
|  | ||||
| ;#filter_type: one of "bandpass", "hilbert" or "differentiator" | ||||
| InputFilter.filter_type=bandpass | ||||
|  | ||||
| ;#grid_density: determines how accurately the filter will be constructed. | ||||
| ;The minimum value is 16; higher values are slower to compute the filter. | ||||
| InputFilter.grid_density=16 | ||||
|  | ||||
| ;# Original sampling frequency stored in the signal file | ||||
| InputFilter.sampling_frequency=4092000 | ||||
|  | ||||
| ;#The following options are used only in Freq_Xlating_Fir_Filter implementation. | ||||
| ;#InputFilter.IF is the intermediate frequency (in Hz) shifted down to zero Hz | ||||
|  | ||||
| InputFilter.IF=5499998.47412109 | ||||
|  | ||||
| ;# Decimation factor after the frequency tranaslating block | ||||
| InputFilter.decimation_factor=8 | ||||
|  | ||||
|  | ||||
| ;######### RESAMPLER CONFIG ############ | ||||
| ;## Resamples the input data. | ||||
|  | ||||
| ;#implementation: Use [Pass_Through] or [Direct_Resampler] | ||||
| ;#[Pass_Through] disables this block | ||||
| ;#[Direct_Resampler] enables a resampler that implements a nearest neigbourhood interpolation | ||||
| Resampler.implementation=Pass_Through | ||||
|  | ||||
| ;######### CHANNELS GLOBAL CONFIG ############ | ||||
| ;#count: Number of available GPS satellite channels. | ||||
| Channels_1C.count=1 | ||||
| ;#count: Number of available Galileo satellite channels. | ||||
| Channels_1B.count=0 | ||||
| ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver | ||||
| Channels.in_acquisition=1 | ||||
|  | ||||
| ;#signal: | ||||
| ;# "1C" GPS L1 C/A | ||||
| ;# "2S" GPS L2 L2C (M) | ||||
| ;# "1B" GALILEO E1 B (I/NAV OS/CS/SoL) | ||||
| ;# "5X" GALILEO E5a I+Q | ||||
|  | ||||
| ;#if the option is disabled by default is assigned "1C" GPS L1 C/A | ||||
| Channel0.signal=1C | ||||
| Channel1.signal=1B | ||||
| Channel2.signal=1B | ||||
| Channel3.signal=1B | ||||
| Channel4.signal=1B | ||||
| Channel5.signal=1B | ||||
| Channel6.signal=1B | ||||
| Channel7.signal=1B | ||||
| Channel8.signal=1B | ||||
| Channel9.signal=1B | ||||
| Channel10.signal=1B | ||||
| Channel11.signal=1B | ||||
| Channel12.signal=1B | ||||
| Channel13.signal=1B | ||||
| Channel14.signal=1B | ||||
| Channel15.signal=1B | ||||
|  | ||||
|  | ||||
| ;######### GPS ACQUISITION CONFIG ############ | ||||
|  | ||||
| ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] | ||||
| Acquisition_1C.dump=false | ||||
| ;#filename: Log path and filename | ||||
| Acquisition_1C.dump_filename=./acq_dump.dat | ||||
| ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. | ||||
| Acquisition_1C.item_type=gr_complex | ||||
| ;#if: Signal intermediate frequency in [Hz] | ||||
| Acquisition_1C.if=0 | ||||
| ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] | ||||
| Acquisition_1C.sampled_ms=1 | ||||
| ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] | ||||
| Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition | ||||
| Acquisition_1C.use_CFAR_algorithm=false; | ||||
| ;#threshold: Acquisition threshold | ||||
| Acquisition_1C.threshold=30 | ||||
| ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] | ||||
| ;Acquisition_1C.pfa=0.01 | ||||
| ;#doppler_max: Maximum expected Doppler shift [Hz] | ||||
| Acquisition_1C.doppler_max=5000 | ||||
| ;#doppler_max: Doppler step in the grid search [Hz] | ||||
| Acquisition_1C.doppler_step=100 | ||||
|  | ||||
|  | ||||
| ;######### GALILEO ACQUISITION CONFIG ############ | ||||
|  | ||||
| ;#dump: Enable or disable the acquisition internal data file logging [true] or [false] | ||||
| Acquisition_1B.dump=false | ||||
| ;#filename: Log path and filename | ||||
| Acquisition_1B.dump_filename=./acq_dump.dat | ||||
| ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. | ||||
| Acquisition_1B.item_type=gr_complex | ||||
| ;#if: Signal intermediate frequency in [Hz] | ||||
| Acquisition_1B.if=0 | ||||
| ;#sampled_ms: Signal block duration for the acquisition signal detection [ms] | ||||
| Acquisition_1B.sampled_ms=4 | ||||
| ;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] | ||||
| Acquisition_1B.implementation=Galileo_E1_PCPS_Ambiguous_Acquisition | ||||
| ;#threshold: Acquisition threshold | ||||
| ;Acquisition_1B.threshold=0 | ||||
| ;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] | ||||
| Acquisition_1B.pfa=0.0000002 | ||||
| ;#doppler_max: Maximum expected Doppler shift [Hz] | ||||
| Acquisition_1B.doppler_max=15000 | ||||
| ;#doppler_max: Doppler step in the grid search [Hz] | ||||
| Acquisition_1B.doppler_step=125 | ||||
|  | ||||
| ;######### TRACKING GPS CONFIG ############ | ||||
|  | ||||
| ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] | ||||
| Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_C_Aid_Tracking | ||||
| ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. | ||||
| Tracking_1C.item_type=gr_complex | ||||
|  | ||||
| ;#sampling_frequency: Signal Intermediate Frequency in [Hz] | ||||
| Tracking_1C.if=0 | ||||
|  | ||||
| ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] | ||||
| Tracking_1C.dump=true | ||||
|  | ||||
| ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. | ||||
| Tracking_1C.dump_filename=../data/epl_tracking_ch_ | ||||
|  | ||||
| ;#pll_bw_hz: PLL loop filter bandwidth [Hz] | ||||
| Tracking_1C.pll_bw_hz=20; | ||||
| Tracking_1C.pll_bw_narrow_hz=5; | ||||
|  | ||||
| ;#dll_bw_hz: DLL loop filter bandwidth [Hz] | ||||
| Tracking_1C.dll_bw_hz=4.0; | ||||
|  | ||||
| Tracking_1C.dll_bw_narrow_hz=1.5; | ||||
|  | ||||
| ;#fll_bw_hz: FLL loop filter bandwidth [Hz] | ||||
| Tracking_1C.fll_bw_hz=2.0; | ||||
|  | ||||
| ;#order: PLL/DLL loop filter order [2] or [3] | ||||
| Tracking_1C.order=3; | ||||
|  | ||||
| ;######### TRACKING GALILEO CONFIG ############ | ||||
|  | ||||
| ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] or [GPS_L1_CA_TCP_CONNECTOR_Tracking] or [Galileo_E1_DLL_PLL_VEML_Tracking] | ||||
| Tracking_1B.implementation=Galileo_E1_DLL_PLL_VEML_Tracking | ||||
| ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. | ||||
| Tracking_1B.item_type=gr_complex | ||||
|  | ||||
| ;#sampling_frequency: Signal Intermediate Frequency in [Hz] | ||||
| Tracking_1B.if=0 | ||||
|  | ||||
| ;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] | ||||
| Tracking_1B.dump=false | ||||
|  | ||||
| ;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. | ||||
| Tracking_1B.dump_filename=../data/veml_tracking_ch_ | ||||
|  | ||||
| ;#pll_bw_hz: PLL loop filter bandwidth [Hz] | ||||
| Tracking_1B.pll_bw_hz=15.0; | ||||
|  | ||||
| ;#dll_bw_hz: DLL loop filter bandwidth [Hz] | ||||
| Tracking_1B.dll_bw_hz=2.0; | ||||
|  | ||||
| ;#fll_bw_hz: FLL loop filter bandwidth [Hz] | ||||
| Tracking_1B.fll_bw_hz=10.0; | ||||
|  | ||||
| ;#order: PLL/DLL loop filter order [2] or [3] | ||||
| Tracking_1B.order=3; | ||||
|  | ||||
| ;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] for GPS and [0.15] for Galileo | ||||
| Tracking_1B.early_late_space_chips=0.15; | ||||
|  | ||||
| ;#very_early_late_space_chips: only for [Galileo_E1_DLL_PLL_VEML_Tracking], correlator very early-late space [chips]. Use [0.6] | ||||
| Tracking_1B.very_early_late_space_chips=0.6; | ||||
|  | ||||
|  | ||||
| ;######### TELEMETRY DECODER GPS CONFIG ############ | ||||
| ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A | ||||
| TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder | ||||
| TelemetryDecoder_1C.dump=false | ||||
| ;#decimation factor | ||||
| TelemetryDecoder_1C.decimation_factor=4; | ||||
|  | ||||
| ;######### TELEMETRY DECODER GALILEO CONFIG ############ | ||||
| ;#implementation: Use [Galileo_E1B_Telemetry_Decoder] for Galileo E1B | ||||
| TelemetryDecoder_1B.implementation=Galileo_E1B_Telemetry_Decoder | ||||
| TelemetryDecoder_1B.dump=false | ||||
| TelemetryDecoder_1B_factor=4; | ||||
|  | ||||
| ;######### OBSERVABLES CONFIG ############ | ||||
| ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. | ||||
| Observables.implementation=Hybrid_Observables | ||||
|  | ||||
| ;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] | ||||
| Observables.dump=false | ||||
|  | ||||
| ;#dump_filename: Log path and filename. | ||||
| Observables.dump_filename=./observables.dat | ||||
|  | ||||
|  | ||||
| ;######### PVT CONFIG ############ | ||||
| ;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. | ||||
| PVT.implementation=Hybrid_PVT | ||||
|  | ||||
| ;#averaging_depth: Number of PVT observations in the moving average algorithm | ||||
| PVT.averaging_depth=10 | ||||
|  | ||||
| ;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] | ||||
| PVT.flag_averaging=false | ||||
|  | ||||
| ;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] | ||||
| PVT.output_rate_ms=10; | ||||
|  | ||||
| ;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. | ||||
| PVT.display_rate_ms=500; | ||||
|  | ||||
| ;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] | ||||
| PVT.dump=false | ||||
|  | ||||
| PVT.flag_rtcm_server=false | ||||
| PVT.flag_rtcm_tty_port=false | ||||
| PVT.rtcm_dump_devname=/dev/pts/1 | ||||
|  | ||||
| ;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. | ||||
| PVT.dump_filename=./PVT | ||||
|  | ||||
| ;######### OUTPUT_FILTER CONFIG ############ | ||||
| ;# Receiver output filter: Leave this block disabled in this version | ||||
| OutputFilter.implementation=Null_Sink_Output_Filter | ||||
| OutputFilter.filename=data/gnss-sdr.dat | ||||
| OutputFilter.item_type=gr_complex | ||||
| @@ -323,13 +323,10 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
|     Gnss_Synchro current_synchro_data = Gnss_Synchro(); | ||||
|  | ||||
|     // process vars | ||||
|     double code_error_chips_Ti = 0.0; | ||||
|     double code_error_filt_chips = 0.0; | ||||
|     double code_error_filt_secs_Ti = 0.0; | ||||
|     double CURRENT_INTEGRATION_TIME_S; | ||||
|     double CORRECTED_INTEGRATION_TIME_S; | ||||
|     double dll_code_error_secs_Ti = 0.0; | ||||
|     double carr_phase_error_secs_Ti = 0.0; | ||||
|     double old_d_rem_code_phase_samples; | ||||
|     if (d_enable_tracking == true) | ||||
|         { | ||||
| @@ -396,6 +393,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
| 		            if (d_preamble_synchronized==false) | ||||
| 		            { | ||||
| 		            		d_preamble_synchronized=true; | ||||
| 		            		std::cout<<"dll="<<d_dll_bw_hz<<" dll_n="<<d_dll_bw_narrow_hz<<" pll="<<d_pll_bw_hz<<" pll_n="<<d_pll_bw_narrow_hz<<std::endl; | ||||
| 		            } | ||||
| 					current_synchro_data.symbol_integration_enabled=true; | ||||
| 					// UPDATE INTEGRATION TIME | ||||
| @@ -409,10 +407,25 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
| 					if(d_preamble_synchronized==true) | ||||
| 					{ | ||||
| 						// continue extended coherent correlation | ||||
| 						d_correlation_length_samples=d_correlation_length_samples-d_rem_code_phase_integer_samples; | ||||
| 						d_rem_code_phase_integer_samples=0; | ||||
| 						d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + d_carrier_phase_step_rad * d_correlation_length_samples, GPS_TWO_PI); | ||||
| 						d_rem_code_phase_chips = fmod(d_rem_code_phase_chips + d_code_phase_step_chips*d_correlation_length_samples,GPS_L1_CA_CODE_LENGTH_CHIPS); | ||||
|  | ||||
| 						// Compute the next buffer length based on the period of the PRN sequence and the code phase error estimation | ||||
| 						double T_chip_seconds = 1 / d_code_freq_chips; | ||||
| 						double T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; | ||||
| 						double T_prn_samples = T_prn_seconds * static_cast<double>(d_fs_in); | ||||
| 						int K_prn_samples = round(T_prn_samples); | ||||
| 						double K_T_prn_error_samples=K_prn_samples-T_prn_samples; | ||||
|  | ||||
| 						old_d_rem_code_phase_samples=d_rem_code_phase_samples; | ||||
| 						d_rem_code_phase_samples= d_rem_code_phase_samples - K_T_prn_error_samples -dll_code_error_secs_Ti * static_cast<double>(d_fs_in); | ||||
| 						d_rem_code_phase_integer_samples=round(d_rem_code_phase_samples); | ||||
| 						d_correlation_length_samples = K_prn_samples + d_rem_code_phase_integer_samples; //round to a discrete samples | ||||
| 						d_rem_code_phase_samples=d_rem_code_phase_samples-d_rem_code_phase_integer_samples; | ||||
| 						//code phase step (Code resampler phase increment per sample) [chips/sample] | ||||
| 						d_code_phase_step_chips = d_code_freq_chips / static_cast<double>(d_fs_in); | ||||
| 						//remnant code phase [chips] | ||||
| 						d_rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / static_cast<double>(d_fs_in)); | ||||
|  | ||||
| 						// disable tracking loop and inform telemetry decoder | ||||
| 						enable_dll_pll=false; | ||||
| 					}else{ | ||||
| @@ -435,12 +448,12 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
| 			{ | ||||
| 				// ################## PLL ########################################################## | ||||
| 				// Update PLL discriminator [rads/Ti -> Secs/Ti] | ||||
| 				carr_phase_error_secs_Ti = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_TWO_PI; //prompt output | ||||
| 				d_carr_phase_error_secs_Ti = pll_cloop_two_quadrant_atan(d_correlator_outs[1]) / GPS_TWO_PI; //prompt output | ||||
| 				// Carrier discriminator filter | ||||
| 				// NOTICE: The carrier loop filter includes the Carrier Doppler accumulator, as described in Kaplan | ||||
| 				//d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_phase_error_filt_secs_ti/INTEGRATION_TIME; | ||||
| 				// Input [s/Ti] -> output [Hz] | ||||
| 				d_carrier_doppler_hz = d_carrier_loop_filter.get_carrier_error(0.0, carr_phase_error_secs_Ti, CURRENT_INTEGRATION_TIME_S); | ||||
| 				d_carrier_doppler_hz = d_carrier_loop_filter.get_carrier_error(0.0, d_carr_phase_error_secs_Ti, CURRENT_INTEGRATION_TIME_S); | ||||
| 				// PLL to DLL assistance [Secs/Ti] | ||||
| 				d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz * CURRENT_INTEGRATION_TIME_S) / GPS_L1_FREQ_HZ; | ||||
| 				// code Doppler frequency update | ||||
| @@ -448,10 +461,10 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
|  | ||||
| 				// ################## DLL ########################################################## | ||||
| 				// DLL discriminator | ||||
| 				code_error_chips_Ti = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); //[chips/Ti] //early and late | ||||
| 				d_code_error_chips_Ti = dll_nc_e_minus_l_normalized(d_correlator_outs[0], d_correlator_outs[2]); //[chips/Ti] //early and late | ||||
| 				// Code discriminator filter | ||||
| 				code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips_Ti); //input [chips/Ti] -> output [chips/second] | ||||
| 				code_error_filt_secs_Ti = code_error_filt_chips*CURRENT_INTEGRATION_TIME_S/d_code_freq_chips; // [s/Ti] | ||||
| 				d_code_error_filt_chips = d_code_loop_filter.get_code_nco(d_code_error_chips_Ti); //input [chips/Ti] -> output [chips/second] | ||||
| 				code_error_filt_secs_Ti = d_code_error_filt_chips*CURRENT_INTEGRATION_TIME_S/d_code_freq_chips; // [s/Ti] | ||||
| 				// DLL code error estimation [s/Ti] | ||||
| 				dll_code_error_secs_Ti = - code_error_filt_secs_Ti + d_pll_to_dll_assist_secs_Ti; | ||||
|  | ||||
| @@ -645,19 +658,19 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_code_freq_chips), sizeof(double)); | ||||
|  | ||||
|                     //PLL commands | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&carr_phase_error_secs_Ti), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_carr_phase_error_secs_Ti), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_carrier_doppler_hz), sizeof(double)); | ||||
|  | ||||
|                     //DLL commands | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&code_error_chips_Ti), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&code_error_filt_chips), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_code_error_chips_Ti), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_code_error_filt_chips), sizeof(double)); | ||||
|  | ||||
|                     // CN0 and carrier lock test | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_CN0_SNV_dB_Hz), sizeof(double)); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_carrier_lock_test), sizeof(double)); | ||||
|  | ||||
|                     // AUX vars (for debug purposes) | ||||
|                     tmp_double = d_rem_code_phase_samples; | ||||
|                     tmp_double = d_code_phase_step_chips; | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||
|                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); | ||||
|                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||
|   | ||||
| @@ -160,6 +160,9 @@ private: | ||||
|     double d_acc_carrier_phase_cycles; | ||||
|     double d_code_phase_samples; | ||||
|     double d_pll_to_dll_assist_secs_Ti; | ||||
|     double d_code_error_chips_Ti; | ||||
|     double d_code_error_filt_chips; | ||||
|     double d_carr_phase_error_secs_Ti; | ||||
|  | ||||
|     // symbol history to detect bit transition | ||||
|     std::deque<gr_complex> d_E_history; | ||||
|   | ||||
| @@ -85,22 +85,21 @@ bool cpu_multicorrelator::set_input_output_vectors(std::complex<float>* corr_out | ||||
|     return true; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void cpu_multicorrelator::update_local_code(int correlator_length_samples,float rem_code_phase_chips, float code_phase_step_chips) | ||||
| { | ||||
|     float local_code_chip_index; | ||||
|     int local_code_chip_index; | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < d_n_correlators; current_correlator_tap++) | ||||
|         { | ||||
|             for (int n = 0; n < correlator_length_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index = std::fmod(code_phase_step_chips*static_cast<float>(n)+ d_shifts_chips[current_correlator_tap] - rem_code_phase_chips, d_code_length_chips); | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index < 0.0) local_code_chip_index += d_code_length_chips; | ||||
|                     d_local_codes_resampled[current_correlator_tap][n] = d_local_code_in[static_cast<int>(round(local_code_chip_index))]; | ||||
|                 } | ||||
|         } | ||||
| 	{ | ||||
| 		for (int n = 0; n < correlator_length_samples; n++) | ||||
| 		{ | ||||
| 		   // resample code for current tap | ||||
| 		   local_code_chip_index = floor(code_phase_step_chips*static_cast<float>(n) + d_shifts_chips[current_correlator_tap]- rem_code_phase_chips); | ||||
| 		   local_code_chip_index = local_code_chip_index % d_code_length_chips; | ||||
| 		   //Take into account that in multitap correlators, the shifts can be negative! | ||||
| 		   if (local_code_chip_index < 0) local_code_chip_index += d_code_length_chips; | ||||
| 		   d_local_codes_resampled[current_correlator_tap][n] = d_local_code_in[local_code_chip_index]; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas