From 14e109983a34a1349188dac1762664fe0f7eee09 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Wed, 9 Mar 2016 15:29:00 +0100 Subject: [PATCH 1/9] Added confguration option to set DLL and PLL bandwidth for 20 ms extended correlation in C_Aid GPS L1 CA tracking (dll_bw_narrow_hz and pll_bw_narrow_hz) --- .../adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc | 8 ++++++++ .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 12 +++++++++--- .../gps_l1_ca_dll_pll_c_aid_tracking_cc.h | 8 ++++++++ .../gps_l1_ca_dll_pll_c_aid_tracking_sc.cc | 10 +++++++++- .../gps_l1_ca_dll_pll_c_aid_tracking_sc.h | 10 ++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc index 436c68e60..fe9eb4d4c 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc @@ -60,7 +60,9 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( std::string dump_filename; std::string default_item_type = "gr_complex"; float pll_bw_hz; + float pll_bw_narrow_hz; float dll_bw_hz; + float dll_bw_narrow_hz; float early_late_space_chips; item_type_ = configuration->property(role + ".item_type", default_item_type); //vector_length = configuration->property(role + ".vector_length", 2048); @@ -69,6 +71,8 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( dump = configuration->property(role + ".dump", false); pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); + pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 20.0); + dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", @@ -88,6 +92,8 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( dump_filename, pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, + dll_bw_narrow_hz, early_late_space_chips); DLOG(INFO) << "tracking(" << tracking_cc->unique_id() << ")"; }else if(item_type_.compare("cshort") == 0) @@ -102,6 +108,8 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( dump_filename, pll_bw_hz, dll_bw_hz, + pll_bw_narrow_hz, + dll_bw_narrow_hz, early_late_space_chips); DLOG(INFO) << "tracking(" << tracking_sc->unique_id() << ")"; }else diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index b7304512a..eba5c0795 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -67,10 +67,12 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_cc( std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips) { return gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr(new gps_l1_ca_dll_pll_c_aid_tracking_cc(if_freq, - fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); + fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz,pll_bw_narrow_hz, dll_bw_narrow_hz, early_late_space_chips)); } @@ -106,6 +108,8 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips) : gr::block("gps_l1_ca_dll_pll_c_aid_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) @@ -129,6 +133,8 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( // Initialize tracking ========================================== d_pll_bw_hz=pll_bw_hz; d_dll_bw_hz=dll_bw_hz; + d_pll_bw_narrow_hz=pll_bw_narrow_hz; + d_dll_bw_narrow_hz=dll_bw_narrow_hz; d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); d_carrier_loop_filter.set_params(10.0, d_pll_bw_hz,2); @@ -394,8 +400,8 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec current_synchro_data.symbol_integration_enabled=true; // UPDATE INTEGRATION TIME CURRENT_INTEGRATION_TIME_S = static_cast(GPS_CA_TELEMETRY_SYMBOLS_PER_BIT)*GPS_L1_CA_CODE_PERIOD; - d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); - d_carrier_loop_filter.set_params(10.0, d_pll_bw_hz/5,2); + d_code_loop_filter.set_DLL_BW(d_dll_bw_narrow_hz); + d_carrier_loop_filter.set_params(10.0, d_pll_bw_narrow_hz,2); enable_dll_pll=true; }else{ diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h index 3d4cf3272..5df1ad8c4 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h @@ -64,6 +64,8 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_cc(long if_freq, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); @@ -96,6 +98,8 @@ private: std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); gps_l1_ca_dll_pll_c_aid_tracking_cc(long if_freq, @@ -106,6 +110,8 @@ private: std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); // tracking configuration vars @@ -145,6 +151,8 @@ private: // tracking vars float d_dll_bw_hz; float d_pll_bw_hz; + float d_dll_bw_narrow_hz; + float d_pll_bw_narrow_hz; double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc index d74738e4d..12b8351bf 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.cc @@ -66,10 +66,12 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_sc( std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips) { return gps_l1_ca_dll_pll_c_aid_tracking_sc_sptr(new gps_l1_ca_dll_pll_c_aid_tracking_sc(if_freq, - fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); + fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, pll_bw_narrow_hz, dll_bw_narrow_hz, early_late_space_chips)); } @@ -94,6 +96,8 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::gps_l1_ca_dll_pll_c_aid_tracking_sc( std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips) : gr::block("gps_l1_ca_dll_pll_c_aid_tracking_sc", gr::io_signature::make(1, 1, sizeof(lv_16sc_t)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) @@ -108,6 +112,10 @@ gps_l1_ca_dll_pll_c_aid_tracking_sc::gps_l1_ca_dll_pll_c_aid_tracking_sc( d_correlation_length_samples = static_cast(d_vector_length); // Initialize tracking ========================================== + d_pll_bw_hz=pll_bw_hz; + d_dll_bw_hz=dll_bw_hz; + d_pll_bw_narrow_hz=pll_bw_narrow_hz; + d_dll_bw_narrow_hz=dll_bw_narrow_hz; d_code_loop_filter.set_DLL_BW(dll_bw_hz); d_carrier_loop_filter.set_params(10.0, pll_bw_hz,2); diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.h index adfccfb08..ab0efd957 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_sc.h @@ -67,6 +67,8 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_sc(long if_freq, std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); @@ -99,6 +101,8 @@ private: std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); gps_l1_ca_dll_pll_c_aid_tracking_sc(long if_freq, @@ -109,6 +113,8 @@ private: std::string dump_filename, float pll_bw_hz, float dll_bw_hz, + float pll_bw_narrow_hz, + float dll_bw_narrow_hz, float early_late_space_chips); // tracking configuration vars @@ -148,6 +154,10 @@ private: double d_acq_carrier_doppler_hz; // tracking vars + float d_dll_bw_hz; + float d_pll_bw_hz; + float d_dll_bw_narrow_hz; + float d_pll_bw_narrow_hz; double d_code_freq_chips; double d_code_phase_step_chips; double d_carrier_doppler_hz; From 6e076e81430db1a800e5717c06b2113f7d90dd7e Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Fri, 11 Mar 2016 18:32:56 +0100 Subject: [PATCH 2/9] Fixing bugs in extended correlator for GPS L1 --- conf/gnss-sdr_Hybrid_gr_complex.conf | 347 ++++++++++++++++++ .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 43 ++- .../gps_l1_ca_dll_pll_c_aid_tracking_cc.h | 3 + .../tracking/libs/cpu_multicorrelator.cc | 25 +- 4 files changed, 390 insertions(+), 28 deletions(-) create mode 100644 conf/gnss-sdr_Hybrid_gr_complex.conf diff --git a/conf/gnss-sdr_Hybrid_gr_complex.conf b/conf/gnss-sdr_Hybrid_gr_complex.conf new file mode 100644 index 000000000..2a0a57c97 --- /dev/null +++ b/conf/gnss-sdr_Hybrid_gr_complex.conf @@ -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 diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index eba5c0795..4f9880464 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -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="< Date: Wed, 16 Mar 2016 17:32:20 +0100 Subject: [PATCH 4/9] Added configuration option to customize the extension of the GPS L1 CA correlation length after bit synchronization (options are: [1,2,4,5,10,20] ms). Increasing resolution in CN0 estimator internal variables. --- .../gps_l1_ca_dll_pll_c_aid_tracking.cc | 4 ++ .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 37 ++++++++++++------- .../gps_l1_ca_dll_pll_c_aid_tracking_cc.h | 6 ++- .../tracking/libs/lock_detectors.cc | 21 ++++++----- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc index fe9eb4d4c..a3aea8d1a 100644 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc +++ b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_c_aid_tracking.cc @@ -73,6 +73,9 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); pll_bw_narrow_hz = configuration->property(role + ".pll_bw_narrow_hz", 20.0); dll_bw_narrow_hz = configuration->property(role + ".dll_bw_narrow_hz", 2.0); + int extend_correlation_ms; + extend_correlation_ms = configuration->property(role + ".extend_correlation_ms", 1); + early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); std::string default_dump_filename = "./track_ch"; dump_filename = configuration->property(role + ".dump_filename", @@ -94,6 +97,7 @@ GpsL1CaDllPllCAidTracking::GpsL1CaDllPllCAidTracking( dll_bw_hz, pll_bw_narrow_hz, dll_bw_narrow_hz, + extend_correlation_ms, early_late_space_chips); DLOG(INFO) << "tracking(" << tracking_cc->unique_id() << ")"; }else if(item_type_.compare("cshort") == 0) diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index 57b173664..4377c55f6 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -69,10 +69,11 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_cc( float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, + int extend_correlation_ms, float early_late_space_chips) { return gps_l1_ca_dll_pll_c_aid_tracking_cc_sptr(new gps_l1_ca_dll_pll_c_aid_tracking_cc(if_freq, - fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz,pll_bw_narrow_hz, dll_bw_narrow_hz, early_late_space_chips)); + fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz,pll_bw_narrow_hz, dll_bw_narrow_hz, extend_correlation_ms, early_late_space_chips)); } @@ -90,10 +91,10 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index(pmt::pmt_t { //pmt::print(msg); DLOG(INFO) << "Extended correlation for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)<< std::endl; - if (d_enable_20ms_integration==false) //avoid re-setting preamble indicator + if (d_enable_extended_integration==false) //avoid re-setting preamble indicator { d_preamble_index=pmt::to_long(msg); - d_enable_20ms_integration=true; + d_enable_extended_integration=true; d_preamble_synchronized=false; } } @@ -110,6 +111,7 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, + int extend_correlation_ms, float early_late_space_chips) : gr::block("gps_l1_ca_dll_pll_c_aid_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) @@ -135,6 +137,7 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( d_dll_bw_hz=dll_bw_hz; d_pll_bw_narrow_hz=pll_bw_narrow_hz; d_dll_bw_narrow_hz=dll_bw_narrow_hz; + d_extend_correlation_ms = extend_correlation_ms; d_code_loop_filter.set_DLL_BW(d_dll_bw_hz); d_carrier_loop_filter.set_params(10.0, d_pll_bw_hz,2); @@ -206,7 +209,7 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( d_rem_code_phase_chips = 0.0; d_code_phase_step_chips = 0.0; d_carrier_phase_step_rad = 0.0; - d_enable_20ms_integration=false; + d_enable_extended_integration=false; d_preamble_synchronized=false; //set_min_output_buffer((long int)300); } @@ -291,7 +294,7 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::start_tracking() // enable tracking d_pull_in = true; d_enable_tracking = true; - d_enable_20ms_integration=false; + d_enable_extended_integration=false; d_preamble_synchronized=false; LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz << " Code Phase correction [samples]=" << delay_correction_samples @@ -364,7 +367,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec d_P_history.push_back(d_correlator_outs[1]); // save prompt output d_L_history.push_back(d_correlator_outs[2]); // save late output - if (d_P_history.size()>GPS_CA_TELEMETRY_SYMBOLS_PER_BIT) + if (d_P_history.size()>d_extend_correlation_ms) { d_E_history.pop_front(); d_P_history.pop_front(); @@ -372,10 +375,10 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec } bool enable_dll_pll; - if (d_enable_20ms_integration==true) + if (d_enable_extended_integration==true) { long int symbol_diff=d_symbol_counter-d_preamble_index; - if (symbol_diff % GPS_CA_TELEMETRY_SYMBOLS_PER_BIT == 0) + if (symbol_diff % d_extend_correlation_ms == 0) { // compute coherent integration and enable tracking loop // perform coherent integration using correlator output history @@ -384,7 +387,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec d_correlator_outs[0]=gr_complex(0.0,0.0); d_correlator_outs[1]=gr_complex(0.0,0.0); d_correlator_outs[2]=gr_complex(0.0,0.0); - for (int n=0;n(GPS_CA_TELEMETRY_SYMBOLS_PER_BIT)*GPS_L1_CA_CODE_PERIOD; + CURRENT_INTEGRATION_TIME_S = static_cast(d_extend_correlation_ms)*GPS_L1_CA_CODE_PERIOD; enable_dll_pll=true; @@ -410,6 +413,7 @@ 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 + //TODO: Take into account the extended correlation to update the accumulated carrier phase for carrier phase observables!! //remnant carrier phase [rads] d_rem_carrier_phase_rad = fmod(d_rem_carrier_phase_rad + d_carrier_phase_step_rad * static_cast(d_correlation_length_samples), GPS_TWO_PI); @@ -523,8 +527,13 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec { d_cn0_estimation_counter = 0; // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); - // Carrier lock indicator + if (current_synchro_data.symbol_integration_enabled==false) + { + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); + }else{ + d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS*d_extend_correlation_ms); + } + // Carrier lock indicator d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); // Loss of lock detection if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) @@ -588,7 +597,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec { d_last_seg = floor(d_sample_counter / d_fs_in); std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl; - DLOG(INFO) << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) + std::cout << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; //if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock! } @@ -598,7 +607,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec if (floor(d_sample_counter / d_fs_in) != d_last_seg) { d_last_seg = floor(d_sample_counter / d_fs_in); - DLOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) + std::cout << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"; } } diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h index fec006c3f..6183a2f28 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h @@ -67,6 +67,7 @@ gps_l1_ca_dll_pll_c_aid_make_tracking_cc(long if_freq, float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, + int extend_correlation_ms, float early_late_space_chips); @@ -101,6 +102,7 @@ private: float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, + int extend_correlation_ms, float early_late_space_chips); gps_l1_ca_dll_pll_c_aid_tracking_cc(long if_freq, @@ -113,6 +115,7 @@ private: float dll_bw_hz, float pll_bw_narrow_hz, float dll_bw_narrow_hz, + int extend_correlation_ms, float early_late_space_chips); // tracking configuration vars @@ -173,7 +176,8 @@ private: std::deque d_L_history; long int d_preamble_index; long int d_symbol_counter; - bool d_enable_20ms_integration; + int d_extend_correlation_ms; + bool d_enable_extended_integration; bool d_preamble_synchronized; int d_correlation_symbol_counter; void msg_handler_preamble_index(pmt::pmt_t msg); diff --git a/src/algorithms/tracking/libs/lock_detectors.cc b/src/algorithms/tracking/libs/lock_detectors.cc index 17dafdcfe..f759ee8e5 100644 --- a/src/algorithms/tracking/libs/lock_detectors.cc +++ b/src/algorithms/tracking/libs/lock_detectors.cc @@ -67,21 +67,22 @@ */ float cn0_svn_estimator(gr_complex* Prompt_buffer, int length, long fs_in, double code_length) { - float SNR = 0; - float SNR_dB_Hz = 0; - float Psig = 0; - float Ptot = 0; + double SNR = 0; + double SNR_dB_Hz = 0; + double Psig = 0; + double Ptot = 0; for (int i=0; i(Prompt_buffer[i].real())); + Ptot += static_cast(Prompt_buffer[i].imag()) * static_cast(Prompt_buffer[i].imag()) + + static_cast(Prompt_buffer[i].real()) * static_cast(Prompt_buffer[i].real()); } - Psig = Psig / (float)length; + Psig = Psig / static_cast(length); Psig = Psig * Psig; - Ptot = Ptot / (float)length; + Ptot = Ptot / static_cast(length); SNR = Psig / (Ptot - Psig); - SNR_dB_Hz = 10 * log10(SNR) + 10 * log10(fs_in/2) - 10 * log10((float)code_length); - return SNR_dB_Hz; + SNR_dB_Hz = 10 * log10(SNR) + 10 * log10(static_cast(fs_in)/2) - 10 * log10(code_length); + return static_cast(SNR_dB_Hz); } From 840bb1b9a347eb3010f9cacffb50fe22e7aece2f Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Thu, 17 Mar 2016 18:54:41 +0100 Subject: [PATCH 5/9] Work on the telemetry decoder to support the variable-length correlator in GPS L1 CA tracking --- .../gps_l1_ca_telemetry_decoder_cc.cc | 197 ++++++++---------- .../gps_l1_ca_telemetry_decoder_cc.h | 7 +- .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 47 +++-- src/core/system_parameters/GPS_L1_CA.h | 1 + src/core/system_parameters/gnss_synchro.h | 2 +- 5 files changed, 122 insertions(+), 132 deletions(-) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index e99b48989..97db35e1f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -59,16 +59,16 @@ gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, boost::shared_ptr< -void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) -{ - if (noutput_items != 0) - { - for (unsigned i = 0; i < 3; i++) - { - ninput_items_required[i] = d_samples_per_bit * 8; //set the required sample history - } - } -} +//void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) +//{ +// if (noutput_items != 0) +// { +// for (unsigned i = 0; i < 3; i++) +// { +// ninput_items_required[i] = d_samples_per_bit * 8; //set the required sample history +// } +// } +//} @@ -181,114 +181,101 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer - // TODO Optimize me! - if (in[0][d_samples_per_bit*8 - 1].symbol_integration_enabled==false) + // keep the last valid symbols + if (in[0]->Flag_valid_symbol_output==true) { - //******* preamble correlation ******** - for (unsigned int i = 0; i < d_samples_per_bit*8; i++) + d_symbol_history.push_back(in[0]->Prompt_I); + if (static_cast(d_symbol_history.size())>GPS_CA_PREAMBLE_LENGTH_SYMBOLS) { - if (in[0][i].Prompt_I < 0) // symbols clipping - { - corr_value -= d_preambles_symbols[i]; - } - else - { - corr_value += d_preambles_symbols[i]; - } + d_symbol_history.pop_front(); } - }else{ - //******* preamble correlation ******** - for (unsigned int i = 0; i < d_samples_per_bit*8; i++) - { - if (in[0][i].Flag_valid_symbol_output==true) - { - if (in[0][i].Prompt_I < 0) // symbols clipping + + if (d_symbol_history.size()==GPS_CA_PREAMBLE_LENGTH_SYMBOLS) + { + //******* preamble correlation ******** + int current_symbol_index=0; + for (int i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS/in[0]->correlation_length_ms; i++) + { + current_symbol_index=i*in[0]->correlation_length_ms;//+static_cast(floor(in[0]->correlation_length_ms/2)); + if (d_symbol_history.at(i) < 0) // symbols clipping { - corr_value -= d_preambles_symbols[i]*d_samples_per_bit; + //symbol weight expansion using the current tracking correlation length + corr_value -= d_preambles_symbols[current_symbol_index]*in[0]->correlation_length_ms; } else { - corr_value += d_preambles_symbols[i]*d_samples_per_bit; + //symbol weight expansion using the current tracking correlation length + corr_value += d_preambles_symbols[current_symbol_index]*in[0]->correlation_length_ms; } - } - } + } + } + if (abs(corr_value)>120) + { + std::cout<d_satellite; - d_symbol_accumulator = 0; //sync the symbol to bits integrator - d_symbol_accumulator_counter = 0; - d_frame_bit_index = 7; - d_stat = 1; // enter into frame pre-detection status - } - else if (d_stat == 1) //check 6 seconds of preamble separation - { - preamble_diff = d_sample_counter - d_preamble_index; - if (abs(preamble_diff - 6000) < 1) - { - d_GPS_FSM.Event_gps_word_preamble(); - d_flag_preamble = true; - d_preamble_index = d_sample_counter; //record the preamble sample stamp (t_P) - d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs;// - d_preamble_duration_seconds; //record the PRN start sample index associated to the preamble - d_frame_bit_index = 7; - if (!d_flag_frame_sync) - { - //send asynchronous message to tracking to inform of frame sync and extend correlation time - pmt::pmt_t value = pmt::from_long(d_preamble_index-1); - this->message_port_pub(pmt::mp("preamble_index"),value); + if (abs(corr_value) == GPS_CA_PREAMBLE_LENGTH_SYMBOLS) + { + if (d_stat == 0) + { + d_GPS_FSM.Event_gps_word_preamble(); + d_preamble_index = d_sample_counter;//record the preamble sample stamp + std::cout << "Preamble detection for SAT " << this->d_satellite; + d_symbol_accumulator = 0; //sync the symbol to bits integrator + d_symbol_accumulator_counter = 0; + d_frame_bit_index = 7; + d_stat = 1; // enter into frame pre-detection status + } + else if (d_stat == 1) //check 6 seconds of preamble separation + { + preamble_diff = d_sample_counter - d_preamble_index; + if (abs(preamble_diff - 6000) < 1) + { + std::cout <<"preamble! corr lenght="<correlation_length_ms<message_port_pub(pmt::mp("preamble_index"),value); - d_flag_frame_sync = true; - if (corr_value < 0) - { - flag_PLL_180_deg_phase_locked = true; //PLL is locked to opposite phase! - DLOG(INFO) << " PLL in opposite phase for Sat "<< this->d_satellite.get_PRN(); - } - else - { - flag_PLL_180_deg_phase_locked = false; - } - DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; - } - } - } - } - else - { - if (d_stat == 1) - { - preamble_diff = d_sample_counter - d_preamble_index; - if (preamble_diff > 6001) - { - DLOG(INFO) << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff; - d_stat = 0; //lost of frame sync - d_flag_frame_sync = false; - flag_TOW_set = false; - } - } - } + d_flag_frame_sync = true; + if (corr_value < 0) + { + flag_PLL_180_deg_phase_locked = true; //PLL is locked to opposite phase! + std::cout << " PLL in opposite phase for Sat "<< this->d_satellite.get_PRN(); + } + else + { + flag_PLL_180_deg_phase_locked = false; + } + std::cout << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; + } + }else{ + if (preamble_diff > 6001) + { + std::cout << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff; + d_stat = 0; //lost of frame sync + d_flag_frame_sync = false; + flag_TOW_set = false; + } + } + } + } //******* SYMBOL TO BIT ******* - if (in[0][d_samples_per_bit*8 - 1].Flag_valid_symbol_output==true) + if (in[0]->Flag_valid_symbol_output==true) { - if (in[0][d_samples_per_bit*8 - 1].symbol_integration_enabled==true) - { - // extended correlation to bit period is enabled in tracking! - // 1 symbol = 1 bit - d_symbol_accumulator = in[0][d_samples_per_bit*8 - 1].Prompt_I; // accumulate the input value in d_symbol_accumulator - d_symbol_accumulator_counter=20; - }else{ - // 20 symbols = 1 bit: do symbols integration in telemetry decoder - d_symbol_accumulator += in[0][d_samples_per_bit*8 - 1].Prompt_I; // accumulate the input value in d_symbol_accumulator - d_symbol_accumulator_counter++; - } + // extended correlation to bit period is enabled in tracking! + d_symbol_accumulator += in[0]->Prompt_I; // accumulate the input value in d_symbol_accumulator + d_symbol_accumulator_counter+=in[0]->correlation_length_ms; } if (d_symbol_accumulator_counter == 20 ) @@ -342,8 +329,6 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i { d_GPS_frame_4bytes <<= 1; //shift 1 bit left the telemetry word } - - } // output the frame consume_each(1); //one by one @@ -381,8 +366,8 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i if (flag_PLL_180_deg_phase_locked == true) { - //correct the accumulated phase for the costas loop phase shift, if required - current_synchro_data.Carrier_phase_rads += GPS_PI; + //correct the accumulated phase for the costas loop phase shift, if required + current_synchro_data.Carrier_phase_rads += GPS_PI; } if(d_dump == true) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h index bd6713ff4..303684fe1 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h @@ -85,7 +85,7 @@ public: * \brief Function which tells the scheduler how many input items * are required to produce noutput_items output items. */ - void forecast (int noutput_items, gr_vector_int &ninput_items_required); + //void forecast (int noutput_items, gr_vector_int &ninput_items_required); private: friend gps_l1_ca_telemetry_decoder_cc_sptr @@ -107,6 +107,7 @@ private: bool d_flag_frame_sync; // symbols + std::deque d_symbol_history; double d_symbol_accumulator; short int d_symbol_accumulator_counter; @@ -138,10 +139,6 @@ private: double d_TOW_at_Preamble; double d_TOW_at_current_symbol; - std::deque d_symbol_TOW_queue_s; - // Doppler and Phase accumulator queue for interpolation in Observables - std::deque d_carrier_doppler_queue_hz; - std::deque d_acc_carrier_phase_queue_rads; double Prn_timestamp_at_preamble_ms; bool flag_TOW_set; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index 4377c55f6..7dbe01681 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -347,6 +347,8 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec d_pull_in = false; // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; + current_synchro_data.correlation_length_ms=1; + current_synchro_data.Flag_valid_symbol_output = false; *out[0] = current_synchro_data; consume_each(samples_offset); //shift input to perform alignment with local replica d_symbol_counter++; @@ -361,13 +363,13 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec multicorrelator_cpu.set_input_output_vectors(d_correlator_outs,in); multicorrelator_cpu.Carrier_wipeoff_multicorrelator_resampler(d_rem_carrier_phase_rad, d_carrier_phase_step_rad, d_rem_code_phase_chips, d_code_phase_step_chips, d_correlation_length_samples); - // ####### 20ms coherent intergration extension (experimental) - // keep the last 40 symbols (2 bits to detect transitions) + // ####### coherent intergration extension + // keep the last symbols d_E_history.push_back(d_correlator_outs[0]); // save early output d_P_history.push_back(d_correlator_outs[1]); // save prompt output d_L_history.push_back(d_correlator_outs[2]); // save late output - if (d_P_history.size()>d_extend_correlation_ms) + if (static_cast(d_P_history.size())>d_extend_correlation_ms) { d_E_history.pop_front(); d_P_history.pop_front(); @@ -382,7 +384,6 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec { // compute coherent integration and enable tracking loop // perform coherent integration using correlator output history - //gr_complex d_correlator_outs_2[3]; //std::cout<<"##### RESET COHERENT INTEGRATION ####"<PRN) + DLOG(INFO) << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; //if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock! } @@ -607,7 +614,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec if (floor(d_sample_counter / d_fs_in) != d_last_seg) { d_last_seg = floor(d_sample_counter / d_fs_in); - std::cout << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) + DLOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"; } } diff --git a/src/core/system_parameters/GPS_L1_CA.h b/src/core/system_parameters/GPS_L1_CA.h index bbe96db49..26920175a 100644 --- a/src/core/system_parameters/GPS_L1_CA.h +++ b/src/core/system_parameters/GPS_L1_CA.h @@ -74,6 +74,7 @@ const int GPS_L1_CA_HISTORY_DEEP = 100; #define GPS_PREAMBLE {1, 0, 0, 0, 1, 0, 1, 1} const int GPS_CA_PREAMBLE_LENGTH_BITS = 8; +const int GPS_CA_PREAMBLE_LENGTH_SYMBOLS = 160; const int GPS_CA_TELEMETRY_RATE_BITS_SECOND = 50; //!< NAV message bit rate [bits/s] const int GPS_CA_TELEMETRY_SYMBOLS_PER_BIT = 20; const int GPS_CA_TELEMETRY_RATE_SYMBOLS_SECOND = GPS_CA_TELEMETRY_RATE_BITS_SECOND*20; //!< NAV message bit rate [symbols/s] diff --git a/src/core/system_parameters/gnss_synchro.h b/src/core/system_parameters/gnss_synchro.h index d70c21b1b..5aea0d21b 100644 --- a/src/core/system_parameters/gnss_synchro.h +++ b/src/core/system_parameters/gnss_synchro.h @@ -61,7 +61,7 @@ public: double Tracking_timestamp_secs; //!< Set by Tracking processing block bool Flag_valid_tracking; bool Flag_valid_symbol_output; - bool symbol_integration_enabled; //!< Set by Tracking processing block + int correlation_length_ms; //!< Set by Tracking processing block //Telemetry Decoder double Prn_timestamp_ms; //!< Set by Telemetry Decoder processing block From 083350bd61b6729cc2224813ac6b35b72941cbd7 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Fri, 18 Mar 2016 17:36:29 +0100 Subject: [PATCH 6/9] Refactoring of GPS L1 CA telemetry decoder. PVT is not yet fully tested --- conf/gnss-sdr_Hybrid_gr_complex.conf | 12 ++- conf/gnss-sdr_Hybrid_nsr.conf | 15 ++- .../gps_l1_ca_telemetry_decoder_cc.cc | 99 +++++++++---------- .../gps_l1_ca_telemetry_decoder_cc.h | 1 + .../gps_l1_ca_dll_pll_c_aid_tracking_cc.cc | 19 ++-- src/core/system_parameters/GPS_L1_CA.h | 1 + 6 files changed, 75 insertions(+), 72 deletions(-) diff --git a/conf/gnss-sdr_Hybrid_gr_complex.conf b/conf/gnss-sdr_Hybrid_gr_complex.conf index 2a0a57c97..bb5b4031c 100644 --- a/conf/gnss-sdr_Hybrid_gr_complex.conf +++ b/conf/gnss-sdr_Hybrid_gr_complex.conf @@ -240,14 +240,20 @@ 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_ +;# Extended correlation after telemetry bit synchronization +;# Valid values are: [1,2,4,5,10,20] (integer divisors of the GPS L1 CA bit period (20 ms) ) +;# Longer integration period require more stable front-end LO + +Tracking_1C.extend_correlation_ms=5 + ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=20; -Tracking_1C.pll_bw_narrow_hz=5; +Tracking_1C.pll_bw_narrow_hz=10; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] -Tracking_1C.dll_bw_hz=4.0; +Tracking_1C.dll_bw_hz=3.0; -Tracking_1C.dll_bw_narrow_hz=1.5; +Tracking_1C.dll_bw_narrow_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking_1C.fll_bw_hz=2.0; diff --git a/conf/gnss-sdr_Hybrid_nsr.conf b/conf/gnss-sdr_Hybrid_nsr.conf index 1609800c9..6cbe05638 100644 --- a/conf/gnss-sdr_Hybrid_nsr.conf +++ b/conf/gnss-sdr_Hybrid_nsr.conf @@ -195,11 +195,11 @@ Acquisition_1C.sampled_ms=1 Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition Acquisition_1C.use_CFAR_algorithm=false; ;#threshold: Acquisition threshold -Acquisition_1C.threshold=40 +Acquisition_1C.threshold=10 ;#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=10000 +Acquisition_1C.doppler_max=5000 ;#doppler_max: Doppler step in the grid search [Hz] Acquisition_1C.doppler_step=250 @@ -243,11 +243,20 @@ 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_ +;# Extended correlation after telemetry bit synchronization +;# Valid values are: [1,2,4,5,10,20] (integer divisors of the GPS L1 CA bit period (20 ms) ) +;# Longer integration period require more stable front-end LO + +Tracking_1C.extend_correlation_ms=1 + ;#pll_bw_hz: PLL loop filter bandwidth [Hz] Tracking_1C.pll_bw_hz=40; +Tracking_1C.pll_bw_narrow_hz=20; ;#dll_bw_hz: DLL loop filter bandwidth [Hz] -Tracking_1C.dll_bw_hz=2.5; +Tracking_1C.dll_bw_hz=2.0; + +Tracking_1C.dll_bw_narrow_hz=2.0; ;#fll_bw_hz: FLL loop filter bandwidth [Hz] Tracking_1C.fll_bw_hz=2.0; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 97db35e1f..8fa708d74 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -36,6 +36,7 @@ #include "gps_l1_ca_telemetry_decoder_cc.h" #include +#include #include #include #include @@ -58,20 +59,6 @@ gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, boost::shared_ptr< } - -//void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) -//{ -// if (noutput_items != 0) -// { -// for (unsigned i = 0; i < 3; i++) -// { -// ninput_items_required[i] = d_samples_per_bit * 8; //set the required sample history -// } -// } -//} - - - gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( Gnss_Satellite satellite, boost::shared_ptr queue, @@ -94,14 +81,14 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( memcpy((unsigned short int*)this->d_preambles_bits, (unsigned short int*)preambles_bits, GPS_CA_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int)); - // preamble bits to sampled symbols + // preamble bits to sampled symbols (reversed) d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GPS_CA_PREAMBLE_LENGTH_BITS * d_samples_per_bit); int n = 0; for (int i = 0; i < GPS_CA_PREAMBLE_LENGTH_BITS; i++) { for (unsigned int j = 0; j < d_samples_per_bit; j++) { - if (d_preambles_bits[i] == 1) + if (d_preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS-i-1] == 1) { d_preambles_symbols[n] = 1; } @@ -181,39 +168,44 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer - // keep the last valid symbols + // record last symbols (clipped to +1,-1) and its correlation length to perform preamble correlation if (in[0]->Flag_valid_symbol_output==true) { - d_symbol_history.push_back(in[0]->Prompt_I); + d_symbol_history.push_front(in[0]->Prompt_I); + d_correlation_length_ms_history.push_front(in[0]->correlation_length_ms); if (static_cast(d_symbol_history.size())>GPS_CA_PREAMBLE_LENGTH_SYMBOLS) { - d_symbol_history.pop_front(); + d_symbol_history.pop_back(); + d_correlation_length_ms_history.pop_back(); } if (d_symbol_history.size()==GPS_CA_PREAMBLE_LENGTH_SYMBOLS) { - //******* preamble correlation ******** - int current_symbol_index=0; - for (int i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS/in[0]->correlation_length_ms; i++) - { - current_symbol_index=i*in[0]->correlation_length_ms;//+static_cast(floor(in[0]->correlation_length_ms/2)); - if (d_symbol_history.at(i) < 0) // symbols clipping - { - //symbol weight expansion using the current tracking correlation length - corr_value -= d_preambles_symbols[current_symbol_index]*in[0]->correlation_length_ms; - } - else - { - //symbol weight expansion using the current tracking correlation length - corr_value += d_preambles_symbols[current_symbol_index]*in[0]->correlation_length_ms; - } - } + + //******* preamble correlation (in reverse order due to the variable correlator length) + int input_symbol_index=0; + int preamble_index=0; + do{ + if (d_symbol_history.at(input_symbol_index) < 0) // symbols clipping + { + //symbol weight expansion using its tracking correlation length + corr_value -= d_preambles_symbols[preamble_index]*d_correlation_length_ms_history.at(input_symbol_index); + } + else + { + //symbol weight expansion using its tracking correlation length + corr_value += d_preambles_symbols[preamble_index]*d_correlation_length_ms_history.at(input_symbol_index); + } + preamble_index+=d_correlation_length_ms_history.at(input_symbol_index); + input_symbol_index++; + }while(preamble_index120) - { - std::cout<d_satellite; + DLOG(INFO) << "Preamble detection for SAT " << this->d_satellite <<" d_sample_counter="<correlation_length_ms; d_frame_bit_index = 7; d_stat = 1; // enter into frame pre-detection status } else if (d_stat == 1) //check 6 seconds of preamble separation { preamble_diff = d_sample_counter - d_preamble_index; - if (abs(preamble_diff - 6000) < 1) + if (abs(preamble_diff - GPS_SUBFRAME_MS) < 1) { - std::cout <<"preamble! corr lenght="<correlation_length_ms<d_satellite.get_PRN(); + DLOG(INFO) << " PLL in opposite phase for Sat "<< this->d_satellite.get_PRN(); } else { flag_PLL_180_deg_phase_locked = false; } - std::cout << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; + DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; } }else{ - if (preamble_diff > 6001) + if (preamble_diff > GPS_SUBFRAME_MS+1) { - std::cout << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff; + DLOG(INFO) << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff<<" d_sample_counter="<correlation_length_ms; } - if (d_symbol_accumulator_counter == 20 ) + if (d_symbol_accumulator_counter >= GPS_CA_TELEMETRY_SYMBOLS_PER_BIT ) { if (d_symbol_accumulator > 0) { //symbol to bit @@ -288,8 +281,9 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i d_symbol_accumulator_counter = 0; //******* bits to words ****** d_frame_bit_index++; - if (d_frame_bit_index == 30) + if (d_frame_bit_index == GPS_WORD_BITS) { + //std::cout<<"word bits = "<(d_GPS_frame_4bytes)< d_symbol_history; + std::deque d_correlation_length_ms_history; double d_symbol_accumulator; short int d_symbol_accumulator_counter; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index 7dbe01681..79f675778 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -90,7 +90,7 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::forecast (int noutput_items, void gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index(pmt::pmt_t msg) { //pmt::print(msg); - DLOG(INFO) << "Extended correlation for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)<< std::endl; + DLOG(INFO) << "Extended correlation enabled for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)<< std::endl; if (d_enable_extended_integration==false) //avoid re-setting preamble indicator { d_preamble_index=pmt::to_long(msg); @@ -380,7 +380,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec if (d_enable_extended_integration==true) { long int symbol_diff=d_symbol_counter-d_preamble_index; - if (symbol_diff % d_extend_correlation_ms == 0) + if (symbol_diff>0 and symbol_diff % d_extend_correlation_ms == 0) { // compute coherent integration and enable tracking loop // perform coherent integration using correlator output history @@ -400,7 +400,8 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec d_code_loop_filter.set_DLL_BW(d_dll_bw_narrow_hz); d_carrier_loop_filter.set_params(10.0, d_pll_bw_narrow_hz,2); d_preamble_synchronized=true; - std::cout<<"dll="<PRN) + <<" dll_narrow_bw="<connect(trk_->get_right_block(), 0, nav_->get_left_block(), 0); DLOG(INFO) << "tracking -> telemetry_decoder"; - top_block->msg_connect(nav_->get_left_block(),pmt::mp("preamble_index"),trk_->get_right_block(),pmt::mp("preamble_index")); + top_block->msg_connect(nav_->get_left_block(),pmt::mp("preamble_timestamp_s"),trk_->get_right_block(),pmt::mp("preamble_timestamp_s")); DLOG(INFO) << "MSG FEEDBACK CHANNEL telemetry_decoder -> tracking"; connected_ = true; diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc index 8fa708d74..e66fe7e1f 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc @@ -29,17 +29,10 @@ * ------------------------------------------------------------------------- */ -/*! - * \todo Clean this code and move the telemetry definitions to GPS_L1_CA system definitions file - */ - - #include "gps_l1_ca_telemetry_decoder_cc.h" #include -#include #include #include -#include #include #include "control_message_factory.h" #include "gnss_synchro.h" @@ -49,15 +42,17 @@ #endif using google::LogMessage; -/*! - * \todo name and move the magic numbers to GPS_L1_CA.h - */ + gps_l1_ca_telemetry_decoder_cc_sptr gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, boost::shared_ptr queue, bool dump) { return gps_l1_ca_telemetry_decoder_cc_sptr(new gps_l1_ca_telemetry_decoder_cc(satellite, queue, dump)); } +void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required) +{ + ninput_items_required[0] = GPS_CA_PREAMBLE_LENGTH_SYMBOLS; //set the required sample history +} gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( Gnss_Satellite satellite, @@ -66,29 +61,25 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( gr::block("gps_navigation_cc", gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { - // create asynchronous message ports - this->message_port_register_out(pmt::mp("preamble_index")); - + this->message_port_register_out(pmt::mp("preamble_timestamp_s")); // initialize internal vars d_queue = queue; d_dump = dump; d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); - d_samples_per_bit = ( GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS ) / GPS_CA_TELEMETRY_RATE_BITS_SECOND; - //d_preamble_duration_seconds = (1.0 / GPS_CA_TELEMETRY_RATE_BITS_SECOND) * GPS_CA_PREAMBLE_LENGTH_BITS; - //std::cout<<"d_preamble_duration_seconds="<d_preambles_bits, (unsigned short int*)preambles_bits, GPS_CA_PREAMBLE_LENGTH_BITS*sizeof(unsigned short int)); - // preamble bits to sampled symbols (reversed) - d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GPS_CA_PREAMBLE_LENGTH_BITS * d_samples_per_bit); + // preamble bits to sampled symbols + d_preambles_symbols = (signed int*)malloc(sizeof(signed int) * GPS_CA_PREAMBLE_LENGTH_SYMBOLS); int n = 0; for (int i = 0; i < GPS_CA_PREAMBLE_LENGTH_BITS; i++) { - for (unsigned int j = 0; j < d_samples_per_bit; j++) + for (unsigned int j = 0; j < GPS_CA_TELEMETRY_SYMBOLS_PER_BIT; j++) { - if (d_preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS-i-1] == 1) + if (d_preambles_bits[i] == 1) { d_preambles_symbols[n] = 1; } @@ -99,10 +90,7 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( n++; } } - d_sample_counter = 0; - //d_preamble_code_phase_seconds = 0; d_stat = 0; - d_preamble_index = 0; d_symbol_accumulator = 0; d_symbol_accumulator_counter = 0; d_frame_bit_index = 0; @@ -121,7 +109,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc( d_channel = 0; Prn_timestamp_at_preamble_ms = 0.0; flag_PLL_180_deg_phase_locked = false; - //set_history(d_samples_per_bit*8); // At least a history of 8 bits are needed to correlate with the preamble } @@ -131,8 +118,6 @@ gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc() d_dump_file.close(); } - - bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword) { unsigned int d1, d2, d3, d4, d5, d6, d7, t, parity; @@ -160,52 +145,29 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { int corr_value = 0; - int preamble_diff = 0; + int preamble_diff_ms = 0; Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; - d_sample_counter++; //count for the processed samples // ########### Output the tracking data to navigation and PVT ########## const Gnss_Synchro **in = (const Gnss_Synchro **) &input_items[0]; //Get the input samples pointer - // record last symbols (clipped to +1,-1) and its correlation length to perform preamble correlation - if (in[0]->Flag_valid_symbol_output==true) - { - d_symbol_history.push_front(in[0]->Prompt_I); - d_correlation_length_ms_history.push_front(in[0]->correlation_length_ms); - if (static_cast(d_symbol_history.size())>GPS_CA_PREAMBLE_LENGTH_SYMBOLS) + //******* preamble correlation ******** + for (unsigned int i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS; i++) { - d_symbol_history.pop_back(); - d_correlation_length_ms_history.pop_back(); - } - - if (d_symbol_history.size()==GPS_CA_PREAMBLE_LENGTH_SYMBOLS) - { - - //******* preamble correlation (in reverse order due to the variable correlator length) - int input_symbol_index=0; - int preamble_index=0; - do{ - if (d_symbol_history.at(input_symbol_index) < 0) // symbols clipping + if (in[0][i].Flag_valid_symbol_output==true) + { + if (in[0][i].Prompt_I < 0) // symbols clipping { - //symbol weight expansion using its tracking correlation length - corr_value -= d_preambles_symbols[preamble_index]*d_correlation_length_ms_history.at(input_symbol_index); + corr_value -= d_preambles_symbols[i]*in[0][i].correlation_length_ms; } else { - //symbol weight expansion using its tracking correlation length - corr_value += d_preambles_symbols[preamble_index]*d_correlation_length_ms_history.at(input_symbol_index); + corr_value += d_preambles_symbols[i]*in[0][i].correlation_length_ms; } - preamble_index+=d_correlation_length_ms_history.at(input_symbol_index); - input_symbol_index++; - }while(preamble_index=GPS_CA_PREAMBLE_LENGTH_SYMBOLS) break; + } d_flag_preamble = false; //******* frame sync ****************** @@ -214,30 +176,28 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i if (d_stat == 0) { d_GPS_FSM.Event_gps_word_preamble(); - d_preamble_index = d_sample_counter;//record the preamble sample stamp - DLOG(INFO) << "Preamble detection for SAT " << this->d_satellite <<" d_sample_counter="<correlation_length_ms; - d_frame_bit_index = 7; + d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs;//record the preamble sample stamp + DLOG(INFO) << "Preamble detection for SAT " << this->d_satellite << "in[0][0].Tracking_timestamp_secs="<d_satellite << "in[0][0].Tracking_timestamp_secs="<correlation_length_ms; - d_frame_bit_index = 7; + d_preamble_time_seconds = in[0][0].Tracking_timestamp_secs;//record the PRN start sample index associated to the preamble if (!d_flag_frame_sync) { //send asynchronous message to tracking to inform of frame sync and extend correlation time - pmt::pmt_t value = pmt::from_long(d_preamble_index-1); - this->message_port_pub(pmt::mp("preamble_index"),value); + pmt::pmt_t value = pmt::from_double(d_preamble_time_seconds-0.001); + this->message_port_pub(pmt::mp("preamble_timestamp_s"),value); d_flag_frame_sync = true; if (corr_value < 0) @@ -252,9 +212,9 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i DLOG(INFO) << " Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]"; } }else{ - if (preamble_diff > GPS_SUBFRAME_MS+1) + if (preamble_diff_ms > GPS_SUBFRAME_MS+1) { - DLOG(INFO) << "Lost of frame sync SAT " << this->d_satellite << " preamble_diff= " << preamble_diff<<" d_sample_counter="<d_satellite << " preamble_diff_ms= " << preamble_diff_ms<Flag_valid_symbol_output==true) + + if (in[0][0].Flag_valid_symbol_output==true) { // extended correlation to bit period is enabled in tracking! - d_symbol_accumulator += in[0]->Prompt_I; // accumulate the input value in d_symbol_accumulator - d_symbol_accumulator_counter+=in[0]->correlation_length_ms; + d_symbol_accumulator += in[0][0].Prompt_I; // accumulate the input value in d_symbol_accumulator + d_symbol_accumulator_counter+=in[0][0].correlation_length_ms; } - - if (d_symbol_accumulator_counter >= GPS_CA_TELEMETRY_SYMBOLS_PER_BIT ) + if (d_symbol_accumulator_counter == 20) { - if (d_symbol_accumulator > 0) - { //symbol to bit - d_GPS_frame_4bytes += 1; //insert the telemetry bit in LSB - } - d_symbol_accumulator = 0; - d_symbol_accumulator_counter = 0; + if (d_symbol_accumulator > 0) + { //symbol to bit + d_GPS_frame_4bytes += 1; //insert the telemetry bit in LSB + } + d_symbol_accumulator = 0; + d_symbol_accumulator_counter = 0; //******* bits to words ****** d_frame_bit_index++; - if (d_frame_bit_index == GPS_WORD_BITS) + if (d_frame_bit_index == 30) { - //std::cout<<"word bits = "<(d_GPS_frame_4bytes)< d_prn_start_sample_history; - double d_preamble_time_seconds; double d_TOW_at_Preamble; diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc index 79f675778..a15ec033b 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.cc @@ -93,7 +93,7 @@ void gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index(pmt::pmt_t DLOG(INFO) << "Extended correlation enabled for Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)<< std::endl; if (d_enable_extended_integration==false) //avoid re-setting preamble indicator { - d_preamble_index=pmt::to_long(msg); + d_preamble_timestamp_s=pmt::to_double(msg); d_enable_extended_integration=true; d_preamble_synchronized=false; } @@ -117,9 +117,9 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) { // create asynchronous message ports - this->message_port_register_in(pmt::mp("preamble_index")); + this->message_port_register_in(pmt::mp("preamble_timestamp_s")); - this->set_msg_handler(pmt::mp("preamble_index"), + this->set_msg_handler(pmt::mp("preamble_timestamp_s"), boost::bind(&gps_l1_ca_dll_pll_c_aid_tracking_cc::msg_handler_preamble_index, this, _1)); @@ -173,8 +173,7 @@ gps_l1_ca_dll_pll_c_aid_tracking_cc::gps_l1_ca_dll_pll_c_aid_tracking_cc( // sample synchronization d_sample_counter = 0; //(from trk to tlm) - // symbol synchronization (from tlm to trk) - d_symbol_counter =0; + //d_sample_counter_seconds = 0; d_acq_sample_stamp = 0; @@ -351,7 +350,6 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec current_synchro_data.Flag_valid_symbol_output = false; *out[0] = current_synchro_data; consume_each(samples_offset); //shift input to perform alignment with local replica - d_symbol_counter++; return 1; } @@ -379,7 +377,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec bool enable_dll_pll; if (d_enable_extended_integration==true) { - long int symbol_diff=d_symbol_counter-d_preamble_index; + long int symbol_diff=round(1000.0*((static_cast(d_sample_counter) + d_rem_code_phase_samples) / static_cast(d_fs_in)-d_preamble_timestamp_s)); if (symbol_diff>0 and symbol_diff % d_extend_correlation_ms == 0) { // compute coherent integration and enable tracking loop @@ -638,6 +636,7 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec current_synchro_data.System = {'G'}; current_synchro_data.Flag_valid_pseudorange = false; + current_synchro_data.correlation_length_ms=1; *out[0] = current_synchro_data; } @@ -703,7 +702,6 @@ int gps_l1_ca_dll_pll_c_aid_tracking_cc::general_work (int noutput_items, gr_vec { LOG(WARNING) << "noutput_items = 0"; } - d_symbol_counter++; return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false } diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h index 6183a2f28..c32f94ea7 100644 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h +++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_c_aid_tracking_cc.h @@ -174,8 +174,7 @@ private: std::deque d_E_history; std::deque d_P_history; std::deque d_L_history; - long int d_preamble_index; - long int d_symbol_counter; + double d_preamble_timestamp_s; int d_extend_correlation_ms; bool d_enable_extended_integration; bool d_preamble_synchronized; From e37824787e5fc2d00460ae302886949cdc614816 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Tue, 29 Mar 2016 18:12:59 +0200 Subject: [PATCH 8/9] Adding RX clock offset [s] storage in LS PVT class member --- src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc | 11 ++++++----- src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc | 17 +++++++++-------- src/algorithms/PVT/libs/hybrid_ls_pvt.cc | 16 ++++++---------- src/algorithms/PVT/libs/pvt_solution.h | 7 ++++--- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc b/src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc index 23ff0ef2c..5a7bb82b2 100644 --- a/src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc +++ b/src/algorithms/PVT/libs/galileo_e1_ls_pvt.cc @@ -57,7 +57,7 @@ galileo_e1_ls_pvt::galileo_e1_ls_pvt(int nchannels, std::string dump_filename, b d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } - catch (std::ifstream::failure e) + catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } @@ -164,7 +164,7 @@ bool galileo_e1_ls_pvt::get_PVT(std::map gnss_pseudoranges_map DLOG(INFO) << "obs="<< obs; DLOG(INFO) << "W=" << W; - mypos = galileo_e1_ls_pvt::leastSquarePos(satpos, obs, W); + mypos = leastSquarePos(satpos, obs, W); // Compute Gregorian time utc = galileo_utc_model.GST_to_UTC_time(GST, Galileo_week_number); @@ -176,7 +176,8 @@ bool galileo_e1_ls_pvt::get_PVT(std::map gnss_pseudoranges_map DLOG(INFO) << "Galileo Position at TOW=" << galileo_current_time << " in ECEF (X,Y,Z) = " << mypos; - galileo_e1_ls_pvt::cart2geo(static_cast(mypos(0)), static_cast(mypos(1)), static_cast(mypos(2)), 4); + cart2geo(static_cast(mypos(0)), static_cast(mypos(1)), static_cast(mypos(2)), 4); + d_rx_dt_m = mypos(3)/GALILEO_C_m_s; // Convert RX time offset from meters to seconds //ToDo: Find an Observables/PVT random bug with some satellite configurations that gives an erratic PVT solution (i.e. height>50 km) if (d_height_m > 50000) { @@ -185,10 +186,10 @@ bool galileo_e1_ls_pvt::get_PVT(std::map gnss_pseudoranges_map } DLOG(INFO) << "Galileo Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d - << " [deg], Height= " << d_height_m << " [m]"; + << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_m << " [s]"; // ###### Compute DOPs ######## - galileo_e1_ls_pvt::compute_DOP(); + compute_DOP(); // ######## LOG FILE ######### if(d_flag_dump_enabled == true) diff --git a/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc b/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc index 6b1ba45f3..67dac54c0 100644 --- a/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc +++ b/src/algorithms/PVT/libs/gps_l1_ca_ls_pvt.cc @@ -58,7 +58,7 @@ gps_l1_ca_ls_pvt::gps_l1_ca_ls_pvt(int nchannels, std::string dump_filename, boo d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } - catch (std::ifstream::failure e) + catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } @@ -167,11 +167,12 @@ bool gps_l1_ca_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, DLOG(INFO) << "obs=" << obs; DLOG(INFO) << "W=" << W; - mypos = gps_l1_ca_ls_pvt::leastSquarePos(satpos, obs, W); - + mypos = leastSquarePos(satpos, obs, W); DLOG(INFO) << "(new)Position at TOW=" << GPS_current_time << " in ECEF (X,Y,Z) = " << mypos; - gps_l1_ca_ls_pvt::cart2geo(mypos(0), mypos(1), mypos(2), 4); + cart2geo(static_cast(mypos(0)), static_cast(mypos(1)), static_cast(mypos(2)), 4); + + d_rx_dt_m = mypos(3)/GPS_C_m_s; // Convert RX time offset from meters to seconds //ToDo: Find an Observables/PVT random bug with some satellite configurations that gives an erratic PVT solution (i.e. height>50 km) if (d_height_m > 50000) @@ -188,10 +189,10 @@ bool gps_l1_ca_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, LOG(INFO) << "(new)Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d - << " [deg], Height= " << d_height_m << " [m]"; + << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_m << " [s]"; // ###### Compute DOPs ######## - gps_l1_ca_ls_pvt::compute_DOP(); + compute_DOP(); // ######## LOG FILE ######### if(d_flag_dump_enabled == true) @@ -225,14 +226,14 @@ bool gps_l1_ca_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, tmp_double = d_height_m; d_dump_file.write((char*)&tmp_double, sizeof(double)); } - catch (std::ifstream::failure e) + catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception writing PVT LS dump file " << e.what(); } } // MOVING AVERAGE PVT - gps_l1_ca_ls_pvt::pos_averaging(flag_averaging); + pos_averaging(flag_averaging); } else { diff --git a/src/algorithms/PVT/libs/hybrid_ls_pvt.cc b/src/algorithms/PVT/libs/hybrid_ls_pvt.cc index e5e332ace..f3892bc7f 100644 --- a/src/algorithms/PVT/libs/hybrid_ls_pvt.cc +++ b/src/algorithms/PVT/libs/hybrid_ls_pvt.cc @@ -239,8 +239,8 @@ bool hybrid_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, do DLOG(INFO) << "obs="<< obs; DLOG(INFO) << "W=" << W; - mypos = hybrid_ls_pvt::leastSquarePos(satpos, obs, W); - + mypos = leastSquarePos(satpos, obs, W); + d_rx_dt_m = mypos(3)/GPS_C_m_s; // Convert RX time offset from meters to seconds // Compute GST and Gregorian time if( GST != 0.0) { @@ -257,24 +257,20 @@ bool hybrid_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, do d_position_UTC_time = p_time; DLOG(INFO) << "HYBRID Position at TOW=" << hybrid_current_time << " in ECEF (X,Y,Z) = " << mypos; - hybrid_ls_pvt::cart2geo(static_cast(mypos(0)), static_cast(mypos(1)), static_cast(mypos(2)), 4); + cart2geo(static_cast(mypos(0)), static_cast(mypos(1)), static_cast(mypos(2)), 4); //ToDo: Find an Observables/PVT random bug with some satellite configurations that gives an erratic PVT solution (i.e. height>50 km) if (d_height_m > 50000) { b_valid_position = false; LOG(INFO) << "Hybrid Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d - << " [deg], Height= " << d_height_m << " [m]"; - - //std::cout << "Hybrid Position at " << boost::posix_time::to_simple_string(p_time) - // << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d - // << " [deg], Height= " << d_height_m << " [m]" << std::endl; + << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << mypos(3) << " [s]"; return false; } LOG(INFO) << "Hybrid Position at " << boost::posix_time::to_simple_string(p_time) << " is Lat = " << d_latitude_d << " [deg], Long = " << d_longitude_d - << " [deg], Height= " << d_height_m << " [m]"; + << " [deg], Height= " << d_height_m << " [m]" << " RX time offset= " << d_rx_dt_m << " [s]"; // ###### Compute DOPs ######## hybrid_ls_pvt::compute_DOP(); @@ -318,7 +314,7 @@ bool hybrid_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, do } // MOVING AVERAGE PVT - hybrid_ls_pvt::pos_averaging(flag_averaging); + pos_averaging(flag_averaging); } else { diff --git a/src/algorithms/PVT/libs/pvt_solution.h b/src/algorithms/PVT/libs/pvt_solution.h index 456f7da56..1825e6d87 100644 --- a/src/algorithms/PVT/libs/pvt_solution.h +++ b/src/algorithms/PVT/libs/pvt_solution.h @@ -48,9 +48,10 @@ class Pvt_Solution public: Pvt_Solution(); - double d_latitude_d; - double d_longitude_d; - double d_height_m; + double d_latitude_d; //!< RX position Latitude WGS84 [deg] + double d_longitude_d; //!< RX position Longitude WGS84 [deg] + double d_height_m; //!< RX position height WGS84 [m] + double d_rx_dt_m; //!< RX time offset [s] boost::posix_time::ptime d_position_UTC_time; From d15066fda6bb2dc121936fc855d85ce7d9c454d5 Mon Sep 17 00:00:00 2001 From: Javier Arribas Date: Tue, 29 Mar 2016 18:40:00 +0200 Subject: [PATCH 9/9] Bug fix in Hybrid PVT date/time computation. Removed the obsolete GPS L1 Optim tracking block --- conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf | 1 - conf/gnss-sdr_GPS_L1_USRP_realtime.conf | 2 +- .../gnss-sdr_GPS_L1_gr_complex_optim_trk.conf | 283 -------- conf/gnss-sdr_GPS_L1_ishort.conf | 87 +++ conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf | 2 +- conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf | 2 +- src/algorithms/PVT/libs/hybrid_ls_pvt.cc | 9 +- .../tracking/adapters/CMakeLists.txt | 1 - .../gps_l1_ca_dll_pll_optim_tracking.cc | 159 ----- .../gps_l1_ca_dll_pll_optim_tracking.h | 119 ---- .../tracking/gnuradio_blocks/CMakeLists.txt | 1 - .../gps_l1_ca_dll_pll_optim_tracking_cc.cc | 654 ------------------ .../gps_l1_ca_dll_pll_optim_tracking_cc.h | 181 ----- src/core/receiver/gnss_block_factory.cc | 13 - 14 files changed, 95 insertions(+), 1419 deletions(-) delete mode 100644 conf/gnss-sdr_GPS_L1_gr_complex_optim_trk.conf create mode 100644 conf/gnss-sdr_GPS_L1_ishort.conf delete mode 100644 src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.cc delete mode 100644 src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.h delete mode 100644 src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.cc delete mode 100644 src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.h diff --git a/conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf b/conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf index dfac84864..17d1ad4a4 100644 --- a/conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf +++ b/conf/gnss-sdr_GPS_L1_USRP_X300_realtime.conf @@ -299,7 +299,6 @@ Acquisition_GPS.max_dwells=1 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] -;Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Optim_Tracking Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_GPS.item_type=gr_complex diff --git a/conf/gnss-sdr_GPS_L1_USRP_realtime.conf b/conf/gnss-sdr_GPS_L1_USRP_realtime.conf index d52ce19c9..7f0ce9063 100644 --- a/conf/gnss-sdr_GPS_L1_USRP_realtime.conf +++ b/conf/gnss-sdr_GPS_L1_USRP_realtime.conf @@ -299,7 +299,7 @@ Acquisition_GPS.max_dwells=1 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] -Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Optim_Tracking +Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Tracking ;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. Tracking_GPS.item_type=gr_complex diff --git a/conf/gnss-sdr_GPS_L1_gr_complex_optim_trk.conf b/conf/gnss-sdr_GPS_L1_gr_complex_optim_trk.conf deleted file mode 100644 index 6462bc465..000000000 --- a/conf/gnss-sdr_GPS_L1_gr_complex_optim_trk.conf +++ /dev/null @@ -1,283 +0,0 @@ -; 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=4000000 - -;######### CONTROL_THREAD CONFIG ############ -ControlThread.wait_for_flowgraph=false - -;######### SIGNAL_SOURCE CONFIG ############ -;#implementation: Use [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=../data/agilent_cap2.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=4000000 - -;#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=250000000 - -;#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=Signal_Conditioner -SignalConditioner.implementation=Pass_Through - -;######### DATA_TYPE_ADAPTER CONFIG ############ -;## Changes the type of input data. Please disable it in this version. -;#implementation: [Pass_Through] disables this block -DataTypeAdapter.implementation=Pass_Through - -;######### 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] -;#[Pass_Through] disables this block -;#[Fir_Filter] enables a FIR Filter -;#[Freq_Xlating_Fir_Filter] enables FIR filter and a composite frequency translation that shifts IF down to zero Hz. - -;InputFilter.implementation=Fir_Filter -;InputFilter.implementation=Freq_Xlating_Fir_Filter -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 - -;#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.sampling_frequency=4000000 -InputFilter.IF=0 - - - -;######### 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=Direct_Resampler -Resampler.implementation=Pass_Through - -;#dump: Dump the resamplered data to a file. -Resampler.dump=false -;#dump_filename: Log path and filename. -Resampler.dump_filename=../data/resampler.dat - -;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. -Resampler.item_type=gr_complex - -;#sample_freq_in: the sample frequency of the input signal -Resampler.sample_freq_in=8000000 - -;#sample_freq_out: the desired sample frequency of the output signal -Resampler.sample_freq_out=4000000 - -_1C -;######### CHANNELS GLOBAL CONFIG ############ -;#count: Number of available GPS satellite channels. -Channels_1C.count=8 -;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver -Channels.in_acquisition=1 -;#signal: -;#if the option is disabled by default is assigned "1C" GPS L1 C/A -Channel.signal=1C - - -;######### ACQUISITION GLOBAL 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 -;#threshold: Acquisition threshold -Acquisition_1C.threshold=0.008 -;#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=10000 -;#doppler_max: Doppler step in the grid search [Hz] -Acquisition_1C.doppler_step=500 - - - -;######### TRACKING GLOBAL CONFIG ############ -;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] -Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Optim_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=false - -;#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=./tracking_ch_ - -;#pll_bw_hz: PLL loop filter bandwidth [Hz] -Tracking_1C.pll_bw_hz=50.0; - -;#dll_bw_hz: DLL loop filter bandwidth [Hz] -Tracking_1C.dll_bw_hz=2.0; - -;#fll_bw_hz: FLL loop filter bandwidth [Hz] -Tracking_1C.fll_bw_hz=10.0; - -;#order: PLL/DLL loop filter order [2] or [3] -Tracking_1C.order=3; - -;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] -Tracking_1C.early_late_space_chips=0.5; - -;######### 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=1; - -;######### OBSERVABLES CONFIG ############ -;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. -Observables.implementation=GPS_L1_CA_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=GPS_L1_CA_PVT - -;#averaging_depth: Number of PVT observations in the moving average algorithm -PVT.averaging_depth=100 - -;#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 - -;# KML, GeoJSON, NMEA and RTCM output configuration - -;#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 - -;#nmea_dump_filename: NMEA log path and filename -PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; - -;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) -PVT.flag_nmea_tty_port=false; - -;#nmea_dump_devname: serial device descriptor for NMEA logging -PVT.nmea_dump_devname=/dev/pts/4 - -PVT.flag_rtcm_server=false -PVT.flag_rtcm_tty_port=false -PVT.rtcm_dump_devname=/dev/pts/1 - -;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] -PVT.dump=true - -;######### 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 diff --git a/conf/gnss-sdr_GPS_L1_ishort.conf b/conf/gnss-sdr_GPS_L1_ishort.conf new file mode 100644 index 000000000..bbea10058 --- /dev/null +++ b/conf/gnss-sdr_GPS_L1_ishort.conf @@ -0,0 +1,87 @@ +; 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=4000000 + +;######### CONTROL_THREAD CONFIG ############ +ControlThread.wait_for_flowgraph=false + +;######### SIGNAL_SOURCE CONFIG ############ +SignalSource.implementation=File_Signal_Source +SignalSource.filename=/media/javier/SISTEMA/signals/test gestalt 22_1_2016/signal_source_gr_complex_4MSPS.dat +SignalSource.item_type=gr_complex +SignalSource.sampling_frequency=4000000 +SignalSource.freq=1575420000 +SignalSource.samples=250000000 +SignalSource.repeat=false +SignalSource.dump=false +SignalSource.dump_filename=../data/signal_source.dat +SignalSource.enable_throttle_control=false + + +;######### SIGNAL_CONDITIONER CONFIG ############ +SignalConditioner.implementation=Pass_Through + + +;######### CHANNELS GLOBAL CONFIG ############ +Channels_1C.count=8 +Channels.in_acquisition=1 +Channel.signal=1C + + +;######### ACQUISITION GLOBAL CONFIG ############ +Acquisition_1C.dump=false +Acquisition_1C.dump_filename=./acq_dump.dat +Acquisition_1C.item_type=gr_complex +Acquisition_1C.if=0 +Acquisition_1C.sampled_ms=1 +Acquisition_1C.implementation=GPS_L1_CA_PCPS_Acquisition +Acquisition_1C.threshold=0.006 +;Acquisition_1C.pfa=0.01 +Acquisition_1C.doppler_max=10000 +Acquisition_1C.doppler_step=500 + +;######### TRACKING GLOBAL CONFIG ############ +Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking +Tracking_1C.item_type=gr_complex +Tracking_1C.if=0 +Tracking_1C.dump=false +Tracking_1C.dump_filename=../data/epl_tracking_ch_ +Tracking_1C.pll_bw_hz=45.0; +Tracking_1C.dll_bw_hz=2.0; +Tracking_1C.order=3; + +;######### TELEMETRY DECODER GPS CONFIG ############ +TelemetryDecoder_1C.implementation=GPS_L1_CA_Telemetry_Decoder +TelemetryDecoder_1C.dump=false +TelemetryDecoder_1C.decimation_factor=1; + +;######### OBSERVABLES CONFIG ############ +Observables.implementation=GPS_L1_CA_Observables +Observables.dump=false +Observables.dump_filename=./observables.dat + + +;######### PVT CONFIG ############ +PVT.implementation=GPS_L1_CA_PVT +PVT.averaging_depth=100 +PVT.flag_averaging=false +PVT.output_rate_ms=10 +PVT.display_rate_ms=500 +PVT.dump_filename=./PVT +PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; +PVT.flag_nmea_tty_port=false; +PVT.nmea_dump_devname=/dev/pts/4 +PVT.flag_rtcm_server=false +PVT.flag_rtcm_tty_port=false +PVT.rtcm_dump_devname=/dev/pts/1 +PVT.dump=false + +;######### OUTPUT_FILTER CONFIG ############ +OutputFilter.implementation=Null_Sink_Output_Filter +OutputFilter.item_type=gr_complex diff --git a/conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf b/conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf index a9f620032..1e3d3b3c3 100644 --- a/conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf +++ b/conf/gnss-sdr_GPS_L1_rtl_tcp_realtime.conf @@ -210,7 +210,7 @@ Acquisition_1C.max_dwells=15 ;######### TRACKING GLOBAL CONFIG ############ ;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] [GPS_L1_CA_DLL_PLL_Optim_Tracking] -Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Optim_Tracking +Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_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 diff --git a/conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf b/conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf index 296e542b6..181ec894d 100644 --- a/conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf +++ b/conf/gnss-sdr_GPS_L1_rtlsdr_realtime.conf @@ -104,7 +104,7 @@ Acquisition_1C.max_dwells=15 ;######### TRACKING GLOBAL CONFIG ############ -Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Optim_Tracking +Tracking_1C.implementation=GPS_L1_CA_DLL_PLL_Tracking Tracking_1C.item_type=gr_complex Tracking_1C.if=0 Tracking_1C.dump=false diff --git a/src/algorithms/PVT/libs/hybrid_ls_pvt.cc b/src/algorithms/PVT/libs/hybrid_ls_pvt.cc index f3892bc7f..53ce94002 100644 --- a/src/algorithms/PVT/libs/hybrid_ls_pvt.cc +++ b/src/algorithms/PVT/libs/hybrid_ls_pvt.cc @@ -60,7 +60,7 @@ hybrid_ls_pvt::hybrid_ls_pvt(int nchannels, std::string dump_filename, bool flag d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); LOG(INFO) << "PVT lib dump enabled Log file: " << d_dump_filename.c_str(); } - catch (std::ifstream::failure e) + catch (const std::ifstream::failure &e) { LOG(WARNING) << "Exception opening PVT lib dump file " << e.what(); } @@ -98,8 +98,8 @@ bool hybrid_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, do int GPS_week = 0; double utc = 0.0; double GST = 0.0; - double utc_tx_corrected = 0.0; //utc computed at tx_time_corrected, added for Galileo constellation (in GPS utc is directly computed at TX_time_corrected_s) - double TX_time_corrected_s; + //double utc_tx_corrected = 0.0; //utc computed at tx_time_corrected, added for Galileo constellation (in GPS utc is directly computed at TX_time_corrected_s) + double TX_time_corrected_s = 0.0; double SV_clock_bias_s = 0.0; d_flag_averaging = flag_averaging; @@ -251,7 +251,8 @@ bool hybrid_ls_pvt::get_PVT(std::map gnss_pseudoranges_map, do utc = gps_utc_model.utc_time(TX_time_corrected_s, GPS_week); } // get time string Gregorian calendar - boost::posix_time::time_duration t = boost::posix_time::seconds(utc); + double secondsperweek = 604800.0; // number of seconds in one week (7*24*60*60) + boost::posix_time::time_duration t = boost::posix_time::seconds(utc + secondsperweek * static_cast(GPS_week)); // 22 August 1999 00:00 last Galileo start GST epoch (ICD sec 5.1.2) boost::posix_time::ptime p_time(boost::gregorian::date(1999, 8, 22), t); d_position_UTC_time = p_time; diff --git a/src/algorithms/tracking/adapters/CMakeLists.txt b/src/algorithms/tracking/adapters/CMakeLists.txt index c02bdde0a..3d146f646 100644 --- a/src/algorithms/tracking/adapters/CMakeLists.txt +++ b/src/algorithms/tracking/adapters/CMakeLists.txt @@ -25,7 +25,6 @@ set(TRACKING_ADAPTER_SOURCES galileo_e1_dll_pll_veml_tracking.cc galileo_e1_tcp_connector_tracking.cc gps_l1_ca_dll_fll_pll_tracking.cc - gps_l1_ca_dll_pll_optim_tracking.cc gps_l1_ca_dll_pll_tracking.cc gps_l1_ca_dll_pll_c_aid_tracking.cc gps_l1_ca_tcp_connector_tracking.cc diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.cc b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.cc deleted file mode 100644 index 14cf004fd..000000000 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.cc +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * \file gps_l1_ca_dll_pll_optim_tracking.cc - * \brief Interface of an adapter of a speed optimized DLL+PLL tracking loop block - * for GPS L1 C/A to a TrackingInterface - * \author Javier Arribas, 2012. jarribas(at)cttc.es - * - * GPS L1 TRACKING MODULE OPTIMIZED FOR SPEED: - * - Code Doppler is not compensated in the local replica - * Code DLL + carrier PLL according to the algorithms described in: - * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, - * A Software-Defined GPS and Galileo Receiver. A Single-Frequency - * Approach, Birkha user, 2007 - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#include "gps_l1_ca_dll_pll_optim_tracking.h" -#include -#include -#include "GPS_L1_CA.h" -#include "configuration_interface.h" - -using google::LogMessage; - -GpsL1CaDllPllOptimTracking::GpsL1CaDllPllOptimTracking( - ConfigurationInterface* configuration, std::string role, - unsigned int in_streams, unsigned int out_streams, - boost::shared_ptr queue) : - role_(role), in_streams_(in_streams), out_streams_(out_streams), - queue_(queue) -{ - DLOG(INFO) << "role " << role; - //################# CONFIGURATION PARAMETERS ######################## - int fs_in; - int vector_length; - int f_if; - bool dump; - std::string dump_filename; - std::string item_type; - std::string default_item_type = "gr_complex"; - float pll_bw_hz; - float dll_bw_hz; - float early_late_space_chips; - item_type = configuration->property(role + ".item_type",default_item_type); - //vector_length = configuration->property(role + ".vector_length", 2048); - fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000); - f_if = configuration->property(role + ".if", 0); - dump = configuration->property(role + ".dump", false); - pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0); - dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0); - early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5); - std::string default_dump_filename = "./track_ch"; - dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); //unused! - vector_length = round(fs_in / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS)); - - //################# MAKE TRACKING GNURadio object ################### - if (item_type.compare("gr_complex") == 0) - { - item_size_ = sizeof(gr_complex); - tracking_ = gps_l1_ca_dll_pll_make_optim_tracking_cc( - f_if, - fs_in, - vector_length, - queue_, - dump, - dump_filename, - pll_bw_hz, - dll_bw_hz, - early_late_space_chips); - } - else - { - item_size_ = sizeof(gr_complex); - LOG(WARNING) << item_type << " unknown tracking item type."; - } - - channel_ = 0; - channel_internal_queue_ = 0; - DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")"; -} - - -GpsL1CaDllPllOptimTracking::~GpsL1CaDllPllOptimTracking() -{} - - -void GpsL1CaDllPllOptimTracking::start_tracking() -{ - tracking_->start_tracking(); -} - -/* - * Set tracking channel unique ID - */ -void GpsL1CaDllPllOptimTracking::set_channel(unsigned int channel) -{ - channel_ = channel; - tracking_->set_channel(channel); -} - -/* - * Set tracking channel internal queue - */ -void GpsL1CaDllPllOptimTracking::set_channel_queue( - concurrent_queue *channel_internal_queue) -{ - channel_internal_queue_ = channel_internal_queue; - tracking_->set_channel_queue(channel_internal_queue_); -} - -void GpsL1CaDllPllOptimTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) -{ - tracking_->set_gnss_synchro(p_gnss_synchro); -} - -void GpsL1CaDllPllOptimTracking::connect(gr::top_block_sptr top_block) -{ - if(top_block) { /* top_block is not null */}; - //nothing to connect, now the tracking uses gr_sync_decimator -} - -void GpsL1CaDllPllOptimTracking::disconnect(gr::top_block_sptr top_block) -{ - if(top_block) { /* top_block is not null */}; - //nothing to disconnect, now the tracking uses gr_sync_decimator -} - -gr::basic_block_sptr GpsL1CaDllPllOptimTracking::get_left_block() -{ - return tracking_; -} - -gr::basic_block_sptr GpsL1CaDllPllOptimTracking::get_right_block() -{ - return tracking_; -} - diff --git a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.h b/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.h deleted file mode 100644 index e9254a283..000000000 --- a/src/algorithms/tracking/adapters/gps_l1_ca_dll_pll_optim_tracking.h +++ /dev/null @@ -1,119 +0,0 @@ -/*! - * \file gps_l1_ca_dll_pll_optim_tracking.h - * \brief Interface of an adapter of a speed optimized DLL+PLL tracking loop block - * for GPS L1 C/A to a TrackingInterface - * \author Javier Arribas, 2012. jarribas(at)cttc.es - * - * GPS L1 TRACKING MODULE OPTIMIZED FOR SPEED: - * - Code Doppler is not compensated in the local replica - * Code DLL + carrier PLL according to the algorithms described in: - * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, - * A Software-Defined GPS and Galileo Receiver. A Single-Frequency - * Approach, Birkha user, 2007 - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#ifndef GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_H_ -#define GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_H_ - -#include -#include -#include "tracking_interface.h" -#include "gps_l1_ca_dll_pll_optim_tracking_cc.h" - - -class ConfigurationInterface; - -/*! - * \brief This class implements a code DLL + carrier PLL tracking loop - */ -class GpsL1CaDllPllOptimTracking : public TrackingInterface -{ - -public: - - GpsL1CaDllPllOptimTracking(ConfigurationInterface* configuration, - std::string role, - unsigned int in_streams, - unsigned int out_streams, - boost::shared_ptr queue); - - virtual ~GpsL1CaDllPllOptimTracking(); - - std::string role() - { - return role_; - } - - //! Returns "GPS_L1_CA_DLL_PLL_Optim_Tracking" - std::string implementation() - { - return "GPS_L1_CA_DLL_PLL_Optim_Tracking"; - } - size_t item_size() - { - return item_size_; - } - - void connect(gr::top_block_sptr top_block); - void disconnect(gr::top_block_sptr top_block); - gr::basic_block_sptr get_left_block(); - gr::basic_block_sptr get_right_block(); - - - /*! - * \brief Set tracking channel unique ID - */ - void set_channel(unsigned int channel); - - /*! - * \brief Set acquisition/tracking common Gnss_Synchro object pointer - * to efficiently exchange synchronization data between acquisition and tracking blocks - */ - void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); - - /*! - * \brief Set tracking channel internal queue - */ - void set_channel_queue(concurrent_queue *channel_internal_queue); - - void start_tracking(); - -private: - - gps_l1_ca_dll_pll_optim_tracking_cc_sptr tracking_; - size_t item_size_; - - unsigned int channel_; - - std::string role_; - unsigned int in_streams_; - unsigned int out_streams_; - boost::shared_ptr queue_; - concurrent_queue *channel_internal_queue_; -}; - -#endif // GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_H_ diff --git a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt index d5bced479..3a583b7b0 100644 --- a/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/tracking/gnuradio_blocks/CMakeLists.txt @@ -26,7 +26,6 @@ set(TRACKING_GR_BLOCKS_SOURCES galileo_e1_dll_pll_veml_tracking_cc.cc galileo_e1_tcp_connector_tracking_cc.cc gps_l1_ca_dll_fll_pll_tracking_cc.cc - gps_l1_ca_dll_pll_optim_tracking_cc.cc gps_l1_ca_dll_pll_tracking_cc.cc gps_l1_ca_tcp_connector_tracking_cc.cc galileo_e5a_dll_pll_tracking_cc.cc diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.cc deleted file mode 100644 index 82be30057..000000000 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.cc +++ /dev/null @@ -1,654 +0,0 @@ -/*! - * \file gps_l1_ca_dll_pll_optim_tracking_cc.cc - * \brief Implementation of a code DLL + carrier PLL tracking block - * \author Javier Arribas, 2012. jarribas(at)cttc.es - * GPS L1 TRACKING MODULE OPTIMIZED FOR SPEED: - * - Code Doppler is not compensated in the local replica - * Code DLL + carrier PLL according to the algorithms described in: - * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, - * A Software-Defined GPS and Galileo Receiver. A Single-Frequency - * Approach, Birkha user, 2007 - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#include "gps_l1_ca_dll_pll_optim_tracking_cc.h" -#include -#include -#include -#include -#include -#include -#include -#include "gps_sdr_signal_processing.h" -#include "tracking_discriminators.h" -#include "lock_detectors.h" -#include "GPS_L1_CA.h" -#include "nco_lib.h" -#include "control_message_factory.h" - - - -/*! - * \todo Include in definition header file - */ -#define CN0_ESTIMATION_SAMPLES 20 -#define MINIMUM_VALID_CN0 25 -#define MAXIMUM_LOCK_FAIL_COUNTER 50 -#define CARRIER_LOCK_THRESHOLD 0.85 - -using google::LogMessage; - -gps_l1_ca_dll_pll_optim_tracking_cc_sptr -gps_l1_ca_dll_pll_make_optim_tracking_cc( - long if_freq, - long fs_in, - unsigned int vector_length, - boost::shared_ptr queue, - bool dump, - std::string dump_filename, - float pll_bw_hz, - float dll_bw_hz, - float early_late_space_chips) -{ - return gps_l1_ca_dll_pll_optim_tracking_cc_sptr(new Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc(if_freq, - fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips)); -} - - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::forecast (int noutput_items, - gr_vector_int &ninput_items_required) -{ - if (noutput_items != 0) - { - ninput_items_required[0] = d_gnuradio_forecast_samples; //set the required available samples in each call - } -} - - - -Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc( - long if_freq, - long fs_in, - unsigned int vector_length, - boost::shared_ptr queue, - bool dump, - std::string dump_filename, - float pll_bw_hz, - float dll_bw_hz, - float early_late_space_chips) : - gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", - gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))) -{ - // initialize internal vars - d_queue = queue; - d_dump = dump; - d_if_freq = if_freq; - d_fs_in = fs_in; - d_vector_length = vector_length; - d_gnuradio_forecast_samples = static_cast(d_vector_length) * 2; - d_dump_filename = dump_filename; - - // Initialize tracking ========================================== - d_code_loop_filter.set_DLL_BW(dll_bw_hz); - d_carrier_loop_filter.set_PLL_BW(pll_bw_hz); - - //--- DLL variables -------------------------------------------------------- - d_early_late_spc_chips = early_late_space_chips; // Define early-late offset (in chips) - - // Initialization of local code replica - // Get space for a vector with the C/A code replica sampled 1x/chip - d_ca_code = static_cast(volk_malloc((GPS_L1_CA_CODE_LENGTH_CHIPS + 2) * sizeof(gr_complex), volk_get_alignment())); - - // Get space for the resampled early / prompt / late local replicas - d_early_code = static_cast(volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment())); - d_prompt_code = static_cast(volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment())); - d_late_code = static_cast(volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment())); - - // space for carrier wipeoff and signal baseband vectors - d_carr_sign = static_cast(volk_malloc(2*d_vector_length * sizeof(gr_complex), volk_get_alignment())); - - // correlator outputs (scalar) - d_Early = static_cast(volk_malloc(sizeof(gr_complex), volk_get_alignment())); - d_Prompt = static_cast(volk_malloc(sizeof(gr_complex), volk_get_alignment())); - d_Late = static_cast(volk_malloc(sizeof(gr_complex), volk_get_alignment())); - - //--- Perform initializations ------------------------------ - // define initial code frequency basis of NCO - d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ; - // define residual code phase (in chips) - d_rem_code_phase_samples = 0.0; - // define residual carrier phase - d_rem_carr_phase_rad = 0.0; - - // sample synchronization - d_sample_counter = 0; - //d_sample_counter_seconds = 0; - d_acq_sample_stamp = 0; - - d_enable_tracking = false; - d_pull_in = false; - d_last_seg = 0; - - d_current_prn_length_samples = static_cast(d_vector_length); - - // CN0 estimation and lock detector buffers - d_cn0_estimation_counter = 0; - d_Prompt_buffer = new gr_complex[CN0_ESTIMATION_SAMPLES]; - d_carrier_lock_test = 1; - d_CN0_SNV_dB_Hz = 0; - d_carrier_lock_fail_counter = 0; - d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD; - - systemName["G"] = std::string("GPS"); - - d_channel_internal_queue = 0; - d_acquisition_gnss_synchro = 0; - d_channel = 0; - d_acq_code_phase_samples = 0.0; - d_acq_carrier_doppler_hz = 0.0; - d_carrier_doppler_hz = 0.0; - d_acc_carrier_phase_rad = 0.0; - d_code_phase_samples = 0.0; - d_acc_code_phase_secs = 0.0; -} - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::start_tracking() -{ - // correct the code phase according to the delay between acq and trk - d_acq_code_phase_samples = d_acquisition_gnss_synchro->Acq_delay_samples; - d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro->Acq_doppler_hz; - d_acq_sample_stamp = d_acquisition_gnss_synchro->Acq_samplestamp_samples; - - long int acq_trk_diff_samples; - double acq_trk_diff_seconds; - acq_trk_diff_samples = static_cast(d_sample_counter) - static_cast(d_acq_sample_stamp); //-d_vector_length; - LOG(INFO) << "Number of samples between Acquisition and Tracking =" << acq_trk_diff_samples; - acq_trk_diff_seconds = static_cast(acq_trk_diff_samples) / static_cast(d_fs_in); - //doppler effect - // Fd=(C/(C+Vr))*F - double radial_velocity; - radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ; - // new chip and prn sequence periods based on acq Doppler - double T_chip_mod_seconds; - double T_prn_mod_seconds; - double T_prn_mod_samples; - d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ; - T_chip_mod_seconds = 1/d_code_freq_chips; - T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; - T_prn_mod_samples = T_prn_mod_seconds * static_cast(d_fs_in); - d_current_prn_length_samples = round(T_prn_mod_samples); - - double T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ; - double T_prn_true_samples = T_prn_true_seconds * static_cast(d_fs_in); - double T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds; - double N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds; - double corrected_acq_phase_samples, delay_correction_samples; - corrected_acq_phase_samples = fmod((d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * static_cast(d_fs_in)), T_prn_true_samples); - if (corrected_acq_phase_samples < 0) - { - corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples; - } - delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples; - d_acq_code_phase_samples = corrected_acq_phase_samples; - d_carrier_doppler_hz = d_acq_carrier_doppler_hz; - - // DLL/PLL filter initialization - 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); - d_ca_code[0] = d_ca_code[static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS)]; - d_ca_code[static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS) + 1] = d_ca_code[1]; - - //****************************************************************************** - // Experimental: pre-sampled local signal replica at nominal code frequency. - // No code doppler correction - double tcode_chips; - int associated_chip_index; - int code_length_chips = static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS); - double code_phase_step_chips; - int early_late_spc_samples; - int epl_loop_length_samples; - - // unified loop for E, P, L code vectors - code_phase_step_chips = (static_cast(d_code_freq_chips)) / (static_cast(d_fs_in)); - tcode_chips = 0; - - // Alternative EPL code generation (40% of speed improvement!) - early_late_spc_samples = round(d_early_late_spc_chips / code_phase_step_chips); - epl_loop_length_samples = d_current_prn_length_samples +early_late_spc_samples*2; - for (int i = 0; i < epl_loop_length_samples; i++) - { - associated_chip_index = 1 + round(fmod(tcode_chips - d_early_late_spc_chips, code_length_chips)); - d_early_code[i] = d_ca_code[associated_chip_index]; - tcode_chips = tcode_chips + code_phase_step_chips; - } - - memcpy(d_prompt_code, &d_early_code[early_late_spc_samples], d_current_prn_length_samples* sizeof(gr_complex)); - memcpy(d_late_code, &d_early_code[early_late_spc_samples*2], d_current_prn_length_samples* sizeof(gr_complex)); - //****************************************************************************** - - d_carrier_lock_fail_counter = 0; - d_rem_code_phase_samples = 0; - d_rem_carr_phase_rad = 0; - d_acc_carrier_phase_rad = 0; - - d_code_phase_samples = d_acq_code_phase_samples; - - std::string sys_ = &d_acquisition_gnss_synchro->System; - sys = sys_.substr(0,1); - - // DEBUG OUTPUT - std::cout << "Tracking start on channel " << d_channel << " for satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << std::endl; - LOG(INFO) << "Starting tracking of satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << " on channel " << d_channel; - - // enable tracking - d_pull_in = true; - d_enable_tracking = true; - - LOG(INFO) << "PULL-IN Doppler [Hz]=" << d_carrier_doppler_hz - << " Code Phase correction [samples]=" << delay_correction_samples - << " PULL-IN Code Phase [samples]=" << d_acq_code_phase_samples << std::endl; -} - - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::update_local_code() -{ - double tcode_chips; - double rem_code_phase_chips; - int associated_chip_index; - int code_length_chips = static_cast(GPS_L1_CA_CODE_LENGTH_CHIPS); - double code_phase_step_chips; - int early_late_spc_samples; - int epl_loop_length_samples; - - // unified loop for E, P, L code vectors - code_phase_step_chips = (static_cast(d_code_freq_chips)) / (static_cast(d_fs_in)); - rem_code_phase_chips = d_rem_code_phase_samples * (d_code_freq_chips / d_fs_in); - tcode_chips = -rem_code_phase_chips; - - //EPL code generation - early_late_spc_samples = round(d_early_late_spc_chips / code_phase_step_chips); - epl_loop_length_samples = d_current_prn_length_samples + early_late_spc_samples*2; - for (int i = 0; i < epl_loop_length_samples; i++) - { - associated_chip_index = 1 + round(fmod(tcode_chips - d_early_late_spc_chips, code_length_chips)); - d_early_code[i] = d_ca_code[associated_chip_index]; - tcode_chips = tcode_chips + code_phase_step_chips; - } - - memcpy(d_prompt_code, &d_early_code[early_late_spc_samples], d_current_prn_length_samples* sizeof(gr_complex)); - memcpy(d_late_code, &d_early_code[early_late_spc_samples*2], d_current_prn_length_samples* sizeof(gr_complex)); -} - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::update_local_carrier() -{ - float phase_step_rad; - phase_step_rad = static_cast(GPS_TWO_PI) * d_carrier_doppler_hz / static_cast(d_fs_in); - fxp_nco(d_carr_sign, d_current_prn_length_samples, d_rem_carr_phase_rad, phase_step_rad); -} - - -Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc() -{ - d_dump_file.close(); - - volk_free(d_prompt_code); - volk_free(d_late_code); - volk_free(d_early_code); - volk_free(d_carr_sign); - volk_free(d_Early); - volk_free(d_Prompt); - volk_free(d_Late); - - delete[] d_ca_code; - delete[] d_Prompt_buffer; -} - - -// Tracking signal processing -int Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::general_work (int noutput_items, gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) -{ - // stream to collect cout calls to improve thread safety - std::stringstream tmp_str_stream; - double carr_error_hz = 0.0; - double carr_error_filt_hz = 0.0; - double code_error_chips = 0.0; - double code_error_filt_chips = 0.0; - - if (d_enable_tracking == true) - { - /* - * Receiver signal alignment - */ - if (d_pull_in == true) - { - 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_current_prn_length_samples - fmod(static_cast(acq_to_trk_delay_samples), static_cast(d_current_prn_length_samples)); - samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples); - d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples - d_pull_in = false; - consume_each(samples_offset); //shift input to perform alignment with local replica - return 1; - } - // 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; - - // Block input data and block output stream pointers - const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment - Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; - - // Generate local code and carrier replicas (using \hat{f}_d(k-1)) - //update_local_code(); //disabled in the speed optimized tracking! - update_local_carrier(); - - // perform Early, Prompt and Late correlation -#if USING_VOLK_CW_EPL_CORR_CUSTOM - d_correlator.Carrier_wipeoff_and_EPL_volk_custom(d_current_prn_length_samples, - in, - d_carr_sign, - d_early_code, - d_prompt_code, - d_late_code, - d_Early, - d_Prompt, - d_Late); -#else - d_correlator.Carrier_wipeoff_and_EPL_volk(d_current_prn_length_samples, - in, - d_carr_sign, - d_early_code, - d_prompt_code, - d_late_code, - d_Early, - d_Prompt, - d_Late); -#endif - // ################## PLL ########################################################## - // PLL discriminator - carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / GPS_TWO_PI; - // Carrier discriminator filter - carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz); - // 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 = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ); - //carrier phase accumulator for (K) doppler estimation - d_acc_carrier_phase_rad -= GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD; - //remnant 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 * GPS_L1_CA_CODE_PERIOD; - d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI); - - // ################## DLL ########################################################## - // DLL discriminator - code_error_chips = dll_nc_e_minus_l_normalized(*d_Early, *d_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 - double code_error_filt_secs; - code_error_filt_secs = (GPS_L1_CA_CODE_PERIOD * code_error_filt_chips) / GPS_L1_CA_CODE_RATE_HZ; //[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 - double T_chip_seconds; - double T_prn_seconds; - double T_prn_samples; - double K_blk_samples; - // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation - T_chip_seconds = 1.0 / d_code_freq_chips; - T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS; - T_prn_samples = T_prn_seconds * static_cast(d_fs_in); - K_blk_samples = T_prn_samples + d_rem_code_phase_samples + code_error_filt_secs * static_cast(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) - { - // fill buffer with prompt correlator output values - d_Prompt_buffer[d_cn0_estimation_counter] = *d_Prompt; - d_cn0_estimation_counter++; - } - else - { - d_cn0_estimation_counter = 0; - // Code lock indicator - d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS); - // Carrier lock indicator - d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES); - // Loss of lock detection - if (d_carrier_lock_test < d_carrier_lock_threshold or d_CN0_SNV_dB_Hz < MINIMUM_VALID_CN0) - { - d_carrier_lock_fail_counter++; - } - else - { - if (d_carrier_lock_fail_counter > 0) d_carrier_lock_fail_counter--; - } - if (d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER) - { - std::cout << "Loss of lock in channel " << d_channel << "!" << std::endl; - LOG(INFO) << "Loss of lock in channel " << d_channel << "!"; - std::unique_ptr cmf(new ControlMessageFactory()); - if (d_queue != gr::msg_queue::sptr()) - { - d_queue->handle(cmf->GetQueueMessage(d_channel, 2)); - } - d_carrier_lock_fail_counter = 0; - d_enable_tracking = false; // TODO: check if disabling tracking is consistent with the channel state machine - } - } - // ########### Output the tracking data to navigation and PVT ########## - current_synchro_data.Prompt_I = static_cast((*d_Prompt).real()); - current_synchro_data.Prompt_Q = static_cast((*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_current_prn_length_samples + (double)d_rem_code_phase_samples) / static_cast(d_fs_in); - current_synchro_data.Tracking_timestamp_secs = (static_cast(d_sample_counter) + static_cast(d_rem_code_phase_samples)) / static_cast(d_fs_in); - d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample - // 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 = static_cast(d_acc_carrier_phase_rad); - current_synchro_data.Carrier_Doppler_hz = static_cast(d_carrier_doppler_hz); - current_synchro_data.CN0_dB_hz = static_cast(d_CN0_SNV_dB_Hz); - current_synchro_data.Flag_valid_pseudorange = false; - *out[0] = current_synchro_data; - - // ########## DEBUG OUTPUT - /*! - * \todo The stop timer has to be moved to the signal source! - */ - if (floor(d_sample_counter / d_fs_in) != d_last_seg) - { - d_last_seg = floor(d_sample_counter / d_fs_in); - - if (d_channel == 0) - { - // debug: Second counter in channel 0 - tmp_str_stream << "Current input signal time = " << d_last_seg << " [s]" << std::endl; - std::cout << tmp_str_stream.rdbuf(); - LOG(INFO) << tmp_str_stream.rdbuf(); - } - - tmp_str_stream << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) - << ", Doppler=" << d_carrier_doppler_hz << " [Hz] CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl; - //std::cout << tmp_str_stream.rdbuf() << std::flush; - LOG(INFO) << tmp_str_stream.rdbuf(); - //if (d_channel == 0 || d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock! - } - } - else - { - // ########## DEBUG OUTPUT (TIME ONLY for channel 0 when tracking is disabled) - /*! - * \todo The stop timer has to be moved to the signal source! - */ - // stream to collect cout calls to improve thread safety - std::stringstream tmp_str_stream; - if (floor(d_sample_counter / d_fs_in) != d_last_seg) - { - d_last_seg = floor(d_sample_counter / d_fs_in); - - if (d_channel == 0) - { - // debug: Second counter in channel 0 - tmp_str_stream << "Current input signal time = " << d_last_seg << " [s]" << std::endl << std::flush; - std::cout << tmp_str_stream.rdbuf() << std::flush; - } - } - *d_Early = gr_complex(0,0); - *d_Prompt = gr_complex(0,0); - *d_Late = gr_complex(0,0); - Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0]; //block output streams pointer - // GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder - d_acquisition_gnss_synchro->Flag_valid_pseudorange = false; - *out[0] = *d_acquisition_gnss_synchro; - } - - if(d_dump) - { - // MULTIPLEXED FILE RECORDING - Record results to file - float prompt_I; - float prompt_Q; - float tmp_E, tmp_P, tmp_L; - float tmp_float; - double tmp_double; - prompt_I = (*d_Prompt).real(); - prompt_Q = (*d_Prompt).imag(); - tmp_E = std::abs(*d_Early); - tmp_P = std::abs(*d_Prompt); - tmp_L = std::abs(*d_Late); - try - { - // EPR - d_dump_file.write((char*)&tmp_E, sizeof(float)); - d_dump_file.write((char*)&tmp_P, sizeof(float)); - d_dump_file.write((char*)&tmp_L, sizeof(float)); - // PROMPT I and Q (to analyze navigation symbols) - d_dump_file.write((char*)&prompt_I, sizeof(float)); - d_dump_file.write((char*)&prompt_Q, sizeof(float)); - // PRN start sample stamp - //tmp_float=(float)d_sample_counter; - d_dump_file.write((char*)&d_sample_counter, sizeof(unsigned long int)); - // accumulated carrier phase - tmp_float = d_acc_carrier_phase_rad; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - - // carrier and code frequency - tmp_float = d_carrier_doppler_hz; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - tmp_float = d_code_freq_chips; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - - //PLL commands - tmp_float = carr_error_hz; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - tmp_float = carr_error_filt_hz; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - - //DLL commands - tmp_float = code_error_chips; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - tmp_float = code_error_filt_chips; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - - // CN0 and carrier lock test - tmp_float = d_CN0_SNV_dB_Hz; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - tmp_float = d_carrier_lock_test; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - - // AUX vars (for debug purposes) - tmp_float = d_rem_code_phase_samples; - d_dump_file.write((char*)&tmp_float, sizeof(float)); - tmp_double = (double)(d_sample_counter + d_current_prn_length_samples); - d_dump_file.write((char*)&tmp_double, sizeof(double)); - } - catch (std::ifstream::failure& e) - { - LOG(WARNING) << "Exception writing trk dump file " << e.what(); - } - } - - consume_each(d_current_prn_length_samples); // this is necesary in gr_block derivates - d_sample_counter += d_current_prn_length_samples; //count for the processed samples - if((noutput_items == 0) || (ninput_items[0] == 0)) - { - LOG(WARNING) << "noutput_items = 0"; - } - return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false -} - - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::set_channel(unsigned int channel) -{ - d_channel = channel; - LOG(INFO) << "Tracking Channel set to " << d_channel; - // ############# ENABLE DATA FILE LOG ################# - if (d_dump == true) - { - if (d_dump_file.is_open() == false) - { - try - { - d_dump_filename.append(boost::lexical_cast(d_channel)); - d_dump_filename.append(".dat"); - d_dump_file.exceptions (std::ifstream::failbit | std::ifstream::badbit); - d_dump_file.open(d_dump_filename.c_str(), std::ios::out | std::ios::binary); - LOG(INFO) << "Tracking dump enabled on channel " << d_channel << " Log file: " << d_dump_filename.c_str(); - } - catch (std::ifstream::failure& e) - { - LOG(WARNING) << "channel " << d_channel << " Exception opening trk dump file " << e.what(); - } - } - } -} - - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::set_channel_queue(concurrent_queue *channel_internal_queue) -{ - d_channel_internal_queue = channel_internal_queue; -} - -void Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) -{ - d_acquisition_gnss_synchro = p_gnss_synchro; - -} diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.h deleted file mode 100644 index 8c02abc08..000000000 --- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_optim_tracking_cc.h +++ /dev/null @@ -1,181 +0,0 @@ -/*! - * \file gps_l1_ca_dll_pll_optim_tracking_cc.h - * \brief Implementation of a code DLL + carrier PLL tracking block - * \author Javier Arribas, 2012. jarribas(at)cttc.es - * GPS L1 TRACKING MODULE OPTIMIZED FOR SPEED: - * - Code Doppler is not compensated in the local replica - * Code DLL + carrier PLL according to the algorithms described in: - * [1] K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen, - * A Software-Defined GPS and Galileo Receiver. A Single-Frequency - * Approach, Birkha user, 2007 - * - * ------------------------------------------------------------------------- - * - * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) - * - * GNSS-SDR is a software defined Global Navigation - * Satellite Systems receiver - * - * This file is part of GNSS-SDR. - * - * GNSS-SDR is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * GNSS-SDR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNSS-SDR. If not, see . - * - * ------------------------------------------------------------------------- - */ - -#ifndef GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_CC_H -#define GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_CC_H - -#include -#include -#include -#include -#include -#include "concurrent_queue.h" -#include "gnss_synchro.h" -#include "tracking_2nd_DLL_filter.h" -#include "tracking_2nd_PLL_filter.h" -#include "correlator.h" - -class Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc; - -typedef boost::shared_ptr gps_l1_ca_dll_pll_optim_tracking_cc_sptr; - -gps_l1_ca_dll_pll_optim_tracking_cc_sptr gps_l1_ca_dll_pll_make_optim_tracking_cc(long if_freq, - long fs_in, - unsigned int vector_length, - boost::shared_ptr queue, - bool dump, - std::string dump_filename, - float pll_bw_hz, - float dll_bw_hz, - float early_late_space_chips); - - -/*! - * \brief This class implements a DLL + PLL tracking loop block - */ -class Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc: public gr::block -{ -public: - ~Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc(); - - void set_channel(unsigned int channel); - void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro); - void start_tracking(); - void set_channel_queue(concurrent_queue *channel_internal_queue); - - int general_work (int noutput_items, gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); - - void forecast (int noutput_items, gr_vector_int &ninput_items_required); -private: - friend gps_l1_ca_dll_pll_optim_tracking_cc_sptr - gps_l1_ca_dll_pll_make_optim_tracking_cc(long if_freq, - long fs_in, unsigned - int vector_length, - boost::shared_ptr queue, - bool dump, - std::string dump_filename, - float pll_bw_hz, - float dll_bw_hz, - float early_late_space_chips); - - Gps_L1_Ca_Dll_Pll_Optim_Tracking_cc(long if_freq, - long fs_in, unsigned - int vector_length, - boost::shared_ptr queue, - bool dump, - std::string dump_filename, - float pll_bw_hz, - float dll_bw_hz, - float early_late_space_chips); - void update_local_code(); - void update_local_carrier(); - - // tracking configuration vars - boost::shared_ptr d_queue; - concurrent_queue *d_channel_internal_queue; - unsigned int d_vector_length; - bool d_dump; - - Gnss_Synchro* d_acquisition_gnss_synchro; - unsigned int d_channel; - int d_last_seg; - long d_if_freq; - long d_fs_in; - - double d_early_late_spc_chips; - - gr_complex* d_ca_code; - - gr_complex* d_early_code; - gr_complex* d_late_code; - gr_complex* d_prompt_code; - gr_complex* d_carr_sign; - - gr_complex *d_Early; - gr_complex *d_Prompt; - gr_complex *d_Late; - - // remaining code phase and carrier phase between tracking loops - double d_rem_code_phase_samples; - double d_rem_carr_phase_rad; - - // PLL and DLL filter library - Tracking_2nd_DLL_filter d_code_loop_filter; - Tracking_2nd_PLL_filter d_carrier_loop_filter; - - // acquisition - double d_acq_code_phase_samples; - double d_acq_carrier_doppler_hz; - // correlator - Correlator d_correlator; - - // tracking vars - double d_code_freq_chips; - double d_carrier_doppler_hz; - double d_acc_carrier_phase_rad; - double d_code_phase_samples; - double d_acc_code_phase_secs; - - //PRN period in samples - int d_current_prn_length_samples; - - //processing samples counters - unsigned long int d_sample_counter; - unsigned long int d_acq_sample_stamp; - - // CN0 estimation and lock detector - int d_cn0_estimation_counter; - gr_complex* d_Prompt_buffer; - double d_carrier_lock_test; - double d_CN0_SNV_dB_Hz; - double d_carrier_lock_threshold; - int d_carrier_lock_fail_counter; - - // control vars - int d_gnuradio_forecast_samples; - bool d_enable_tracking; - bool d_pull_in; - - // file dump - std::string d_dump_filename; - std::ofstream d_dump_file; - - std::map systemName; - std::string sys; -}; - -#endif //GNSS_SDR_GPS_L1_CA_DLL_PLL_OPTIM_TRACKING_CC_H diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 65aa2f567..2c179db53 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -80,7 +80,6 @@ #include "galileo_e5a_noncoherent_iq_acquisition_caf.h" #include "gps_l1_ca_dll_pll_tracking.h" #include "gps_l1_ca_dll_pll_c_aid_tracking.h" -#include "gps_l1_ca_dll_pll_optim_tracking.h" #include "gps_l1_ca_dll_fll_pll_tracking.h" #include "gps_l1_ca_tcp_connector_tracking.h" #include "galileo_e1_dll_pll_veml_tracking.h" @@ -1324,12 +1323,6 @@ std::unique_ptr GNSSBlockFactory::GetBlock( out_streams, queue)); block = std::move(block_); } - else if (implementation.compare("GPS_L1_CA_DLL_PLL_Optim_Tracking") == 0) - { - std::unique_ptr block_(new GpsL1CaDllPllOptimTracking(configuration.get(), role, in_streams, - out_streams, queue)); - block = std::move(block_); - } else if (implementation.compare("GPS_L1_CA_DLL_FLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllFllPllTracking(configuration.get(), role, in_streams, @@ -1589,12 +1582,6 @@ std::unique_ptr GNSSBlockFactory::GetTrkBlock( out_streams, queue)); block = std::move(block_); } - else if (implementation.compare("GPS_L1_CA_DLL_PLL_Optim_Tracking") == 0) - { - std::unique_ptr block_(new GpsL1CaDllPllOptimTracking(configuration.get(), role, in_streams, - out_streams, queue)); - block = std::move(block_); - } else if (implementation.compare("GPS_L1_CA_DLL_FLL_PLL_Tracking") == 0) { std::unique_ptr block_(new GpsL1CaDllFllPllTracking(configuration.get(), role, in_streams,