With set_doppler_num_bins(), acq_grid holds the Doppler candidate columns followed by 0, 1 or 2 noise-reference columns placed at doppler_center +/- the configured doppler_max, outside the linear Doppler axis. Nothing in the dump said how many columns were candidates, so the readers either rejected the file (Acquisition_Dump_Reader) or plotted the reference columns on a wrong Doppler axis (plot_acq_grid.py, plot_acq_grid.m). Write a new doppler_num_candidates variable to the dump and use it in the readers to keep only the candidate columns. Dumps without it are read as before, except that the reference column of older narrowed dumps is also skipped. The Python and MATLAB scripts plot a single-candidate (narrowed) grid as a code-delay line instead of an empty surface. Add a regression test that reads back a full-grid dump with two reference columns and a narrowed N = 5 dump.
GNSS-SDR Python Plot Utilities
These scripts read GNSS-SDR dump files and save diagnostic plots. They are intended to be run from any directory; input and output locations are configurable through command-line options.
Every script accepts -h/--help (printing the full option list and exiting)
and saves PNG figures to a --fig-path directory, creating it if needed. Pass
--show to also display the figures interactively.
Common Options
The following options are shared by every script. The per-script tables below repeat them with the default value that applies to each tool.
-
-h,--help: print the option list and exit. -
-i,--input-path: directory containing the dump files (default: current directory). -
--conf: optional GNSS-SDR configuration file. When provided, scripts infer missing options such as--file-prefix,--channels,--first-channel,--sampling-frequency,--signal-type, and--nav-sol-periodfrom the configuration. Explicit command-line options always take precedence over values inferred from--conf. -
--file-prefix: the value of the block'sdump_filenameconfiguration parameter in GNSS-SDR. It may include a directory and an extension; each script reconstructs the actual dump filenames from it exactly the way GNSS-SDR does — the directory is split off, the basename extension is removed, and the block-specific suffix is appended:- tracking / telemetry:
<prefix><channel>.dat - observables / PVT:
<prefix>.dat - acquisition:
<prefix>_<system>_<signal>_ch_<channel>_<execution>_sat_<PRN>.mat
Any directory in
--file-prefixis resolved relative to--input-path(an absolute--file-prefixpath overrides it).When
--confis provided to the generic tracking and acquisition plotters, a multi-signal configuration expands to every enabled signal. Pass--signal-typeto restrict plots to one signal. Single-file modes and signal-specific scripts still require or prefer one signal. Channel ranges are computed using GNSS-SDR's receiver order:1C, 2S, L5, 1B, 5X, E6, 1G, 2G, B1, B3, 7X, J1, J5. - tracking / telemetry:
-
-o,--fig-path: directory where plots are saved. Defaults to a per-script subdirectory under./plots/. -
--show: display plots interactively after saving them. By default, scripts save the PNG files and close the figures. When--showis given, all of a run's figures are kept open and displayed together with a single blockingplt.show()at the end; closing the windows lets the script exit. -
--format: saved figure format, one ofpng(default),pdf,eps,svg,jpg. The vector formats (pdf,eps,svg) are written publication-ready with embedded fonts — PDF and EPS embed TrueType fonts (font type 42) instead of the default Type 3 fonts that many journals reject, so the output is suitable for camera-ready figures. Raster formats are saved at 300 DPI. This mirrors the--formatoption ofutils/skyplot/skyplot.py.
Dependencies
The scripts use Python 3 plus:
numpy,matplotlib— all scripts.scipy,h5py— acquisition grid (plot_acq_grid.py).pyproj— PVT UTM coordinate conversion.folium— PVT map generation (skipped with--no-position).
Acquisition Grid — plot_acq_grid.py
Reads acquisition .mat dumps and plots the 2D/3D acquisition grid (search
space) of the test statistic.
Input pattern (per dump):
<input-path>/<file-prefix>_<system>_<signal>_ch_<channel>_<execution>_sat_<PRN>.mat
Output PNGs (_2D and _3D):
<fig-path>/<output-basename>_<system>_<signal>_ch_<channel>_<execution>_sat_<PRN>_2D.png
<fig-path>/<output-basename>_<system>_<signal>_ch_<channel>_<execution>_sat_<PRN>_3D.png
Each figure title uses a readable signal name and PRN, for example
GPS L1 C/A PRN 3 (channel 0, execution 1).
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the acquisition .mat dumps. |
--conf |
unset | GNSS-SDR configuration used to infer acquisition dump prefixes and signal selectors. |
--file-prefix |
--conf or acquisition |
Acquisition.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/acquisition |
Output directory for PNGs. |
--output-basename, --output-prefix |
--file-prefix basename |
Base name for the saved PNGs (directory and extension stripped). |
--all-files / --single-file |
--all-files |
Plot every matching dump, or a single dump chosen by the selectors below. |
--positive-only / --include-negative |
--positive-only |
Plot only positive acquisitions, or positive and negative. |
--lite-view / --full-view |
--lite-view |
Interpolated light grid, or the raw acquisition grid. |
--sat |
1 in single-file mode |
Satellite PRN. Filters in all-files mode; selects the dump in single-file mode. |
--channel |
0 in single-file mode |
Acquisition channel number. Filter / selector. |
--execution |
1 in single-file mode |
Acquisition dump execution index. Filter / selector. |
--signal-type CODE |
--conf or 1C |
GNSS-SDR signal code (see table below); case-insensitive. Filters in all-files mode; selects in single-file mode. |
--samples-per-chip |
3 |
Samples per chip used by the light-grid interpolation. |
--samples-per-doppler-step |
5 |
Interpolated samples per Doppler step used by the light-grid interpolation. |
--surface-smoothing |
2.0 |
Gaussian smoothing sigma for the lite 3D surface; use 0 to disable. |
--samples-per-code |
25000 |
Samples per code used for the 2D normalization. |
--input-power |
100.0 |
Input power used for the 2D normalization. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
Signal codes accepted by --signal-type, using the same nomenclature as the
GNSS-SDR configuration and dump filenames (e.g. --signal-type=E6):
| Code | System | Signal | Code length (chips) |
|---|---|---|---|
1C |
GPS | L1 C/A | 1023 |
2S |
GPS | L2C | 10230 |
L5 |
GPS | L5 | 10230 |
1B |
Galileo | E1B | 4092 |
5X |
Galileo | E5a | 10230 |
7X |
Galileo | E5b | 10230 |
E6 |
Galileo | E6 | 5115 |
1G |
GLONASS | L1 | 511 |
2G |
GLONASS | L2 | 511 |
B1 |
BeiDou | B1I | 2046 |
B3 |
BeiDou | B3I | 10230 |
J1 |
QZSS | L1 C/A | 1023 |
J5 |
QZSS | L5 | 10230 |
In all-files mode --sat, --channel, --execution, and --signal-type
filter the matching dumps. If --conf enables several signals and
--file-prefix is not set, all configured acquisition dump prefixes are
scanned. If a --file-prefix matches no files, the available dump prefixes
found in the directory are listed.
Examples:
python3 plot_acq_grid.py
python3 plot_acq_grid.py --input-path ./out --fig-path ./plots/acquisition
python3 plot_acq_grid.py --file-prefix hackrf_l1_acq_dump --channel 0
python3 plot_acq_grid.py --file-prefix hackrf_l1_acq_dump --sat 26
python3 plot_acq_grid.py --signal-type E6
python3 plot_acq_grid.py --conf gnss-sdr_BDS_B3I_byte.conf
python3 plot_acq_grid.py --single-file --signal-type J1 --sat 193 --channel 0 --execution 1
python3 plot_acq_grid.py --single-file --sat 3 --channel 0 --execution 1 --full-view
python3 plot_acq_grid.py --include-negative --output-basename my_run
DLL/PLL VEML Tracking — dll_pll_veml_plot_sample.py
Reads per-channel tracking .dat dumps and plots VEML tracking diagnostics
(correlator outputs, discriminators, C/N0, ...), plus optional Doppler plots.
Input pattern: <input-path>/<file-prefix><channel>.dat.
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the tracking .dat dumps. |
--conf |
unset | GNSS-SDR configuration used to infer tracking dump prefix, sampling frequency, and channel range. |
--file-prefix |
--conf or track_ch |
Tracking.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/dll-pll-veml-tracking |
Output directory for PNGs. |
--sampling-frequency |
--conf or 3000000.0 |
Signal sampling frequency in Hz (sets the RX-time axis). |
--channels |
--conf or 5 |
Number of channels to read. |
--first-channel |
--conf or 0 |
First channel number in the dump filenames. |
--signal-type CODE |
inferred if needed | GNSS-SDR signal code used to restrict channel ranges and dump filenames from --conf; omitted means all configured signals. |
--plot-last-outputs |
0 |
Only plot the last N outputs; 0 plots all of them. |
--no-doppler |
Doppler plots on | Skip the extra Doppler-only plots. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
Examples:
python3 dll_pll_veml_plot_sample.py --input-path ./out
python3 dll_pll_veml_plot_sample.py --file-prefix tracking_ch_ --channels 8
python3 dll_pll_veml_plot_sample.py --conf conf/File_input/Galileo/gnss-sdr_Galileo_E1_nsr.conf --signal-type 1B --input-path ./out
python3 dll_pll_veml_plot_sample.py --plot-last-outputs 5000 --no-doppler
GPS L1 C/A KF Tracking — gps_l1_ca_kf_plot_sample.py
Reads per-channel Kalman-filter tracking .dat dumps produced by the
GPS_L1_CA_KF_Tracking block and plots tracking plus Kalman-filter variables.
Input pattern: <input-path>/<file-prefix><channel>.dat.
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the tracking .dat dumps. |
--conf |
unset | GNSS-SDR configuration used to infer tracking dump prefix, sampling frequency, and channel range. |
--file-prefix |
--conf or track_ch |
Tracking.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/kf-tracking |
Output directory for PNGs. |
--sampling-frequency |
--conf or 4000000.0 |
Signal sampling frequency in Hz. |
--channels |
--conf or 5 |
Number of channels to read. |
--first-channel |
--conf or 0 |
First channel number in the dump filenames. |
--signal-type CODE |
inferred if needed | GNSS-SDR signal code used to select channel ranges and dump filenames from --conf. |
--code-period |
0.001 |
Code period in seconds. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
The dumps must come from the
GPS_L1_CA_KF_Trackingblock; standard DLL/PLL tracking dumps have a different record layout and will be misread.
Examples:
python3 gps_l1_ca_kf_plot_sample.py --input-path ./out
python3 gps_l1_ca_kf_plot_sample.py --file-prefix track_ch --channels 8
python3 gps_l1_ca_kf_plot_sample.py --conf conf/File_input/MultiCons/gnss-sdr_labsat_kf.conf --signal-type 1C --input-path ./out
python3 gps_l1_ca_kf_plot_sample.py --sampling-frequency 4000000 --code-period 0.001
Tracking Quality Indicators — plot_tracking_quality_indicators.py
Plots the carrier-lock test and C/N0 indicators of all channels on two shared figures.
Input pattern: <input-path>/<file-prefix><channel>.dat.
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the tracking .dat dumps. |
--conf |
unset | GNSS-SDR configuration used to infer tracking dump prefix, sampling frequency, signal type, and channel range. |
--file-prefix |
--conf or track_ch |
Tracking.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/tracking-quality |
Output directory for PNGs. |
--sampling-frequency |
--conf or 4000000.0 |
Signal sampling frequency in Hz. |
--channels |
--conf or 5 |
Number of channels to read. |
--first-channel |
--conf or 0 |
First channel number in the dump filenames. |
--signal-type |
--conf or 1C |
GNSS-SDR signal code used to restrict channel ranges and label traces; omitted with multi-signal --conf means all configured signals. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
The C/N0 legend labels each trace as <signal-type> PRN <PRN> (e.g.
1C PRN 9); the carrier-lock legend labels traces as
SV <signal-type> PRN <PRN>.
Examples:
python3 plot_tracking_quality_indicators.py --input-path ./out
python3 plot_tracking_quality_indicators.py --file-prefix hackrf_l1_tracking_ch_ --channels 8
python3 plot_tracking_quality_indicators.py --conf conf/RealTime_input/gnss-sdr_GPS_L1_USRP_realtime.conf --input-path ./out
python3 plot_tracking_quality_indicators.py --file-prefix hackrf_l1_tracking_ch_ --channels 8 --signal-type 1C
Telemetry — gps_l1_ca_telemetry_plot_sample.py
Reads telemetry decoder .dat dumps and compares the TOW timing of two
channels.
Input pattern: <input-path>/<file-prefix><channel>.dat.
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the telemetry .dat dumps. |
--conf |
unset | GNSS-SDR configuration used to infer telemetry dump prefix and channel range. |
--file-prefix |
--conf or telemetry |
TelemetryDecoder.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/telemetry |
Output directory for PNGs. |
--channels |
--conf or 18 |
Number of channels to try reading; missing channels are skipped. |
--first-channel |
--conf or 0 |
First channel number in the dump filenames. |
--signal-type CODE |
inferred if needed | GNSS-SDR signal code used to select channel ranges and dump filenames from --conf. |
--channel-a |
--conf or 0 |
First channel number to plot. |
--channel-b |
--conf or 5 |
Second channel number to plot. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
Examples:
python3 gps_l1_ca_telemetry_plot_sample.py --input-path ./out
python3 gps_l1_ca_telemetry_plot_sample.py --conf conf/gnss-sdr.conf --input-path ./out
python3 gps_l1_ca_telemetry_plot_sample.py --file-prefix hackrf_l1_tlm_ch_ --channel-a 0 --channel-b 5
Hybrid Observables — hybrid_observables_plot_sample.py
Reads a single observables dump and plots pseudorange, accumulated carrier phase, Doppler frequency, and captured PRNs across channels.
Input pattern: <input-path>/<file-prefix>.dat (single file).
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the observables dump. |
--conf |
unset | GNSS-SDR configuration used to infer observables dump filename and total channel count. |
--file-prefix |
--conf or observables.dat |
Observables.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/hybrid-observables |
Output directory for PNGs. |
--channels |
--conf or 5 |
Number of observable channels in the dump. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
Examples:
python3 hybrid_observables_plot_sample.py
python3 hybrid_observables_plot_sample.py --input-path ./out --channels 8
python3 hybrid_observables_plot_sample.py --conf conf/gnss-sdr.conf --input-path ./out
python3 hybrid_observables_plot_sample.py --file-prefix hackrf_l1_observables.dat
PVT Raw Dump — gps_l1_ca_pvt_raw_plot_sample.py
Reads a single PVT raw dump and plots navigation/position diagnostics. It also
generates folium HTML maps under <fig-path>/maps unless --no-position is
given.
Input pattern: <input-path>/<file-prefix>.dat (single file).
| Option | Default | Description |
|---|---|---|
-i, --input-path |
. |
Directory containing the PVT dump. |
--conf |
unset | GNSS-SDR configuration used to infer PVT dump filename and navigation solution period. |
--file-prefix |
--conf or PVT.dat |
PVT.dump_filename value (may include a directory/extension). |
-o, --fig-path |
plots/pvt |
Output directory for PNGs and maps. |
--nav-sol-period |
--conf or 10.0 |
Navigation solution period in milliseconds. |
--true-position E_UTM N_UTM U_UTM |
unset (NaN) | Reference receiver position in UTM, used for error plots. |
--plot-skyplot |
off | Try to generate the sky-plot panel. |
--no-position |
position plot on | Skip the position/map diagnostic (avoids the folium dependency). |
--one-vs-time NAME |
X_vel, Tot_Vel |
navSolutions variable to plot versus time. Repeatable. |
--show |
off | Display figures after saving. |
--format |
png |
Saved figure format: png (default), pdf, eps, svg, jpg. Vector formats embed fonts (publication-ready). |
--open-maps |
off | Open the generated folium map HTML files in a browser. |
Examples:
python3 gps_l1_ca_pvt_raw_plot_sample.py
python3 gps_l1_ca_pvt_raw_plot_sample.py --input-path ./out --file-prefix PVT.dat
python3 gps_l1_ca_pvt_raw_plot_sample.py --conf conf/gnss-sdr.conf --input-path ./out
python3 gps_l1_ca_pvt_raw_plot_sample.py --true-position 431234.0 4587654.0 120.0
python3 gps_l1_ca_pvt_raw_plot_sample.py --one-vs-time X_vel --one-vs-time Y_vel
python3 gps_l1_ca_pvt_raw_plot_sample.py --no-position