Observables
The role of an Observables block is to collect the synchronization data coming from all the processing Channels, and to compute from them the GNSS basic measurements: pseudorange, carrier phase (or its phaserange version) and Doppler shift (or its pseudorange rate version).
It follows the description of mathematical models for the obtained measurements, with a physical interpretation. Those models will be used in the computation of the PositionVelocityTime solution.
Pseudorange measurement
The pseudorange measurement is defined as the difference of the time of reception (expressed in the time frame of the receiver) and the time of transmission (expressed in the time frame of the satellite) of a distinct satellite signal. This corresponds to the distance from the receiver antenna to the satellite antenna, including receiver and satellite clock offsets and other biases, such as atmospheric delays. For a signal from satellite in the ith band, the pseudorange can be expressed by using the signal reception time (s) measured by the receiver clock and the signal transmission time (s) measured by the satellite clock as:
Pseudorange measurement (from the RTKLIB Manual)^{1}
The equation can be written by using the geometric range between satellite and receiver antennas, the receiver and satellite clock biases and , the ionospheric and tropospheric delays and and the measurement error as:
where:
 is the pseudorange measurement (in m).
 is the true range from the satellite’s to the receiver’s antenna (in m).
 is the speed of light (in m/s).
 is the receiver clock offset from GNSS time (in s).
 is the satellite clock offset from GNSS time (in s).
 is the ionospheric delay (in m).
 is the tropospheric delay (in m).
 models measurement noise, including satellite orbital errors, receiver’s and satellite’s instrumental delays, effects of multipath propagation and thermal noise (in m).
GNSSSDR performs pseudorange generation based on setting a common reception time across all channels^{2}. The result of this approach is not an absolute pseudorange, but a relative pseudorange with respect to the value (of pseudorange) allocated for a reference satellite. This is possible thanks to the time of week (TOW) information, that is the epoch conveyed by the navigation message, and the associated reception time , that is the epoch measured by the receiver’s time counter, both available for each satellite.
The first step performed by the common reception time algorithm is the selection of a reference satellite: it is the satellite with the most recent TOW (which is the nearest satellite), denoted as , whose associated is taken as the common reception time for all channels. An initial travel time ( ms is assigned to this satellite, but in general it is a value between and milliseconds according to the user altitude) that can be easily converted in meters considering the speed of light. Then, the pseudoranges for all other satellites are derived by adding the relativearrival times. Each travel time can be computed as:
where is the difference between the reference and the current TOW of the th satellite; is the time elapsed between the reference and the actual receiver time, when the pseudorange must be computed for the specific satellite. This method is equivalent to taking a snapshot of all the channels’ counters at a given time, and thus it can produce pseudoranges at any time, without waiting for a particular bit front on each channel.
The block diagram of such approach is shown below:
Block diagram of the pseudorange computation using the common reception time approach in GNSSSDR^{3}
Note that, in the case of a multisystem receiver, all pseudorange observations must be referred to one receiver clock only.
Carrier phase measurement
The carrier phase measurement is actually a measurement on the beat frequency between the received carrier of the satellite signal and a receivergenerated reference frequency. It can be modeled as:
where:
 is the carrier phase measurement (in cycles) for band and satellite .
 is the phase for the th band of the receiver’s local oscillator (in cycles) at time .
 is the phase for the th band of the transmitted signal (in cycles) at time .
 is the navigation signal reception time at the receiver (in s).
 is the navigation signal transmission time at the satellite (in s).
 is the carrier‐phase integer ambiguity (in cycles).
 is a term modelling carrier phase measurement noise, including satellite orbital errors, receiver’s and satellite’s instrumental delays, effects of multipath propagation and thermal noise (in cycles).
 is the carrier frequency (in Hz) at band .
 is the receiver clock offset (in s) from GPS time at time .
 is the satellite clock bias (in s) from GPS time at time .
 is the initial time (in s).
 is the initial phase for the th band of the transmitted signal (in cycles) at time .
 is the speed of light (in m/s).
 is the carrier wavelength (in m).
As shown in a paper by Petovello and O’Driscoll^{4}, the carrier‐phase integer ambiguity term can be written as:
where:
 is the integer component of the receiver’s numerically controlled oscillator (NCO) phase.
 is the integer component of the term .
In order to generate useable phase measurements, the receiver phase observations must maintain a constant integer number of cycles offset from the true carrier phase. That is, if the range increases by one cycle (i.e., one wavelength), the integer component of the NCO, denoted as , also increments by one cycle.
Phaserange measurement
Phase measurements are sometimes given in meters. This is referred to as phaserange measurement, and it is defined as the carrier phase multiplied by the carrier wavelength . It can be expressed as:
The term admits a more detailed model (including antenna phase center offsets and variations, station displacement by earth tides, phase windup effect and relativity correction on the satellite clock) that will be useful for precise point positioning algorithms. The phaserange measurement can then be modeled as:
where:
 The ionospheric term is included with a negative sign due to the phase advancement effect on electromagnetic waves going through a plasmatic media.
 is the carrier‐phase bias for the th band (in cycles).

