11208 Commits
Author SHA1 Message Date
Carles Fernandez 3fcb502aeb Merge branch 'release0022' v0.0.22 2026-10-04 18:26:32 +02:00
Carles Fernandez 1b19555ae5 Avoid too long lines
Fix very-long-line-length-in-source-file warning in Debian lintian
2026-10-04 13:08:56 +02:00
Carles Fernandez 54137892d4 Bump version to v0.0.22 2026-10-04 08:51:05 +02:00
Carles Fernandez 0c5c086ad0 Add Phillip Vu to the authors list 2026-10-03 08:48:49 +02:00
Carles Fernandez b5c579ffad Merge branch 'mmajoral-fix/fpga-acquisition-version-check' into next 2026-10-03 08:25:32 +02:00
Carles Fernandez 26f97cf691 Merge branch 'fix/fpga-acquisition-version-check' of https://github.com/mmajoral/gnss-sdr into mmajoral-fix/fpga-acquisition-version-check 2026-10-03 08:25:00 +02:00
Carles Fernandez 9148192435 Update comments 2026-10-03 08:20:23 +02:00
Carles Fernandez 8a2c01aabf Merge branch 'joebre-fix-gps-l2c-l5-health-exclusion' into next 2026-10-03 08:18:28 +02:00
Carles Fernandez ee4e9a24ec Report GPS L5 health from LNAV while L5 is pre-operational
GPS L5 is pre-operational, and the L5 health bit of CNAV message type 10 (IS-GPS-200N 30.3.3.1.1.2) is broadcast as "unhealthy" on every SV. As a result, every GPS L5 signal was reported with healthy = false in the monitor_pvt tracked_satellites list, and "not used for navigation" was printed for every GPS satellite. Neither affected the PVT solution: CNAV L2C/L5/J5 observables are not gated on these bits (the L5 exclusion was dropped in v0.0.17), and the CNAV ephemeris handed to RTKLIB carries no svh. GPS L5 now reports the LNAV SV health of the same satellite; GPS L2C and QZSS L5 keep the CNAV bits; and the console message is replaced by a LOG(INFO) line.
2026-10-03 08:13:19 +02:00
Marc Majoral b65be4196b Update acquisition IP core version check 2026-10-02 17:34:31 +02:00
Carles Fernandez 54ee9aad30 Merge branch 'fix-gps-l2c-l5-health-exclusion' of https://github.com/joebre/gnss-sdr into joebre-fix-gps-l2c-l5-health-exclusion 2026-10-02 17:34:04 +02:00
Carles Fernandez 6d3348d698 Merge branch 'mmajoral-refactor/fpga-signal-sources' into next 2026-10-02 11:32:35 +02:00
Carles Fernandez 97b6f151ec Merge branch 'refactor/fpga-signal-sources' of https://github.com/mmajoral/gnss-sdr into mmajoral-refactor/fpga-signal-sources 2026-10-02 11:32:16 +02:00
Marc Majoral 84ae396ba0 Refactor FPGA signal sources and improve error handling 2026-10-02 10:16:31 +02:00
joebre ed1dd3dce3 Fix GPS L2C/L5/J5 satellites being wrongly excluded as unhealthy
Rtklib_Solver::get_broadcast_signal_health() excluded these signals from
the fix based on CNAV message type 10's per-carrier L1/L2/L5 health bit
alone. Per IS-GPS-200N 30.3.3.1.1.2, that bit is only meaningful together
with the SV's LNAV configuration code (20.3.3.5.1.4), which this receiver
does not track; the spec's own instruction for a receiver in that position
is to assume every signal is available on every SV.

Confirmed this was excluding real, operational satellites: cross-checked
the adjacent Transmission Week Number field against ground truth (computed
expected GPS week for the capture date, matched exactly), ruling out a
decode/bit-offset bug. L2C/L5/J5 now fall through to the same SV-wide
health source L1 C/A already uses. Also removes the now-misleading
"not used for navigation" message tied to the same bit.

