GNSS-SDR  0.0.19
An Open Source GNSS Software Defined Receiver
dll_pll_veml_tracking_fpga.h
Go to the documentation of this file.
1 /*!
2  * \file dll_pll_veml_tracking_fpga.h
3  * \brief Implementation of a code DLL + carrier PLL tracking block using an FPGA.
4  * \author Marc Majoral, 2019. marc.majoral(at)cttc.es
5  * \author Javier Arribas, 2019. jarribas(at)cttc.es
6  *
7  * -----------------------------------------------------------------------------
8  *
9  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
10  * This file is part of GNSS-SDR.
11  *
12  * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
13  * SPDX-License-Identifier: GPL-3.0-or-later
14  *
15  * -----------------------------------------------------------------------------
16  */
17 
18 #ifndef GNSS_SDR_DLL_PLL_VEML_TRACKING_FPGA_H
19 #define GNSS_SDR_DLL_PLL_VEML_TRACKING_FPGA_H
20 
21 #include "dll_pll_conf_fpga.h"
22 #include "exponential_smoother.h"
23 #include "gnss_block_interface.h"
24 #include "tracking_FLL_PLL_filter.h" // for PLL/FLL filter
25 #include "tracking_loop_filter.h" // for DLL filter
26 #include <boost/circular_buffer.hpp>
27 #include <gnuradio/block.h> // for block
28 #include <gnuradio/gr_complex.h> // for gr_complex
29 #include <gnuradio/types.h> // for gr_vector_int, gr_vector...
30 #include <pmt/pmt.h> // for pmt_t
31 #include <volk_gnsssdr/volk_gnsssdr_alloc.h> // for volk_gnsssdr::vector
32 #include <cstddef> // for size_t
33 #include <cstdint> // for int32_t
34 #include <fstream> // for string, ofstream
35 #include <memory> // for std::shared_ptr
36 #include <string> // for string
37 #include <typeinfo> // for typeid
38 #include <utility> // for pair
39 
40 /** \addtogroup Tracking
41  * \{ */
42 /** \addtogroup Tracking_gnuradio_blocks
43  * \{ */
44 
45 
47 class Gnss_Synchro;
49 
50 using dll_pll_veml_tracking_fpga_sptr = gnss_shared_ptr<dll_pll_veml_tracking_fpga>;
51 
52 dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(const Dll_Pll_Conf_Fpga &conf_);
53 
54 
55 /*!
56  * \brief This class implements a code DLL + carrier PLL tracking block.
57  */
58 class dll_pll_veml_tracking_fpga : public gr::block
59 {
60 public:
61  /*!
62  * \brief Destructor
63  */
65 
66  /*!
67  * \brief Set the channel number and configure some multicorrelator parameters
68  */
69  void set_channel(uint32_t channel, const std::string &device_io_name);
70 
71  /*!
72  * \brief This function is used with two purposes:
73  * 1 -> To set the gnss_synchro
74  * 2 -> A set_gnss_synchro command with a valid PRN is received when the system is going to run
75  * acquisition with that PRN. We can use this command to pre-initialize tracking parameters and
76  * variables before the actual acquisition process takes place. In this way we minimize the
77  * latency between acquisition and tracking once the acquisition has been made.
78  */
79  void set_gnss_synchro(Gnss_Synchro *p_gnss_synchro);
80 
81  /*!
82  * \brief This function starts the tracking process
83  */
84  void start_tracking();
85 
86  /*!
87  * \brief This function sets a flag that makes general_work to stop in order to finish the tracking process.
88  */
89  void stop_tracking();
90 
91  /*!
92  * \brief General Work
93  */
94  int general_work(int noutput_items, gr_vector_int &ninput_items,
95  gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
96 
97  /*!
98  * \brief This function disables the HW multicorrelator in the FPGA in order to stop the tracking process
99  */
100  void reset();
101 
102 private:
103  friend dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(const Dll_Pll_Conf_Fpga &conf_);
104  explicit dll_pll_veml_tracking_fpga(const Dll_Pll_Conf_Fpga &conf_);
105 
106  void msg_handler_telemetry_to_trk(const pmt::pmt_t &msg);
107  bool cn0_and_tracking_lock_status(double coh_integration_time_s);
108  bool acquire_secondary();
109  void do_correlation_step();
110  void run_dll_pll();
111  void check_carrier_phase_coherent_initialization();
112  void update_tracking_vars();
113  void clear_tracking_vars();
114  void save_correlation_results();
115  void log_data();
116  int32_t save_matfile() const;
117 
118  Dll_Pll_Conf_Fpga d_trk_parameters;
119 
120  Exponential_Smoother d_cn0_smoother;
121  Exponential_Smoother d_carrier_lock_test_smoother;
122 
123  Gnss_Synchro *d_acquisition_gnss_synchro;
124 
125  Tracking_loop_filter d_code_loop_filter;
126 
127  Tracking_FLL_PLL_filter d_carrier_loop_filter;
128 
129  volk_gnsssdr::vector<float> d_local_code_shift_chips;
130  volk_gnsssdr::vector<gr_complex> d_correlator_outs;
131  volk_gnsssdr::vector<gr_complex> d_Prompt_Data;
132  volk_gnsssdr::vector<gr_complex> d_Prompt_buffer;
133 
134  boost::circular_buffer<float> d_dll_filt_history;
135  boost::circular_buffer<std::pair<double, double>> d_code_ph_history;
136  boost::circular_buffer<std::pair<double, double>> d_carr_ph_history;
137  boost::circular_buffer<gr_complex> d_Prompt_circular_buffer;
138 
139  std::string d_systemName;
140  std::string d_signal_type;
141  std::string d_secondary_code_string;
142  std::string d_data_secondary_code_string;
143  std::string d_signal_pretty_name;
144  std::string d_dump_filename;
145 
146  std::ofstream d_dump_file;
147 
148  std::shared_ptr<Fpga_Multicorrelator_8sc> d_multicorrelator_fpga;
149 
150  boost::condition_variable d_m_condition;
151 
152  boost::mutex d_mutex;
153 
154  const size_t int_type_hash_code = typeid(int).hash_code();
155 
156  double d_signal_carrier_freq;
157  double d_code_period;
158  double d_code_chip_rate;
159  double d_code_phase_step_chips;
160  double d_code_phase_rate_step_chips;
161  double d_carrier_phase_step_rad;
162  double d_carrier_phase_rate_step_rad;
163  double d_acq_code_phase_samples;
164  double d_acq_carrier_doppler_hz;
165  double d_rem_code_phase_samples;
166  double d_rem_code_phase_samples_prev;
167  double d_current_correlation_time_s;
168  double d_carr_phase_error_hz;
169  double d_carr_freq_error_hz;
170  double d_carr_error_filt_hz;
171  double d_code_error_chips;
172  double d_code_error_filt_chips;
173  double d_code_freq_chips;
174  double d_carrier_doppler_hz;
175  double d_acc_carrier_phase_rad;
176  double d_rem_code_phase_chips;
177  double d_T_chip_seconds;
178  double d_T_prn_seconds;
179  double d_T_prn_samples;
180  double d_K_blk_samples;
181  double d_carrier_lock_test;
182  double d_CN0_SNV_dB_Hz;
183  double d_carrier_lock_threshold;
184 
185  gr_complex *d_Very_Early;
186  gr_complex *d_Early;
187  gr_complex *d_Prompt;
188  gr_complex *d_Late;
189  gr_complex *d_Very_Late;
190 
191  gr_complex d_VE_accu;
192  gr_complex d_E_accu;
193  gr_complex d_P_accu;
194  gr_complex d_P_accu_old;
195  gr_complex d_L_accu;
196  gr_complex d_VL_accu;
197  gr_complex d_P_data_accu;
198 
199  uint64_t d_sample_counter;
200  uint64_t d_acq_sample_stamp;
201  uint64_t d_sample_counter_next;
202 
203  float *d_prompt_data_shift;
204  float d_rem_carr_phase_rad;
205 
206  int32_t d_symbols_per_bit;
207  int32_t d_state;
208  int32_t d_extend_correlation_symbols_count;
209  int32_t d_current_symbol;
210  int32_t d_current_data_symbol;
211  int32_t d_current_integration_length_samples;
212  int32_t d_cn0_estimation_counter;
213  int32_t d_carrier_lock_fail_counter;
214  int32_t d_code_lock_fail_counter;
215  int32_t d_correlation_length_ms;
216  int32_t d_n_correlator_taps;
217  int32_t d_next_integration_length_samples;
218  int32_t d_extend_fpga_integration_periods;
219 
220  uint32_t d_channel;
221  uint32_t d_secondary_code_length;
222  uint32_t d_data_secondary_code_length;
223  uint32_t d_code_length_chips;
224  uint32_t d_code_samples_per_chip; // All signals have 1 sample per chip code except Gal. E1 which has 2 (CBOC disabled) or 12 (CBOC enabled)
225  uint32_t d_fpga_integration_period;
226  uint32_t d_current_fpga_integration_period;
227 
228  bool d_veml;
229  bool d_cloop;
230  bool d_secondary;
231  bool d_enable_extended_integration;
232  bool d_dump;
233  bool d_dump_mat;
234  bool d_pull_in_transitory;
235  bool d_corrected_doppler;
236  bool d_interchange_iq;
237  bool d_acc_carrier_phase_initialized;
238  bool d_worker_is_done;
239  bool d_extended_correlation_in_fpga;
240  bool d_current_extended_correlation_in_fpga;
241  bool d_stop_tracking;
242  bool d_sc_demodulate_enabled;
243  bool d_Flag_PLL_180_deg_phase_locked;
244 };
245 
246 
247 /** \} */
248 /** \} */
249 #endif // GNSS_SDR_DLL_PLL_VEML_TRACKING_FPGA_H
void stop_tracking()
This function sets a flag that makes general_work to stop in order to finish the tracking process...
void set_channel(uint32_t channel, const std::string &device_io_name)
Set the channel number and configure some multicorrelator parameters.
This class implements a code DLL + carrier PLL tracking block.
void reset()
This function disables the HW multicorrelator in the FPGA in order to stop the tracking process...
Class that contains all the configuration parameters for generic tracking block based on a DLL and a ...
This class implements a hybrid FLL and PLL filter for tracking carrier loop.
This is the class that contains the information that is shared by the processing blocks.
Definition: gnss_synchro.h:38
This interface represents a GNSS block.
Class that implements a first-order exponential smoother.
~dll_pll_veml_tracking_fpga()
Destructor.
void set_gnss_synchro(Gnss_Synchro *p_gnss_synchro)
This function is used with two purposes: 1 -> To set the gnss_synchro 2 -> A set_gnss_synchro command...
int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
General Work.
void start_tracking()
This function starts the tracking process.
Class that implements carrier wipe-off and correlators.
Generic 1st to 3rd order loop filter implementation.
This class implements a generic 1st, 2nd or 3rd order loop filter.
Interface of a hybrid FLL and PLL filter for tracking carrier loop.
Class that implements an exponential smoother.