38 #ifndef GNSS_SDR_PCPS_ACQUISITION_H 39 #define GNSS_SDR_PCPS_ACQUISITION_H 41 #if ARMA_NO_BOUND_CHECKING 42 #define ARMA_NO_DEBUG 1 49 #include <glog/logging.h> 50 #include <gnuradio/block.h> 51 #include <gnuradio/gr_complex.h> 52 #include <gnuradio/thread/thread.h> 53 #include <gnuradio/types.h> 54 #include <volk/volk_complex.h> 55 #include <volk_gnsssdr/volk_gnsssdr_alloc.h> 67 #include <gsl/gsl-lite.hpp> 82 using pcps_acquisition_sptr = gnss_shared_ptr<pcps_acquisition>;
84 pcps_acquisition_sptr pcps_make_acquisition(
const Acq_Conf& conf_);
109 gr::thread::scoped_lock lock(d_setlock);
110 d_gnss_synchro = p_gnss_synchro;
126 void set_resampler_latency(uint32_t latency_samples);
131 inline uint32_t
mag()
const 143 gr::thread::scoped_lock lock(d_setlock);
161 d_channel_fsm = std::move(channel_fsm);
171 gr::thread::scoped_lock lock(d_setlock);
172 d_threshold = threshold;
181 gr::thread::scoped_lock lock(d_setlock);
182 d_acq_parameters.doppler_max = doppler_max;
191 gr::thread::scoped_lock lock(d_setlock);
192 d_doppler_step = doppler_step;
201 gr::thread::scoped_lock lock(d_setlock);
202 if (doppler_center != d_doppler_center)
204 DLOG(INFO) <<
" Doppler assistance for Channel: " << d_channel <<
" => Doppler: " << doppler_center <<
"[Hz]";
205 d_doppler_center = doppler_center;
206 update_grid_doppler_wipeoffs();
213 int general_work(
int noutput_items, gr_vector_int& ninput_items,
214 gr_vector_const_void_star& input_items,
215 gr_vector_void_star& output_items)
override;
218 friend pcps_acquisition_sptr pcps_make_acquisition(
const Acq_Conf& conf_);
221 void update_local_carrier(own::span<gr_complex> carrier_vector,
float freq)
const;
222 void update_grid_doppler_wipeoffs();
223 void update_grid_doppler_wipeoffs_step2();
224 void acquisition_core(uint64_t samp_count);
225 void send_negative_acquisition();
226 void send_positive_acquisition();
227 void dump_results(int32_t effective_fft_size);
229 bool start()
override;
230 void calculate_threshold(
void);
231 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);
232 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);
234 volk_gnsssdr::vector<volk_gnsssdr::vector<float>> d_magnitude_grid;
235 volk_gnsssdr::vector<float> d_tmp_buffer;
236 volk_gnsssdr::vector<std::complex<float>> d_input_signal;
237 volk_gnsssdr::vector<volk_gnsssdr::vector<std::complex<float>>> d_grid_doppler_wipeoffs;
238 volk_gnsssdr::vector<volk_gnsssdr::vector<std::complex<float>>> d_grid_doppler_wipeoffs_step_two;
239 volk_gnsssdr::vector<std::complex<float>> d_fft_codes;
240 volk_gnsssdr::vector<std::complex<float>> d_data_buffer;
241 volk_gnsssdr::vector<lv_16sc_t> d_data_buffer_sc;
243 std::unique_ptr<gnss_fft_complex_fwd> d_fft_if;
244 std::unique_ptr<gnss_fft_complex_rev> d_ifft;
245 std::weak_ptr<ChannelFsm> d_channel_fsm;
250 arma::fmat d_narrow_grid;
252 std::queue<Gnss_Synchro> d_monitor_queue;
253 std::string d_dump_filename;
255 int64_t d_dump_number;
256 uint64_t d_sample_counter;
261 float d_test_statistics;
262 float d_doppler_center_step_two;
265 int32_t d_positive_acq;
266 int32_t d_doppler_center;
267 int32_t d_doppler_bias;
269 uint32_t d_samplesPerChip;
270 uint32_t d_doppler_step;
271 uint32_t d_num_noncoherent_integrations_counter;
273 uint32_t d_consumed_samples;
274 uint32_t d_num_doppler_bins;
275 uint32_t d_num_doppler_bins_step2;
276 uint32_t d_dump_channel;
277 uint32_t d_buffer_count;
280 bool d_worker_active;
283 bool d_use_CFAR_algorithm_flag;
290 #endif // GNSS_SDR_PCPS_ACQUISITION_H void set_doppler_step(uint32_t doppler_step)
Set Doppler steps for the grid search.
Helper file for FFT interface.
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) override
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.