One carrier-phase observation, as Sidereon.GNSS.RINEX.Observations.phases/3
returns it.
Every carrier-phase observation of the epoch has a row, whatever the header says about its correction.
value_cycles,value_m- the phase as the file records it, in cycles and in meters;nilfor a blank observation or, for meters, an unknown wavelength.phase_shift- what the header in effect at the epoch states about the signal'sSYS / PHASE SHIFTcorrection::available- one correction, inphase_shift_cycles. No record, or a blank correction, is0.0; from RINEX 4.00, whose Table A2 says the record "should be ignored by RINEX decoders", it is0.0whatever the records say.:unknown- the only record covering the signal names just its constellation, which declares the alignment unknown.:ambiguous- records in one header block give the signal different corrections, listed inphase_shift_correctionsin record order withnilfor a blank one.
phase_shift_cycles- the correction for:available,nilotherwise.phase_shift_corrections- the conflicting corrections for:ambiguous,[]otherwise.frequency_hz,wavelength_m- the carrier,nilwhere it is not known, such as a GLONASS FDMA signal whose slot has no channel in the header in effect.
The correction is metadata about the phase, not a term to add to it. RINEX 3
phases are stored already aligned, and SYS / PHASE SHIFT reports the
correction that alignment applied, so value_cycles already includes it;
adding phase_shift_cycles would apply it a second time. It is what a caller
subtracts to reconstruct the phase before alignment.
Summary
Types
@type phase_shift() :: :available | :unknown | :ambiguous
@type t() :: %Sidereon.GNSS.RINEX.Observations.PhaseRow{ code: String.t(), frequency_hz: float() | nil, lli: non_neg_integer() | nil, phase_shift: phase_shift(), phase_shift_corrections: [float() | nil], phase_shift_cycles: float() | nil, ssi: non_neg_integer() | nil, value_cycles: float() | nil, value_m: float() | nil, wavelength_m: float() | nil }