Files
gnss-sdr/src/core/interfaces/acquisition_interface.h
T
joebre 2b6a1bb89c Unify pcps_acquisition's Doppler search into a single N-bin API
set_doppler_uncertainty() only ever supported two states: the full
configured grid, or a single exactly-known bin (assisted narrowing's
2-bin variant). Regular searches, primary-frequency-assisted secondary
signals, and any future partial-uncertainty search (e.g. a visibility-
aware Doppler prediction with residual error) all had to be shoehorned
into one of those two cases instead of directly stating how many
candidate bins they actually need.

Replaces it with set_doppler_num_bins(uint32_t): 0 is a sentinel for
"the full configured range" (the only value a caller can't supply
directly, since that count is otherwise private to this class); any
other value is the literal candidate bin count, from 1 (exactly known,
as when assisted by an already-tracked primary frequency) up to the
full grid. Regular and narrowed searches now go through the exact same
code path -- update_grid_doppler_wipeoffs(), compute_statistics(), the
two statistic functions -- differing only in candidate_count.

CFAR reference-bin placement is generalized the same way:
needs_extra_reference_row(candidate_bins) reproduces both today's
full-grid conditional extra-row behavior (only when the in-grid
wraparound distance can't clear reference_bin_min_sidelobes) and
narrowed mode's unconditional extra-row assumption, for any candidate
count. d_min_reference_separation_hz is derived automatically from the
new reference_bin_min_sidelobes config parameter (default 4) and
coherent_integration_time_ms, rather than needing to be set directly.

Also fixes a latent asymmetry: whenever a dedicated reference row is
needed for more than one real candidate, two rows are now computed --
at +doppler_max and -doppler_max -- and the statistic picks whichever
sits opposite the winning candidate's side of center. Previously the
reference was always fixed at +doppler_max regardless of which side
the signal landed on; a candidate near the edge of the search range
could end up right next to its own reference sample. With exactly one
real candidate (always at offset 0, no side to mirror), a single fixed
row is kept, matching prior behavior.

The detection threshold (d_threshold_active) is recalibrated by
set_doppler_num_bins() whenever the active candidate count changes,
since compute_threshold() folds the bin count into the false-alarm
probability.

Propagates the rename through AcquisitionInterface,
PcpsAcquisitionAdapter, ChannelInterface, Channel, and
GNSSFlowgraph's two assist_acquisition_doppler() call sites (0 ->
literal full-grid sentinel for the regular/unassisted case, 1 for the
dual-frequency-assisted case -- an exact inversion of the old
uncertainty-flag convention).

Verified: full local test suite (acq_test, trk_test, gnss_block_test,
flowgraph_test -- 105 tests) passes against a from-scratch build off
upstream/next, isolated from other in-progress work in this tree.
2026-09-11 15:25:54 +02:00

77 lines
2.9 KiB
C++

/*!
* \file acquisition_interface.h
* \brief Header file of the interface to an acquisition GNSS block.
* \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
* Luis Esteve, 2011. luis(at)epsilon-formacion.com
*
* This header file contains the interface to an abstract class
* for acquisition algorithms. Since all its methods are virtual,
* this class cannot be instantiated directly, and a subclass can only be
* instantiated directly if all inherited pure virtual methods have been
* implemented by that class or a parent class.
*
* -----------------------------------------------------------------------------
*
* GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
* This file is part of GNSS-SDR.
*
* Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* -----------------------------------------------------------------------------
*/
#ifndef GNSS_SDR_ACQUISITION_INTERFACE_H
#define GNSS_SDR_ACQUISITION_INTERFACE_H
#include "gnss_block_interface.h"
#include "gnss_synchro.h"
#include <memory>
/** \addtogroup Core
* \{ */
/** \addtogroup GNSS_Block_Interfaces GNSS block interfaces
* GNSS block interfaces.
* \{ */
template <typename Data>
class Concurrent_Queue;
class ChannelFsm;
/*! \brief This abstract class represents an interface to an acquisition GNSS block.
*
* Abstract class for acquisition algorithms. Since all its methods are virtual,
* this class cannot be instantiated directly, and a subclass can only be
* instantiated directly if all inherited pure virtual methods have been
* implemented by that class or a parent class.
*/
class AcquisitionInterface : public GNSSBlockInterface
{
public:
virtual void set_gnss_synchro(Gnss_Synchro* gnss_synchro) = 0;
virtual void set_channel(unsigned int channel_id) = 0;
virtual void set_channel_fsm(std::weak_ptr<ChannelFsm> channel_fsm) = 0;
virtual void set_doppler_center(int /*doppler_center*/) {}
//! Number of Doppler bins to search, centered on set_doppler_center().
//! doppler_num_bins == 0 searches the full configured Doppler range
//! (computed from doppler_max/doppler_step -- the one value a caller
//! can't supply directly, since that count is implementation-private);
//! any other value is the literal candidate bin count to search -- 1 for
//! an exactly-known Doppler (as when assisted by an already-tracked
//! primary frequency or a visibility-aware prediction), or any N in
//! between for a search with partial uncertainty.
virtual void set_doppler_num_bins(unsigned int /*doppler_num_bins*/) {}
virtual void set_local_code() = 0;
virtual signed int mag() = 0;
virtual void reset() = 0;
virtual void stop_acquisition() = 0;
virtual void set_resampler_latency(uint32_t latency_samples) = 0;
};
/** \} */
/** \} */
#endif // GNSS_SDR_ACQUISITION_INTERFACE */