Merge branch 'full-grid-search-standalone' of https://github.com/joebre/gnss-sdr into joebre-full-grid-search-standalone

This commit is contained in:
Carles Fernandez
2026-09-16 14:18:14 +02:00
4 changed files with 54 additions and 8 deletions
+9
View File
@@ -62,6 +62,15 @@ All notable changes to GNSS-SDR will be documented in this file.
### Improvements in Availability:
- Added `Acquisition_XX.full_grid_search` (default: `false`) for acquisition
implementations using the CPU PCPS block. When enabled, each search stage
accumulates all `max_dwells` non-coherent integrations before accepting or
rejecting the strongest peak. This also applies to both stages of
`make_two_steps` and to the reduced grid used by `enable_doppler_narrowing`.
The default preserves early acceptance; `max_dwells=1` is unchanged.
`bit_transition_flag=true` takes precedence and still uses a single
double-length dwell. Waiting for all dwells increases acquisition latency.
Contributed by @joebre.
- Improved TOW rollover handling in Telemetry Decoder blocks.
- Galileo F/NAV and I/NAV ephemerides are now retained independently instead of
overwriting each other when they have the same PRN. PVT automatically uses the
@@ -819,19 +819,47 @@ void pcps_acquisition::acquisition_core(uint64_t sample_count)
if (!d_acq_parameters.bit_transition_flag)
{
if (result.test_statistics > get_threshold())
if (d_acq_parameters.full_grid_search)
{
handle_threshold_reached(result);
// Search the entire acquisition grid (accumulate through the full max_dwells)
// before deciding accept/reject, instead of exiting as soon as any single dwell's
// (possibly still noisy, partially non-coherently accumulated) grid crosses
// threshold -- a later dwell's fuller integration can reveal a different, genuinely
// stronger peak elsewhere in the same grid that an early exit never gets the chance
// to compare against.
if (d_num_noncoherent_integrations_counter == d_acq_parameters.max_dwells)
{
if (result.test_statistics > get_threshold())
{
handle_threshold_reached(result);
}
else
{
handle_integration_done(result);
}
}
else
{
d_buffer_sample_count = 0;
d_state = 1;
}
}
else
{
d_buffer_sample_count = 0;
d_state = 1;
}
if (result.test_statistics > get_threshold())
{
handle_threshold_reached(result);
}
else
{
d_buffer_sample_count = 0;
d_state = 1;
}
if (d_num_noncoherent_integrations_counter == d_acq_parameters.max_dwells)
{
handle_integration_done(result);
if (d_num_noncoherent_integrations_counter == d_acq_parameters.max_dwells)
{
handle_integration_done(result);
}
}
}
else
@@ -83,6 +83,7 @@ void Acq_Conf::SetFromConfiguration(const ConfigurationInterface *configuration,
make_2_steps = configuration->property(role + ".make_two_steps", make_2_steps);
blocking_on_standby = configuration->property(role + ".blocking_on_standby", blocking_on_standby);
enable_doppler_narrowing = configuration->property(role + ".enable_doppler_narrowing", enable_doppler_narrowing);
full_grid_search = configuration->property(role + ".full_grid_search", full_grid_search);
if (pfa <= 0.0)
{
@@ -92,6 +92,14 @@ public:
// flag has no effect and the full configured Doppler grid is always searched.
bool enable_doppler_narrowing{false};
// Accumulate through the full max_dwells before deciding accept/reject, instead
// of exiting as soon as any single dwell's (possibly still noisy, partially
// accumulated) grid crosses threshold -- a later dwell's fuller integration can
// reveal a different, genuinely stronger peak elsewhere in the grid that an early
// exit never gets the chance to compare against. Opt-in: off by default, enable
// per-implementation in the .conf (e.g. Acquisition_1B.full_grid_search = true).
bool full_grid_search{false};
// Specific to some implementations
bool acquire_pilot{false};
bool acquire_iq{false};