mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +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(); |     Gnss_Synchro current_synchro_data = Gnss_Synchro(); | ||||||
|  |  | ||||||
|     // process vars |     // 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 code_error_filt_secs_Ti = 0.0; | ||||||
|     double CURRENT_INTEGRATION_TIME_S; |     double CURRENT_INTEGRATION_TIME_S; | ||||||
|     double CORRECTED_INTEGRATION_TIME_S; |     double CORRECTED_INTEGRATION_TIME_S; | ||||||
|     double dll_code_error_secs_Ti = 0.0; |     double dll_code_error_secs_Ti = 0.0; | ||||||
|     double carr_phase_error_secs_Ti = 0.0; |  | ||||||
|     double old_d_rem_code_phase_samples; |     double old_d_rem_code_phase_samples; | ||||||
|     if (d_enable_tracking == true) |     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) | 		            if (d_preamble_synchronized==false) | ||||||
| 		            { | 		            { | ||||||
| 		            		d_preamble_synchronized=true; | 		            		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; | 					current_synchro_data.symbol_integration_enabled=true; | ||||||
| 					// UPDATE INTEGRATION TIME | 					// 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) | 					if(d_preamble_synchronized==true) | ||||||
| 					{ | 					{ | ||||||
| 						// continue extended coherent correlation | 						// 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_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 | 						// disable tracking loop and inform telemetry decoder | ||||||
| 						enable_dll_pll=false; | 						enable_dll_pll=false; | ||||||
| 					}else{ | 					}else{ | ||||||
| @@ -435,12 +448,12 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec | |||||||
| 			{ | 			{ | ||||||
| 				// ################## PLL ########################################################## | 				// ################## PLL ########################################################## | ||||||
| 				// Update PLL discriminator [rads/Ti -> Secs/Ti] | 				// 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 | 				// Carrier discriminator filter | ||||||
| 				// NOTICE: The carrier loop filter includes the Carrier Doppler accumulator, as described in Kaplan | 				// 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; | 				//d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_phase_error_filt_secs_ti/INTEGRATION_TIME; | ||||||
| 				// Input [s/Ti] -> output [Hz] | 				// 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] | 				// 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; | 				d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz * CURRENT_INTEGRATION_TIME_S) / GPS_L1_FREQ_HZ; | ||||||
| 				// code Doppler frequency update | 				// 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 ########################################################## | ||||||
| 				// DLL discriminator | 				// 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 discriminator filter | ||||||
| 				code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips_Ti); //input [chips/Ti] -> output [chips/second] | 				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 = code_error_filt_chips*CURRENT_INTEGRATION_TIME_S/d_code_freq_chips; // [s/Ti] | 				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 estimation [s/Ti] | ||||||
| 				dll_code_error_secs_Ti = - code_error_filt_secs_Ti + d_pll_to_dll_assist_secs_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)); |                     d_dump_file.write(reinterpret_cast<char*>(&d_code_freq_chips), sizeof(double)); | ||||||
|  |  | ||||||
|                     //PLL commands |                     //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)); |                     d_dump_file.write(reinterpret_cast<char*>(&d_carrier_doppler_hz), sizeof(double)); | ||||||
|  |  | ||||||
|                     //DLL commands |                     //DLL commands | ||||||
|                     d_dump_file.write(reinterpret_cast<char*>(&code_error_chips_Ti), sizeof(double)); |                     d_dump_file.write(reinterpret_cast<char*>(&d_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_filt_chips), sizeof(double)); | ||||||
|  |  | ||||||
|                     // CN0 and carrier lock test |                     // 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_CN0_SNV_dB_Hz), sizeof(double)); | ||||||
|                     d_dump_file.write(reinterpret_cast<char*>(&d_carrier_lock_test), sizeof(double)); |                     d_dump_file.write(reinterpret_cast<char*>(&d_carrier_lock_test), sizeof(double)); | ||||||
|  |  | ||||||
|                     // AUX vars (for debug purposes) |                     // 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)); |                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||||
|                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); |                     tmp_double = static_cast<double>(d_sample_counter + d_correlation_length_samples); | ||||||
|                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); |                     d_dump_file.write(reinterpret_cast<char*>(&tmp_double), sizeof(double)); | ||||||
|   | |||||||
| @@ -160,6 +160,9 @@ private: | |||||||
|     double d_acc_carrier_phase_cycles; |     double d_acc_carrier_phase_cycles; | ||||||
|     double d_code_phase_samples; |     double d_code_phase_samples; | ||||||
|     double d_pll_to_dll_assist_secs_Ti; |     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 |     // symbol history to detect bit transition | ||||||
|     std::deque<gr_complex> d_E_history; |     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; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void cpu_multicorrelator::update_local_code(int correlator_length_samples,float rem_code_phase_chips, float code_phase_step_chips) | 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 current_correlator_tap = 0; current_correlator_tap < d_n_correlators; current_correlator_tap++) | ||||||
|         { | 	{ | ||||||
|             for (int n = 0; n < correlator_length_samples; n++) | 		for (int n = 0; n < correlator_length_samples; n++) | ||||||
|                 { | 		{ | ||||||
|                     // resample code for current tap | 		   // 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); | 		   local_code_chip_index = floor(code_phase_step_chips*static_cast<float>(n) + d_shifts_chips[current_correlator_tap]- rem_code_phase_chips); | ||||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | 		   local_code_chip_index = local_code_chip_index % d_code_length_chips; | ||||||
|                     if (local_code_chip_index < 0.0) local_code_chip_index += d_code_length_chips; | 		   //Take into account that in multitap correlators, the shifts can be negative! | ||||||
|                     d_local_codes_resampled[current_correlator_tap][n] = d_local_code_in[static_cast<int>(round(local_code_chip_index))]; | 		   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