Tested against real EVK1029 hardware captures; GPS L5 satellites now
report correctly instead of being universally flagged unhealthy.
2026-10-02 10:15:54 +02:00
Carles Fernandez 60def7fc9d Fix default dump filenames for multichannel UHD sources 2026-10-01 22:18:09 +02:00
Carles Fernandez 6ea188a8ee Remove old channel count 2026-10-01 22:17:17 +02:00
Carles Fernandez cf60a4df0e Update macOS version 2026-10-01 21:45:47 +02:00
Carles Fernandez 190979945d Fix reading of GNSS-SDR.SUPL_MNC config parameter 2026-10-01 21:25:53 +02:00
Carles Fernandez 17ca85235e Merge branch 'next' of https://github.com/carlesfernandez/gnss-sdr into next 2026-10-01 15:25:57 +02:00
Carles Fernandez 064ab6bfb9 Merge branch 'joebre-fix-pcps-acquisition-sample-truncation' into next 2026-10-01 15:25:39 +02:00
Carles Fernandez b23a2af572 Fix building 2026-10-01 11:57:15 +02:00
Carles Fernandez 3c256e991b Compute PCPS dwell length with integer arithmetic
Replace std::clamp with std::min/std::max for C++11/14 compatibility
2026-10-01 10:58:13 +02:00
Carles Fernandez 2185dc647d Merge branch 'fix-pcps-acquisition-sample-truncation' of https://github.com/joebre/gnss-sdr into joebre-fix-pcps-acquisition-sample-truncation 2026-10-01 09:58:08 +02:00
joebre 9bd56d4cfe Add a unit test for pcps_acquisition's per-dwell sample-count fix
Covers the exact configuration the fix is for: GNSS-SDR.internal_fs_sps
not a multiple of 1 kHz (4000123 Hz), coherent_integration_time_ms (4)
spanning more than one code period (GPS L1 C/A's own code period is
1 ms), and max_dwells (5) > 1. Asserts a successful acquisition and
checks the reported Doppler/delay against the known synthetic signal's
truth, with tolerances the dwell-boundary drift this fix addresses
would clearly exceed.

Registering it in acq_test (tests/CMakeLists.txt) surfaced that the
target had apparently never actually linked successfully in this
environment before: it links FirFilter/SignalGenerator/GenSignalSource
but was missing input_filter_adapters/signal_generator_adapters/
signal_source_adapters, and separately hit a Linux-only undefined
libboost_thread symbol inside the system's packaged
libgnuradio-runtime.so, fixed with the standard
--copy-dt-needed-entries linker workaround (guarded to Linux only).
Neither is specific to this new test; fixing them was necessary to
build and run the suite at all, and the rest of acq_test (20 tests
total) now passes too.
2026-10-01 08:18:17 +02:00
joebre 3d16234434 Fix PCPS acquisition sample-count truncation when samples_per_code is non-integer
d_samples_to_consume (pcps_acquisition_adapter.cc) is floor(sampled_ms *
samples_per_ms), truncating to an integer. When the configured internal_fs_sps
does not divide evenly into a dwell (any decimation ratio leaving a fractional
number of samples per dwell), every dwell is silently shorter than the true
dwell length by a fixed residual, and that residual compounds linearly across
non-coherent dwells: the true code epoch drifts within the accumulation grid
instead of landing on the same index every time, and the sample stamp handed
to tracking drifts out of sync with it. Tracking then reconstructs the wrong
code phase at pull-in. Only shows up for short, high-chip-rate codes (Galileo
E5a, GPS L5) accumulated over several dwells -- low chip rate codes (GPS L1,
Galileo E1) absorb the same absolute drift as a much smaller fraction of a
chip.

Fix: keep each dwell's FFT/correlation window at the existing fixed
d_samples_to_consume size (so none of the buffer/FFT-plan sizing set up at
construction needs to change), but let the actual stream consumption between
dwells track the true dwell boundary with a standard DDA/Bresenham
accumulator -- skip one extra sample (discarded, never buffered) whenever the
accumulated residual reaches a full sample. This keeps every dwell's window
within half a sample of the true boundary permanently, so the drift this fix
is about never accumulates in the first place. The residual itself is
computed once, in the constructor, directly from the integer resampled_fs
(not through the lossy intermediate float samples_per_ms), and is always in
[0, 1) by construction, so there is no signed/unsigned wraparound risk.

