SBF field decoding reference¶
Every value stored in obs_ds and the sbf_obs metadata dataset is derived
from raw SBF integers through a well-defined transformation. This page documents
each formula with the source field type, the arithmetic applied, and the firmware
page reference.
All page references are to the Septentrio AsteRx SB3 ProBase Firmware v4.14.0 Reference Guide (abbreviated RefGuide-4.14.0) unless stated otherwise.
Epoch timestamps¶
Source: MeasEpoch header: WNc (u2) + TOW (u4, milliseconds).
The receiver time follows the GPS convention: WNc counts complete weeks
since 1980-01-06 and there are no leap seconds (RefGuide-4.14.0,
Section 2.3, p.53). The epoch is stored in GPS time, the time scale of
RINEX files and of the orbit and clock products, and the epoch
coordinate records time_system: GPS:
| Symbol | Meaning | Value |
|---|---|---|
| \(t_\text{GPS epoch}\) | GPS reference epoch | 1980-01-06 00:00:00 |
| \(WN_c\) | Continuous GPS week number | from MeasEpoch.WNc |
| \(TOW\) | Time of Week | ms, from MeasEpoch.TOW |
No leap seconds are subtracted. A file named for a GPS day therefore starts at 00:00:00 of that day and its epochs lie on the receiver's sampling grid. (Earlier versions stored UTC, 18 s earlier: such stores start at 23:59:42 of the previous day.)
Signal number decoding¶
Source: MeasEpochChannelType1.Type (u1), p.261, and ObsInfo (u1), p.262.
The 5 least-significant bits of Type carry a signal index:
If \(\text{SigIdxLo} = 31\) the signal number is extended via ObsInfo:
Otherwise \(\text{sig_num} = \text{SigIdxLo}\). The mapping from signal number to constellation / band / tracking code is defined in the signal type table (RefGuide-4.14.0 §4.1.10, p.256).
C/N₀ (SNR)¶
Source: MeasEpochChannelType1.CN0 (u1), p.261.
Dataset variable: SNR (units: dB-Hz).
The raw byte encodes carrier-to-noise density in two different scales depending on the signal type:
Signals 1 and 2 are tracked codelessly (Septentrio reference guide 4.14.0, Sect. 3.2.4, setCN0Mask) and have a lower intrinsic \(C/N_0\);
the firmware omits the +10 dB offset and enforces a minimum of 1 dB‑Hz.
Do-Not-Use: raw value 255 \(\rightarrow\) stored as NaN.
CN0HighRes correction (MeasExtra)¶
Source: MeasExtra.MeasExtraChannelSub.Misc bits 0–2 (u3), p.265.
When MeasExtra (Block 4000) is logged, the reader applies an additional
sub-quantisation correction that extends resolution from 0.25 dB to 1/32 dB:
The correction comes from the MeasExtra block with the same time stamp as the
MeasEpoch block. Each MeasExtra entry is matched to its observation by receiver
channel and signal number; for extended signals (SigIdxLo = 31) the signal
number is in bits 3–7 of MeasExtra Misc (p.265). Where MeasExtra is absent
the correction is not applied.
| Resolution | Source |
|---|---|
| 0.25 dB-Hz | MeasEpoch.CN0 alone |
| 0.03125 dB-Hz (1/32 dB-Hz) | after CN0HighRes correction |
Pseudorange¶
Source: MeasEpochChannelType1.Misc bits 0–3 (CodeMSB, u4-equivalent),
CodeLSB (u4), p.261.
where \(\text{CodeMSB} = \text{Misc} \;\&\; 0x0F\).
Do-Not-Use: CodeMSB = 0 and CodeLSB = 0 \(\rightarrow\) NaN.
Type2 (slave signal) pseudorange¶
Source: MeasEpochChannelType2.OffsetsMSB bits 0–2 (CodeOffsetMSB,
3-bit two's-complement, range \(-4\) to \(+3\)), p.262, CodeOffsetLSB (u2), p.263.
Do-Not-Use: CodeOffsetMSB = \(-4\) and CodeOffsetLSB = 0 \(\rightarrow\) NaN.
Doppler shift¶
Source: MeasEpochChannelType1.Doppler (i4), p.261.
Positive Doppler indicates a closing range (approaching satellite).
Do-Not-Use: raw = \(-2\,147\,483\,648\) (\(= -2^{31}\), i4 minimum) \(\rightarrow\) NaN.
Type2 (slave signal) Doppler¶
Source: MeasEpochChannelType2.OffsetsMSB bits 3–7 (DopplerOffsetMSB,
5-bit two's-complement, range \(-16\) to \(+15\)), p.262, DopplerOffsetLSB (u2), p.263.
The Type2 Doppler includes a frequency-ratio correction to account for the different carrier frequency of the slave signal:
where \(f_1, f_2\) are the carrier frequencies of the Type1 (master) and Type2 (slave) signals respectively.
Do-Not-Use: DopplerOffsetMSB = \(-16\) and DopplerOffsetLSB = 0 \(\rightarrow\) NaN.
Carrier phase¶
Source: MeasEpochChannelType1.CarrierMSB (i1), CarrierLSB (u2), p.261.
The carrier phase is encoded as a fractional offset relative to the pseudorange, expressed in cycles. Let \(\lambda = c / f\) be the carrier wavelength:
Do-Not-Use: CarrierMSB = \(-128\) and CarrierLSB = 0 \(\rightarrow\) NaN.
Type2 carrier phase¶
Uses \(PR_2\) (Type2 pseudorange, above) and the slave signal wavelength \(\lambda_2\).
GLONASS FDMA carrier frequencies¶
Source: MeasEpochChannelType1.ObsInfo bits 3–7 (FreqNr, offset 8) for
GLONASS FDMA signals (SigIdxLo 8–11), p.262; frequency formula §4.1.10, p.256.
Type2 sub-blocks take FreqNr from their Type1 sub-block.
GLONASS uses Frequency Division Multiple Access (FDMA). The center frequency depends on the frequency slot \(K = \text{FreqNr} - 8\).
FreqNr range differs by firmware version
RefGuide-4.14.0 allows slot range \(-7\) to \(+13\) (FreqNr 1–21). RefGuide-4.15.1 restricts this to \(-7\) to \(+6\) (FreqNr 1–14), matching the current GLONASS ICD allocation.
These frequencies are used as \(f\) in the carrier phase wavelength formula and as \(f_1, f_2\) in the Type2 Doppler formula.
GLONASS L3 CDMA (signal 12) has a fixed frequency of 1202.025 MHz and does not use this formula.
Satellite geometry (SatVisibility → θ, φ)¶
Source: SatVisibility.SatInfo.Elevation (i2, scale \(0.01^\circ\)/LSB),
Azimuth (u2, scale \(0.01^\circ\)/LSB), RefGuide-4.14.0 p.400.
Polar angle θ¶
The SBF block stores elevation above the horizon. canvod-readers converts to
the polar angle (co-elevation) used in the Tau-Omega VOD formula:
| \(\theta\) | Geometry |
|---|---|
| \(\theta = 0\) | satellite at zenith (directly overhead) |
| \(\theta = \pi/2\) | satellite at the horizon |
Azimuth φ¶
The stored azimuth is the geographic (compass) convention: 0 = North, \(\pi/2\) = East,
measured clockwise. Both \(\theta\) and \(\varphi\) are stored in radians as broadcast_theta
and broadcast_phi in the sbf_obs metadata dataset.
Do-Not-Use: Elevation \(-32768\) and Azimuth 65535 \(\rightarrow\) NaN. Values come from the SatVisibility block with the same time stamp as the observations, and are copied to every signal of the satellite. SVID 62 (GLONASS slot unknown) is skipped.
Orbit source: SatVisibility.SatInfo.SatelliteInfo (u1) states whether
the angles were computed from the almanac (1) or the broadcast ephemeris (2);
255 (unknown) is stored as \(-1\). It is stored as broadcast_angle_source.
Broadcast-mode geometry (SbfBroadcastProvider) uses only the
ephemeris-based angles.
MeasExtra signal-quality fields¶
All fields below are sourced from MeasExtra Block 4000,
MeasExtraChannelSub sub-block, p.265.
Multipath correction (pseudorange)¶
Raw field: i2. Add to the stored pseudorange to recover the unmitigated measurement before firmware multipath filtering.
Smoothing correction (pseudorange)¶
Raw field: i2. Add to the stored pseudorange to recover the raw unsmoothed measurement before Hatch-filter carrier smoothing.
Code tracking variance¶
Raw field: u2. Estimated noise variance of the code-phase measurement. Maximum representable value is 6.5534 m\(^2\) (raw = 65534). Do-Not-Use: 65535 \(\rightarrow\) NaN.
Carrier tracking variance¶
Raw field: u2, direct copy (scale = 1 mcycle\(^2\)/LSB). Maximum 65534 mcycles\(^2\). Do-Not-Use: 65535 \(\rightarrow\) NaN.
The corresponding Doppler variance is:
where DopplerVarFactor (MeasExtra block header, p.264) is a per-epoch scale
factor that converts mcycles\(^2\) to mHz\(^2\). The Doppler variance is not stored.
Lock time¶
Raw field: u2. Duration of uninterrupted carrier phase tracking. Reset to 0 on reacquisition. Clipped to 65534 s. Do-Not-Use: 65535 \(\rightarrow\) NaN.
Cumulative loss-of-continuity counter¶
Raw field: u1, direct copy. Increments at every reacquisition or cycle slip. A change \(\Delta N_\text{slip} \neq 0\) between consecutive epochs is a direct indicator of a carrier-phase discontinuity (cycle slip).
Carrier multipath correction¶
Raw field: i1, scale \(1/512\) cycles/LSB (\(\approx 1.953 \times 10^{-3}\) cycles/LSB). Add to the stored carrier phase to recover the unmitigated phase.
Auxiliary scalar fields¶
Fields stored with a simple scale or offset:
| Variable | Source block | Raw field | Formula | Unit |
|---|---|---|---|---|
pdop, hdop, vdop |
DOP (Block 4001) | u2 | \(\text{raw} \times 0.01\); DNU 0 | 1 |
h_accuracy_m |
PVTGeodetic (Block 4007) HAccuracy |
u2 | \(\text{raw} \times 0.01\); DNU 65535 | m |
v_accuracy_m |
PVTGeodetic (Block 4007) VAccuracy |
u2 | \(\text{raw} \times 0.01\); DNU 65535 | m |
mean_corr_age_s |
PVTGeodetic (Block 4007) MeanCorrAge |
u2 | \(\text{raw} \times 0.01\); DNU 65535 | s |
temperature_c |
ReceiverStatus (Block 4014) Temperature |
u1 | \(\text{raw} - 100\); DNU 0 | \(^\circ\)C |
Page references: DOP block p.348, PVTGeodetic pp.337–339, ReceiverStatus pp.396–398.
Summary: non-trivial transformations¶
| Observable | Non-trivial step |
|---|---|
| SNR | Signal-dependent formula (+10 dB-Hz offset except signals 1 and 2); CN0HighRes from the MeasExtra block of the same epoch |
| Pseudorange | 40-bit reconstruction from two fields (\(\text{CodeMSB} \times 2^{32} + \text{CodeLSB}\)); Type2 adds delta |
| Carrier phase | Mixed-unit formula: pseudorange converted to cycles via \(\lambda = c/f\), then phase delta added |
| Type2 Doppler | Frequency-ratio scale factor applied before adding delta |
| \(\theta\) (polar angle) | Elevation \(\rightarrow\) co-elevation (\(90^\circ - \text{elevation}\)), then degrees \(\rightarrow\) radians |
| \(\varphi\) (azimuth) | Scale \(0.01^\circ\)/LSB, degrees \(\rightarrow\) radians |
| GLONASS frequencies | Slot-dependent FDMA formula required for \(\lambda\) and Type2 Doppler |
| Epoch | GPS week + TOW (ms) \(\rightarrow\) datetime64[ns] in GPS time (no leap seconds) |
| CN0HighRes | Bit-field extraction (bits 0–2) then scale 1/32 dB-Hz/LSB |
| CarMPCorr | Integer division by 512 to convert i1 to fractional cycles |
References¶
- Septentrio AsteRx SB3 ProBase Firmware v4.14.0 Reference Guide
- Septentrio AsteRx SB3 ProBase Firmware v4.15.1 Reference Guide
- RINEX 3.04 signal nomenclature, used verbatim for SID code strings