18 #ifndef GNSS_SDR_DLL_PLL_VEML_TRACKING_FPGA_H 19 #define GNSS_SDR_DLL_PLL_VEML_TRACKING_FPGA_H 26 #include <boost/circular_buffer.hpp> 27 #include <gnuradio/block.h> 28 #include <gnuradio/gr_complex.h> 29 #include <gnuradio/types.h> 31 #include <volk_gnsssdr/volk_gnsssdr_alloc.h> 50 using dll_pll_veml_tracking_fpga_sptr = gnss_shared_ptr<dll_pll_veml_tracking_fpga>;
52 dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(
const Dll_Pll_Conf_Fpga &conf_);
69 void set_channel(uint32_t channel,
const std::string &device_io_name);
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);
103 friend dll_pll_veml_tracking_fpga_sptr dll_pll_veml_make_tracking_fpga(
const Dll_Pll_Conf_Fpga &conf_);
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();
111 void check_carrier_phase_coherent_initialization();
112 void update_tracking_vars();
113 void clear_tracking_vars();
114 void save_correlation_results();
116 int32_t save_matfile()
const;
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;
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;
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;
146 std::ofstream d_dump_file;
148 std::shared_ptr<Fpga_Multicorrelator_8sc> d_multicorrelator_fpga;
150 boost::condition_variable d_m_condition;
152 boost::mutex d_mutex;
154 const size_t int_type_hash_code =
typeid(int).hash_code();
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;
185 gr_complex *d_Very_Early;
187 gr_complex *d_Prompt;
189 gr_complex *d_Very_Late;
191 gr_complex d_VE_accu;
194 gr_complex d_P_accu_old;
196 gr_complex d_VL_accu;
197 gr_complex d_P_data_accu;
199 uint64_t d_sample_counter;
200 uint64_t d_acq_sample_stamp;
201 uint64_t d_sample_counter_next;
203 float *d_prompt_data_shift;
204 float d_rem_carr_phase_rad;
206 int32_t d_symbols_per_bit;
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;
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;
225 uint32_t d_fpga_integration_period;
226 uint32_t d_current_fpga_integration_period;
231 bool d_enable_extended_integration;
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;
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.
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.