GNSS-SDR  0.0.19
An Open Source GNSS Software Defined Receiver
pcps_acquisition_fpga.h
Go to the documentation of this file.
1 /*!
2  * \file pcps_acquisition_fpga.h
3  * \brief This class implements a Parallel Code Phase Search Acquisition for the FPGA
4  *
5  *
6  * Kay Borre book: K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
7  * "A Software-Defined GPS and Galileo Receiver. A Single-Frequency
8  * Approach", Birkhauser, 2007. pp 81-84
9  *
10  * \authors <ul>
11  * <li> Marc Majoral, 2019. mmajoral(at)cttc.es
12  * <li> Javier Arribas, 2019. jarribas(at)cttc.es
13  * </ul>
14  *
15  * -----------------------------------------------------------------------------
16  *
17  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
18  * This file is part of GNSS-SDR.
19  *
20  * Copyright (C) 2010-2022 (see AUTHORS file for a list of contributors)
21  * SPDX-License-Identifier: GPL-3.0-or-later
22  *
23  * -----------------------------------------------------------------------------
24  */
25 
26 #ifndef GNSS_SDR_PCPS_ACQUISITION_FPGA_H
27 #define GNSS_SDR_PCPS_ACQUISITION_FPGA_H
28 
29 #include "acq_conf_fpga.h"
30 #include "channel_fsm.h"
31 #include "fpga_acquisition.h"
32 #include <glog/logging.h>
33 #include <cstdint> // for uint32_t
34 #include <memory> // for shared_ptr
35 #include <string> // for string
36 #include <utility> // for move
37 
38 /** \addtogroup Acquisition
39  * \{ */
40 /** \addtogroup Acq_gnuradio_blocks
41  * \{ */
42 
43 
44 class Gnss_Synchro;
45 
47 
48 using pcps_acquisition_fpga_sptr = std::shared_ptr<pcps_acquisition_fpga>;
49 
50 pcps_acquisition_fpga_sptr pcps_make_acquisition_fpga(Acq_Conf_Fpga& conf_);
51 
52 /*!
53  * \brief This class implements a Parallel Code Phase Search Acquisition that uses the FPGA.
54  *
55  * Check \ref Navitec2012 "An Open Source Galileo E1 Software Receiver",
56  * Algorithm 1, for a pseudocode description of this implementation.
57  */
59 {
60 public:
61  /*!
62  * \brief Destructor
63  */
64  ~pcps_acquisition_fpga() = default;
65 
66  /*!
67  * \brief Set acquisition/tracking common Gnss_Synchro object pointer
68  * to exchange synchronization data between acquisition and tracking blocks.
69  * \param p_gnss_synchro Satellite information shared by the processing blocks.
70  */
71  inline void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
72  {
73  d_gnss_synchro = p_gnss_synchro;
74  }
75 
76  /*!
77  * \brief Returns the maximum peak of grid search.
78  */
79  inline uint32_t mag() const
80  {
81  return d_mag;
82  }
83 
84  /*!
85  * \brief Initializes acquisition algorithm.
86  */
87  void init();
88 
89  /*!
90  * \brief Sets local code for PCPS acquisition algorithm.
91  */
92  void set_local_code();
93 
94  /*!
95  * \brief If set to 1, ensures that acquisition starts at the
96  * first available sample.
97  * \param state - int=1 forces start of acquisition
98  */
99  void set_state(int32_t state);
100 
101  /*!
102  * \brief Starts acquisition algorithm, turning from standby mode to
103  * active mode
104  * \param active - bool that activates/deactivates the block.
105  */
106  void set_active(bool active);
107 
108  /*!
109  * \brief Set acquisition channel unique ID
110  * \param channel - receiver channel.
111  */
112  inline void set_channel(uint32_t channel)
113  {
114  d_channel = channel;
115  }
116 
117  /*!
118  * \brief Set channel fsm associated to this acquisition instance
119  */
120  inline void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm)
121  {
122  d_channel_fsm = std::move(channel_fsm);
123  }
124 
125  /*!
126  * \brief Set statistics threshold of PCPS algorithm.
127  * \param threshold - Threshold for signal detection (check \ref Navitec2012,
128  * Algorithm 1, for a definition of this threshold).
129  */
130  inline void set_threshold(float threshold)
131  {
132  d_threshold = threshold;
133  }
134 
135  /*!
136  * \brief Set maximum Doppler grid search
137  * \param doppler_max - Maximum Doppler shift considered in the grid search [Hz].
138  */
139  inline void set_doppler_max(uint32_t doppler_max)
140  {
141  d_doppler_max = doppler_max;
142  d_acquisition_fpga->set_doppler_max(doppler_max);
143  }
144 
145  /*!
146  * \brief Set Doppler steps for the grid search
147  * \param doppler_step - Frequency bin of the search grid [Hz].
148  */
149  inline void set_doppler_step(uint32_t doppler_step)
150  {
151  d_doppler_step = doppler_step;
152  d_acquisition_fpga->set_doppler_step(doppler_step);
153  }
154 
155  /*!
156  * \brief Set Doppler center frequency for the grid search. It will refresh the Doppler grid.
157  * \param doppler_center - Frequency center of the search grid [Hz].
158  */
159  inline void set_doppler_center(int32_t doppler_center)
160  {
161  if (doppler_center != d_doppler_center)
162  {
163  DLOG(INFO) << " Doppler assistance for Channel: " << d_channel << " => Doppler: " << doppler_center << "[Hz]";
164  d_doppler_center = doppler_center;
165  }
166  }
167 
168  /*!
169  * \brief This function triggers a HW reset of the FPGA PL.
170  */
171  void reset_acquisition();
172 
173  /*!
174  * \brief stop the acquisition and the other FPGA modules.
175  */
176  void stop_acquisition();
177 
178 private:
179  friend pcps_acquisition_fpga_sptr pcps_make_acquisition_fpga(Acq_Conf_Fpga& conf_);
180  explicit pcps_acquisition_fpga(Acq_Conf_Fpga& conf_);
181 
182  void send_negative_acquisition();
183  void send_positive_acquisition();
184  void acquisition_core(uint32_t num_doppler_bins, uint32_t doppler_step, int32_t doppler_min);
185  float first_vs_second_peak_statistic(uint32_t& indext, int32_t& doppler, uint32_t num_doppler_bins, int32_t doppler_max, int32_t doppler_step);
186 
187  std::shared_ptr<Fpga_Acquisition> d_acquisition_fpga;
188  std::weak_ptr<ChannelFsm> d_channel_fsm;
189 
190  Acq_Conf_Fpga d_acq_parameters;
191 
192  Gnss_Synchro* d_gnss_synchro;
193 
194  uint64_t d_sample_counter;
195 
196  float d_threshold;
197  float d_mag;
198  float d_input_power;
199  float d_test_statistics;
200  float d_doppler_step2;
201  float d_doppler_center_step_two;
202 
203  int32_t d_doppler_center;
204  int32_t d_state;
205 
206  uint32_t d_doppler_index;
207  uint32_t d_channel;
208  uint32_t d_doppler_step;
209  uint32_t d_doppler_max;
210  uint32_t d_fft_size;
211  uint32_t d_num_doppler_bins;
212  uint32_t d_downsampling_factor;
213  uint32_t d_select_queue_Fpga;
214  uint32_t d_total_block_exp;
215  uint32_t d_num_doppler_bins_step2;
216  uint32_t d_max_num_acqs;
217 
218  bool d_active;
219  bool d_make_2_steps;
220 };
221 
222 
223 /** \} */
224 /** \} */
225 #endif // GNSS_SDR_PCPS_ACQUISITION_FPGA_H
Class that contains all the configuration parameters for generic acquisition block based on the PCPS ...
void reset_acquisition()
This function triggers a HW reset of the FPGA PL.
void set_threshold(float threshold)
Set statistics threshold of PCPS algorithm.
void set_doppler_center(int32_t doppler_center)
Set Doppler center frequency for the grid search. It will refresh the Doppler grid.
Highly optimized FPGA vector correlator class.
void set_local_code()
Sets local code for PCPS acquisition algorithm.
void stop_acquisition()
stop the acquisition and the other FPGA modules.
void set_channel(uint32_t channel)
Set acquisition channel unique ID.
Interface of the State Machine for channel.
void set_doppler_step(uint32_t doppler_step)
Set Doppler steps for the grid search.
void set_gnss_synchro(Gnss_Synchro *p_gnss_synchro)
Set acquisition/tracking common Gnss_Synchro object pointer to exchange synchronization data between ...
void set_doppler_max(uint32_t doppler_max)
Set maximum Doppler grid search.
This is the class that contains the information that is shared by the processing blocks.
Definition: gnss_synchro.h:38
void set_state(int32_t state)
If set to 1, ensures that acquisition starts at the first available sample.
This class implements a Parallel Code Phase Search Acquisition that uses the FPGA.
void set_active(bool active)
Starts acquisition algorithm, turning from standby mode to active mode.
~pcps_acquisition_fpga()=default
Destructor.
void init()
Initializes acquisition algorithm.
void set_channel_fsm(std::weak_ptr< ChannelFsm > channel_fsm)
Set channel fsm associated to this acquisition instance.
uint32_t mag() const
Returns the maximum peak of grid search.