This lives entirely in the sample-consumption state machine in general_work(),
upstream of doppler_grid_cpu()/doppler_grid_cuda()/update_synchro(), so CUDA
builds and bit_transition_flag mode need no special-casing -- they share the
same corrected consumption automatically. It is also correct for
coherent_integration_time_ms spanning more than one code period, since the
residual is derived from the same sampled_ms used for d_samples_to_consume,
not from a single code period.

A no-op whenever samples_per_code is already an integer (any internal_fs_sps
dividing evenly into one dwell): the residual is then exactly 0, so the skip
counter never fires.

Verified against a real EVK1029 dual-band capture (Galileo E1+E5a, GPS
L1+L5): the untouched case (samples/dwell already integer) stayed at ~2
spurious loss-of-lock events per 90s; a case with 0.5 samples/dwell of
truncation error went from 50+ loss-of-lock events per 4 minutes (tracking's
own frequency-error-reduction diagnostic scan showing no discernible
correlation peak at all) down to 1 event per ~41s -- the same order as the
untouched case -- with sharp, correct correlation peaks and CN0 estimates
jumping from ~20-30 dB-Hz (meaningless, noise-floor) to ~42-52 dB-Hz (genuine
lock).
2026-10-01 08:01:14 +02:00
Carles Fernandez 15c3c812c6 CI: do not wxlude volk_gnsssdr kernels 2026-09-30 19:50:41 +02:00
Carles Fernandez 7efe85e2ca Merge branch 'joebre-f_error-dump-opt-in' into next 2026-09-30 19:43:45 +02:00
Carles Fernandez 033227d133 Fix f_error dump Octave/MATLAB tools and update CHANGELOG
- CHANGELOG: document Tracking_<Sig>.f_error_dump (default: false) and the
  new Octave/MATLAB scripts
- f_error_sim.m: match cn0_m2m4_estimator when sqrt argument is negative,
  seed with rng() (fallback for Octave < 7), fix stale comments
- plot_all_f_error_scans.m: do not require gnuplot, restore the previous
  graphics toolkit on exit
- Use fprintf instead of printf for MATLAB compatibility
2026-09-30 19:32:21 +02:00
Carles Fernandez 943ef814ab Merge branch 'f_error-dump-opt-in' of https://github.com/joebre/gnss-sdr into joebre-f_error-dump-opt-in 2026-09-30 18:44:29 +02:00
Carles Fernandez 94e32f8a13 Merge branch 'vladisslav2011-b1c_enable_sumproduct' into next 2026-09-30 15:07:13 +02:00
Carles Fernandez c6405d824a Improve BeiDou B-CNAV1 decoding sensitivity 2026-09-30 12:08:49 +02:00
Carles Fernandez 28e14a3c7c Merge branch 'b1c_enable_sumproduct' of https://github.com/vladisslav2011/gnss-sdr into vladisslav2011-b1c_enable_sumproduct 2026-09-30 09:10:53 +00:00
joebre 5c24058459 Add Octave tooling to load, plot and simulate f_error dump scans
load_f_error_dump/find_f_error_scans/plot_f_error_scan (utils/matlab/libs)
read and visualize the per-bin CSV written by the tracking f_error_dump
diagnostic, and plot_all_f_error_scans (utils/matlab) batches
plot_f_error_scan over every scan in a dump, optionally saving PNGs.
f_error_sim (utils/matlab/libs) is a self-contained Monte Carlo
simulation of the same bin-scan/CN0-estimator logic, useful for sizing
f_error_step_num/f_error_accumulation/f_error_doppler_step without a
live capture.
2026-09-30 07:42:39 +02:00
joebre cd4f643a20 Make the f_error CSV dump opt-in via Tracking_<sig>.f_error_dump
Dll_Pll_Conf::f_error_dump_filename has a non-empty default, so the
frequency-error-reduction scan's per-bin CSV dump was effectively
always on with no clean way to disable it. Add a new f_error_dump
boolean (default false), matching the existing dump/Tracking_<sig>.dump
convention, and gate the dump call on it.
2026-09-30 07:42:39 +02:00
Vladislav P 543fe28ae9 Fix BeiDou CNAV1 test
And generalize B-CNAV1/B-CNAV2 LDPC encoder.

Signed-off-by: Vladislav P <vladisslav2011@gmail.com>
2026-09-30 02:18:44 +03:00
Vladislav P b24f930abc BeiDou B1C: Enable sum-product algorithm in LDPC decoder
This reduces minimum CN0 for stable telemetry decoding from ~28 dB*Hz to
~21 dB*Hz.