, where:
 is the receiver’s th band antenna phase center offset in local coordinates (in m).
 is the receiver’s th band antenna phase center variation (in m).
Receiver antenna phase center offset and variation (from the RTKLIB Manual)^{1}
 is the satellite’s th band antenna phase center offset in satellite body‐fixed coordinates (in m).
 is the satellite’s antenna phase center variation (in m).
Satellite antenna phase center offset and variation (from the RTKLIB Manual)^{1}
 is the LOS vector from receiver antenna to satellite in local coordinates.
 is the LOS vector from receiver antenna to satellite in ECEF.
 is the coordinates transformation matrix from the satellite body‐fixed coordinates to ECEF coordinates, with:
Satellite bodyfixed coordinate system (from the RTKLIB Manual)^{1}
 is the sun position in ECEF coordinates.
 is a unit vector pointing from satellite towards the sun.
 is a unit vector from the satellite to the nadir direction.
 , where denotes the crossproduct operator.
 .
 is the displacement by Earth tides at the receiver position in local coordinates (in m).
 is the phase windup term (in cycles) due to the circular polarization of the GNSS electromagnetic signals. For a receiver with fixed coordinates, the windup is due to the satellite orbital motion. As the satellite moves along its orbital path it must perform a rotation to keep its solar panels pointing to the Sun direction in order to obtain the maximum energy while the satellite antenna keeps pointing to the earth’s centre. This rotation causes a phase variation that the receiver misunderstands as a range variation.
Doppler shift measurement
The Doppler effect^{5} (or the Doppler shift) is the change in frequency for an observer (in this case, the GNSS receiver) moving relative to its source (in this case, a given GNSS satellite ). The relationship between observed frequency and emitted frequency is given by:
Since the speeds of the receiver and the satellite are small compared to the speed of the wave, the difference between the observed frequency and emitted frequency can be approximated by:
Then, the Doppler shift measurement can be written as:
where and are the position and velocity of the receiver at the instant . The term is the radial velocity from the receiver relative to the satellite, and and are the receiver and satellite clocks drift, respectively. The Doppler shift measurement is given in Hz.
Pseudorange rate measurement
Doppler shift measurements are sometimes given in m/s. This is referred to as pseudorange rate measurement, and it is defined as the Doppler shift multiplied by the negative of carrier wavelength . Its model can be written as:
Implementation: GPS_L1_CA_Observables
IMPORTANT: This implementation has been removed from the next
branch of GNSSSDR source code and will not be present in the next stable release. Please use instead the Hybrid_Observables
implementation described below.
This implementation computes observables by collecting the outputs of channels for GPS L1 C/A signals.
It accepts the following parameters:
Parameter  Description  Required 

implementation 
GPS_L1_CA_Observables 
Mandatory 
averaging_depth 
Number of observables used in a moving average filter. It defaults to $100$.  Optional 
dump 
[true , false ]: If set to true , it enables the Observables internal binary data file logging. It defaults to false . 
Optional 
dump_filename 
If dump is set to true , name of the file in which internal data will be stored. It defaults to ./observables.dat 
Optional 
Observables implementation: GPS_L1_CA_Observables
.
Example:
;######### OBSERVABLES CONFIG ############
Observables.implementation=GPS_L1_CA_Observables
Observables.dump=true
Observables.dump_filename=./my_observables.dat
Implementation: GPS_L2C_Observables
IMPORTANT: This implementation has been removed from the next
branch of GNSSSDR source code and will not be present in the next stable release. Please use instead the Hybrid_Observables
implementation described below.
This implementation computes observables by collecting the outputs of channels for GPS L2C(M) signals.
It accepts the following parameters:
Parameter  Description  Required 

implementation 
GPS_L2C_Observables 
Mandatory 
averaging_depth 
Number of observables used in a moving average filter. It defaults to $100$.  Optional 
dump 
[true , false ]: If set to true , it enables the Observables internal binary data file logging. It defaults to false . 
Optional 
dump_filename 
If dump is set to true , name of the file in which internal data will be stored. It defaults to ./observables.dat 
Optional 
Observables implementation: GPS_L2C_Observables
.
Example:
;######### OBSERVABLES CONFIG ############
Observables.implementation=GPS_L2C_Observables
Observables.dump=true
Observables.dump_filename=./my_observables.dat
Implementation: Galileo_E1B_Observables
IMPORTANT: This implementation has been removed from the next
branch of GNSSSDR source code and will not be present in the next stable release. Please use instead the Hybrid_Observables
implementation described below.
This implementation computes observables by collecting the outputs of channels for Galileo E1B signals.
It accepts the following parameters:
Parameter  Description  Required 

