diff --git a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc index d1c97b2c0..b785b12ca 100644 --- a/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc +++ b/src/algorithms/acquisition/gnuradio_blocks/pcps_acquisition.cc @@ -308,9 +308,21 @@ bool pcps_acquisition::is_fdma() void pcps_acquisition::update_local_carrier(own::span carrier_vector, float freq) const { const auto fs_in = d_acq_parameters.use_automatic_resampler ? d_acq_parameters.resampled_fs : d_acq_parameters.fs_in; - const auto phase_step_rad = static_cast(TWO_PI) * freq / static_cast(fs_in); - std::array _phase{}; - volk_gnsssdr_s32f_sincos_32fc(carrier_vector.data(), -phase_step_rad, _phase.data(), carrier_vector.size()); + const double phase_step_rad = TWO_PI * static_cast(freq) / static_cast(fs_in); + const gr_complex phase_inc(static_cast(std::cos(phase_step_rad)), static_cast(-std::sin(phase_step_rad))); + gr_complex phase(1.0F, 0.0F); + auto* out = carrier_vector.data(); + const auto num_samples = carrier_vector.size(); + for (std::size_t i = 0; i < num_samples; i++) + { + out[i] = phase; + phase *= phase_inc; + if ((i & 511U) == 511U) + { + // keep the rotator on the unit circle + phase /= std::abs(phase); + } + } }