From 72bfc059d762f289eea98cd54b6be71cfefabf6e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Fri, 4 Sep 2026 19:45:43 +0200 Subject: [PATCH] Fix sample-counter drift in GPS L1 C/A fine-Doppler acquisition (Fixes #1080) --- .../pcps_acquisition_fine_doppler_cc.cc | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc index e66d48bd2..6636b07c7 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition_fine_doppler_cc.cc @@ -27,6 +27,7 @@ #include #include // std::rotate, std::fill_n #include +#include // for ceil #if USE_GLOG_AND_GFLAGS #include @@ -392,8 +393,8 @@ bool pcps_acquisition_fine_doppler_cc::start() } -int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, - gr_vector_int &ninput_items __attribute__((unused)), gr_vector_const_void_star &input_items, +int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items __attribute__((unused)), + gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { /*! @@ -416,7 +417,7 @@ int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, if (!d_active) { - d_sample_counter += static_cast(d_fft_size); // sample counter + d_sample_counter += static_cast(ninput_items[0]); // sample counter consume_each(ninput_items[0]); return 0; } @@ -462,12 +463,12 @@ int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, case 3: // Fine doppler estimation samples_remaining = 10 * static_cast(d_acq_params.samples_per_ms) - d_n_samples_in_buffer; - if (samples_remaining > noutput_items) + if (samples_remaining > ninput_items[0]) { - std::copy(in_aux, in_aux + noutput_items, &d_10_ms_buffer[d_n_samples_in_buffer]); - d_n_samples_in_buffer += noutput_items; - d_sample_counter += static_cast(noutput_items); // sample counter - consume_each(noutput_items); + std::copy(in_aux, in_aux + ninput_items[0], &d_10_ms_buffer[d_n_samples_in_buffer]); + d_n_samples_in_buffer += ninput_items[0]; + d_sample_counter += static_cast(ninput_items[0]); // sample counter + consume_each(ninput_items[0]); } else { @@ -477,7 +478,7 @@ int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, d_sample_counter += static_cast(samples_remaining); // sample counter consume_each(samples_remaining); } - estimate_Doppler(); // disabled in repo + estimate_Doppler(); d_n_samples_in_buffer = 0; d_state = 4; } @@ -504,8 +505,8 @@ int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, d_state = 0; if (!d_acq_params.blocking_on_standby) { - d_sample_counter += static_cast(noutput_items); // sample counter - consume_each(noutput_items); + d_sample_counter += static_cast(ninput_items[0]); // sample counter + consume_each(ninput_items[0]); } // Copy and push current Gnss_Synchro to monitor queue if (d_acq_params.enable_monitor_output) @@ -537,16 +538,16 @@ int pcps_acquisition_fine_doppler_cc::general_work(int noutput_items, d_state = 0; if (!d_acq_params.blocking_on_standby) { - d_sample_counter += static_cast(noutput_items); // sample counter - consume_each(noutput_items); + d_sample_counter += static_cast(ninput_items[0]); // sample counter + consume_each(ninput_items[0]); } break; default: d_state = 0; if (!d_acq_params.blocking_on_standby) { - d_sample_counter += static_cast(noutput_items); // sample counter - consume_each(noutput_items); + d_sample_counter += static_cast(ninput_items[0]); // sample counter + consume_each(ninput_items[0]); } break; }