mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2026-10-11 10:11:50 +00:00
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.
77 lines
2.9 KiB
C++
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 */
|