41 #ifndef GNSS_SDR_PCPS_ACQUISITION_H 42 #define GNSS_SDR_PCPS_ACQUISITION_H 44 #if ARMA_NO_BOUND_CHECKING 45 #define ARMA_NO_DEBUG 1 51 #include <glog/logging.h> 52 #include <gnuradio/block.h> 53 #include <gnuradio/fft/fft.h> 54 #include <gnuradio/gr_complex.h> 55 #include <gnuradio/thread/thread.h> 56 #include <gnuradio/types.h> 57 #include <volk/volk_complex.h> 58 #include <volk_gnsssdr/volk_gnsssdr_alloc.h> 73 #if GNURADIO_USES_STD_POINTERS 75 #include <boost/shared_ptr.hpp> 81 #if GNURADIO_USES_STD_POINTERS 82 using pcps_acquisition_sptr = std::shared_ptr<pcps_acquisition>;
84 using pcps_acquisition_sptr = boost::shared_ptr<pcps_acquisition>;
87 pcps_acquisition_sptr pcps_make_acquisition(
const Acq_Conf& conf_);
112 gr::thread::scoped_lock lock(d_setlock);
113 d_gnss_synchro = p_gnss_synchro;
129 void set_resampler_latency(uint32_t latency_samples);
134 inline uint32_t
mag()
const 146 gr::thread::scoped_lock lock(d_setlock);
164 d_channel_fsm = std::move(channel_fsm);
174 gr::thread::scoped_lock lock(d_setlock);
175 d_threshold = threshold;
184 gr::thread::scoped_lock lock(d_setlock);
185 d_acq_parameters.doppler_max = doppler_max;
194 gr::thread::scoped_lock lock(d_setlock);
195 d_doppler_step = doppler_step;
204 gr::thread::scoped_lock lock(d_setlock);
205 if (doppler_center != d_doppler_center)
207 DLOG(INFO) <<
" Doppler assistance for Channel: " << d_channel <<
" => Doppler: " << doppler_center <<
"[Hz]";
208 d_doppler_center = doppler_center;
209 update_grid_doppler_wipeoffs();
216 int general_work(
int noutput_items, gr_vector_int& ninput_items,
217 gr_vector_const_void_star& input_items,
218 gr_vector_void_star& output_items);
221 friend pcps_acquisition_sptr pcps_make_acquisition(
const Acq_Conf& conf_);
224 void update_local_carrier(own::span<gr_complex> carrier_vector,
float freq);
225 void update_grid_doppler_wipeoffs();
226 void update_grid_doppler_wipeoffs_step2();
227 void acquisition_core(uint64_t samp_count);
228 void send_negative_acquisition();
229 void send_positive_acquisition();
230 void dump_results(int32_t effective_fft_size);
233 void calculate_threshold(
void);
234 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);
235 float max_to_input_power_statistic(uint32_t& indext, int32_t& doppler, uint32_t num_doppler_bins, int32_t doppler_max, int32_t doppler_step);
237 volk_gnsssdr::vector<volk_gnsssdr::vector<float>> d_magnitude_grid;
238 volk_gnsssdr::vector<float> d_tmp_buffer;
239 volk_gnsssdr::vector<std::complex<float>> d_input_signal;
240 volk_gnsssdr::vector<volk_gnsssdr::vector<std::complex<float>>> d_grid_doppler_wipeoffs;
241 volk_gnsssdr::vector<volk_gnsssdr::vector<std::complex<float>>> d_grid_doppler_wipeoffs_step_two;
242 volk_gnsssdr::vector<std::complex<float>> d_fft_codes;
243 volk_gnsssdr::vector<std::complex<float>> d_data_buffer;
244 volk_gnsssdr::vector<lv_16sc_t> d_data_buffer_sc;
246 std::unique_ptr<gr::fft::fft_complex> d_fft_if;
247 std::unique_ptr<gr::fft::fft_complex> d_ifft;
248 std::weak_ptr<ChannelFsm> d_channel_fsm;
253 arma::fmat d_narrow_grid;
255 std::string d_dump_filename;
257 int64_t d_dump_number;
258 uint64_t d_sample_counter;
263 float d_test_statistics;
264 float d_doppler_center_step_two;
267 int32_t d_positive_acq;
268 int32_t d_doppler_center;
269 int32_t d_doppler_bias;
271 uint32_t d_samplesPerChip;
272 uint32_t d_doppler_step;
273 uint32_t d_num_noncoherent_integrations_counter;
275 uint32_t d_consumed_samples;
276 uint32_t d_num_doppler_bins;
277 uint32_t d_num_doppler_bins_step2;
278 uint32_t d_dump_channel;
279 uint32_t d_buffer_count;
282 bool d_worker_active;
285 bool d_use_CFAR_algorithm_flag;
289 #endif // GNSS_SDR_PCPS_ACQUISITION_H void set_doppler_step(uint32_t doppler_step)
Set Doppler steps for the grid search.
This class implements a Parallel Code Phase Search Acquisition.
void set_state(int32_t state)
If set to 1, ensures that acquisition starts at the first available sample.
void set_active(bool active)
Starts acquisition algorithm, turning from standby mode to active mode.
void set_doppler_max(uint32_t doppler_max)
Set maximum Doppler grid search.
Class that contains all the configuration parameters for generic acquisition block based on the PCPS ...
Interface of the State Machine for channel.
void set_local_code(std::complex< float > *code)
Sets local code for PCPS acquisition algorithm.
This is the class that contains the information that is shared by the processing blocks.
void set_doppler_center(int32_t doppler_center)
Set Doppler center frequency for the grid search. It will refresh the Doppler grid.
void set_channel(uint32_t channel)
Set acquisition channel unique ID.
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.
void set_gnss_synchro(Gnss_Synchro *p_gnss_synchro)
Set acquisition/tracking common Gnss_Synchro object pointer to exchange synchronization data between ...
int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
Parallel Code Phase Search Acquisition signal processing.
void init()
Initializes acquisition algorithm and reserves memory.
void set_threshold(float threshold)
Set statistics threshold of PCPS algorithm.