implementation 
Galileo_E1B_Observables 
Mandatory 
averaging_depth 
Number of observables used in a moving average filter. It defaults to $100$.  Optional 
dump 
[true , false ]: If set to true , it enables the Observables internal binary data file logging. It defaults to false . 
Optional 
dump_filename 
If dump is set to true , name of the file in which internal data will be stored. It defaults to ./observables.dat 
Optional 
Observables implementation: Galileo_E1B_Observables
.
Example:
;######### OBSERVABLES CONFIG ############
Observables.implementation=Galileo_E1B_Observables
Implementation: Galileo_E5A_Observables
IMPORTANT: This implementation has been removed from the next
branch of GNSSSDR source code and will not be present in the next stable release. Please use instead the Hybrid_Observables
implementation described below.
This implementation computes observables by collecting the outputs of channels for Galileo E5a signals.
It accepts the following parameters:
Parameter  Description  Required 

implementation 
Galileo_E5A_Observables 
Mandatory 
averaging_depth 
Number of observables used in a moving average filter. It defaults to $100$.  Optional 
dump 
[true , false ]: If set to true , it enables the Observables internal binary data file logging. It defaults to false . 
Optional 
dump_filename 
If dump is set to true , name of the file in which internal data will be stored. It defaults to ./observables.dat 
Optional 
Observables implementation: Galileo_E5A_Observables
.
Example:
;######### OBSERVABLES CONFIG ############
Observables.implementation=Galileo_E5A_Observables
Implementation: Hybrid_Observables
This implementation computes observables by collecting the outputs of channels for all kind of allowed GNSS signals. You always can use this implementation in your configuration file, since it accepts all kind of (single or multiband, single or multiconstellation) receiver configurations.
It accepts the following parameters:
Parameter  Description  Required 

implementation 
Hybrid_Observables 
Mandatory 
dump 
[true , false ]: If set to true , it enables the Observables internal binary data file logging. Storage in .mat files readable from Matlab, Octave and Python is available in the next branch, see below. It defaults to false . 
Optional 
dump_filename 
If dump is set to true , name of the file in which internal data will be stored. It defaults to ./observables.dat 
Optional 
Observables implementation: Hybrid_Observables
.
If dump=true
, the logging of data is also delivered in MATLAB Level 5 MATfile v7.3 format, in a file with same name than dump_filename
but terminated in .mat
instead of .dat
. This is a compressed binary file format which can be easily read with Matlab or Octave, by doing load observables.mat
, or in Python via the h5py library. The stored variables are matrices with a number of rows equal to the total number of channels set up in the configuration file, and a number of columns equal to the number of epochs (that is, tracking integration times). This block stores the following variables:
Carrier_Doppler_hz
: Doppler estimation in each channel, in [Hz].Carrier_phase_cycles
: Carrier phase estimation in each channel, in [cycles].Flag_valid_pseudorange
: Pseudorange computation status in each channel.PRN
: Satellite ID processed in each channel.Pseudorange_m
: Pseudorange computation in each channel, in [m].RX_time
: Receiving time in each channel, in seconds after the start of the week.TOW_at_current_symbol_s
: Time of week of the current symbol, in [s].
THIS FEATURE IS NOW ONLY AVAILABLE IN THE next
BRANCH, AND WILL FORM PART OF THE NEXT STABLE RELEASE.
Example:
;######### OBSERVABLES CONFIG ############
Observables.implementation=Hybrid_Observables
Observables.dump=true
References

T. Takasu, RTKLIB ver. 2.4.2 Manual. April 29, 2013. ↩ ↩^{2} ↩^{3} ↩^{4}

M. Petovello, M. Rao, G. Falca, Code Tracking and Pseudoranges: How can pseudorange measurements be generated from code tracking?, Inside GNSS, vol. 7, no. 1, pp. 26–33, Jan./Feb. 2012. ↩

J. Arribas, M. Branzanti, C. FernándezPrades and P. Closas, Fastening GPS and Galileo Tight with a Software Receiver, in Proc. of the 27th International Technical Meeting of The Satellite Division of the Institute of Navigation (ION GNSS+ 2014), Tampa, Florida, Sep. 2014, pp. 1383  1395. ↩

M. Petovello, C. O’Driscoll, Carrier phase and its measurements for GNSS: What is the carrier phase measurement? How is it generated in GNSS receivers? Inside GNSS, vol. 5, no. 5, pp. 18–22, Jul./Aug. 2010. ↩

C. Doppler, Über das farbige Licht der Doppelsterne und einiger anderer Gestirne des Himmels (On the colored light of the double stars and certain other stars of the heavens), Abh. Kniglich Bhmischen Ges. Wiss., vol. 2, pp. 467–482, 1842. ↩
Leave a Comment