Signed-off-by: Vladislav P <vladisslav2011@gmail.com>
2026-09-29 23:27:47 +03:00
Carles Fernandez e50403b89b Bump local Armadillo and Protocol Buffers versions 2026-09-29 19:03:26 +02:00
Carles Fernandez 6c1e01e0b3 Fix data race in test 2026-09-29 18:44:34 +02:00
Carles Fernandez 2e682cce8e Update to new BeiDou PRN assignments
See http://www.beidou.gov.cn/yw/xwzx/202603/t20260320_29266.html
2026-09-29 13:01:30 +02:00
Carles Fernandez ef928a5e1f Merge branch 'vladisslav2011-enable_B2a_PRN6_18' into next 2026-09-29 10:11:25 +02:00
Carles Fernandez d971f6080e Merge branch 'enable_B2a_PRN6_18' of https://github.com/vladisslav2011/gnss-sdr into vladisslav2011-enable_B2a_PRN6_18 2026-09-29 10:11:04 +02:00
Carles Fernandez 09f143fe07 Summarize comments 2026-09-29 10:10:24 +02:00
Carles Fernandez f34c297a8e Merge branch 'joebre-alm-ephe-secondary-doppler-aiding' into next 2026-09-29 10:07:51 +02:00
Carles Fernandez 88fea3099a Harden pre-fix Doppler prediction bounds and grid sizing 2026-09-29 10:07:18 +02:00
Vladislav P b27cf0a1d5 Enable BeiDou B2a PRN6...PRN18
Contrary to ICD, these satellites actually broadcast B2a (OTA upgraded
in the orbit).
Verified by decoding live signal in realtime configuration.

Signed-off-by: Vladislav P <vladisslav2011@gmail.com>
2026-09-29 03:55:05 +03:00
Carles Fernandez 6f108b7497 Merge branch 'alm-ephe-secondary-doppler-aiding' of https://github.com/joebre/gnss-sdr into joebre-alm-ephe-secondary-doppler-aiding 2026-09-28 23:50:19 +02:00
Carles Fernandez 90fd53a4a9 Merge branch 'joebre-fix-gps-l5-assistance-gating' into next 2026-09-28 23:49:41 +02:00
Carles Fernandez 7050b48564 Add loading of QZSS L5 assistance 2026-09-28 23:44:52 +02:00
joebre f74ed54ee9 Extend almanac/ephemeris Doppler prediction to secondary signals and to before a fix
SatelliteVisibility::PredictedDopplerHz() previously required a live PVT
fix and was only used for a satellite's primary signal
(GNSSFlowgraph::acquisition_manager()). Two extensions:

1. Secondary signals (e.g. GPS L5, Galileo E5a) can now use the same
   geometric prediction, opt-in per acquisition role via
   <acq role>.alm_ephe_assisted_doppler_narrowing (default false). It's
   only reached at all when dual-frequency assist is unavailable or
   disabled (GNSS-SDR.assist_dual_frequency_acq=false), and is a distinct,
   less-proven Doppler source than that dual-frequency projection, hence
   opt-in rather than defaulted on.

2. Before a live fix exists, PredictedDopplerHz() can now predict from the
   AGNSS reference position (zero assumed velocity) and the configured
   nominal clock offset, opt-in via GNSS-SDR.doppler_prediction_before_fix
   (default false). A new PredictedDopplerUncertaintyHz() reports the
   Doppler spread implied by GNSS-SDR.receiver_max_velocity_m_s and
   GNSS-SDR.clock_frequency_max_error_ppm for this pre-fix case (zero once
   a fix exists, since position/velocity/clock are all solved then, not
   assumed) -- the caller widens its acquisition Doppler-bin search by this
   amount instead of trusting a single, possibly-wrong bin.

Verified against an EVK1029 GPS L5 capture (single-band, so every L5
channel is a secondary signal): with both flags enabled, the almanac-based
prediction narrows acquisition Doppler search before and after the fix,
logged via a new low-noise [alm_ephe_doppler] line; with them left at
their defaults, behavior is unchanged from before this change.
2026-09-28 16:00:42 +02:00