Double Difference Analysis
The noise associated with observations collected by a stationary GPS receiver can be characterized by conducting a double difference analysis. This requires a synchronous set of range, phase, and Doppler observations from two receivers connected to a common antenna in what is commonly referred to as a zero-baseline configuration. The double difference being computed is between two SVs and two receivers at a single epoch. The first difference is formed for each receiver by differencing the observations of any two SVs. The second difference is formed by differencing these two first differences.
ddGen
Process
The noise associated with observations collected by a stationary GPS receiver can be characterized by conducting a double difference analysis. This requires a synchronous set of range, phase, and Doppler observations from two receivers connected to a common antenna in what is commonly referred to as a zero-baseline configuration. The double difference being computed is between two SVs and two receivers at a single epoch. The first difference is formed for each receiver by differencing the observations of any two SVs. The second difference is formed by differencing these two first differences.
While the above summarizes the double difference, it is not a sufficient description of the necessary processing steps. There are various corrections that need to be applied, edits to be performed, and statistics to be computed. This processing is implemented in the GPSTk application
ddGen. The source code of this program can be found at
http://gpstk.svn.sourceforge.net/viewvc/gpstk/dev/apps/reszilla/ . What follows is a description of the processing that
ddGen performs.
The following operations are performed at each epoch:
- The raw pseudorange observations from a receiver are used to compute a pseudorange residual based on the provided ephemeris data for each SV and a provided receiver position. These residuals are averaged together to form a receiver clock estimate at each epoch.
- This process is repeated for the second receiver.
- The two clock estimates for the epoch are differenced to form a receiver clock bias.
- Data that doesn't meet the following criteria is excluded at this point:
- Health bits must be set in the ephemeris and must indicate a healthy status
- SNR must be greater than 20 dBHz
- Observation data for each SV must be provided from both receivers
- Flags in the observation data messages must indicate continuous tracking
- For each unique pair of SVs, a double difference is formed for the range, phase, and Doppler.
- The double differences are corrected for SV motion by using the Doppler measurement for an estimate of line-of-sight motion and the computed receiver clock bias.
The receiver clock estimate is sensitive to errors in the provided antenna position, SV position/clock, ionospheric modeling, and tropospheric modeling. Since errors in the receiver clock estimate have a very weak effect on the double difference, the broadcast ephemeris may be used for the SV position and clock computation. A dual frequency ionospheric correction and a location/time based tropospheric model are applied.
After this process has been completed for all epochs in the input data, the range and Doppler double differences are complete. The phase double differences still include both receivers' integer ambiguity in phase. The removal of this bias occurs as follows:
- The phase double differences are grouped into tracks, or continuous series of double differences for a specific pair of SVs.
- A third difference is formed as the difference between successive values in each track.
- The track(s) for a specific SV pair are further split into smaller tracks based upon discontinuities in the third difference. This accounts for cycle slips and other tracking anomalies.
- The mean value of each double difference track is computed and removed from the values in the track.
At this point, the double differences for range, phase and Doppler represent samples of the receiver noise. This noise process is generally accepted to be a function of signal strength, and signal strength is a function of elevation. As such, the double differences are grouped into elevation bins where both SVs are in the same elevation range. The elevation bins are often chosen to easily get a significant sample set while being small enough to reflect similar signal strength.
Since this is a stochastic process, descriptive statistics are computed over all the epochs. The first and second order moments (mean and standard deviation) are computed for the data in each of the bins. This results in a table of statistics that is indexed by carrier (L1, L2), code (C/A, Y, P), observation type (range, phase, Doppler) and elevation range. A partial example of this is below.
ObsID elev stddev mean # obs # bad # unk max good slips
------------- ----- -------- -------- ------- ------ ------ -------- -----
L1 C/A range 0-10 0.40522 -0.006 44509 1144 342 22.81
L1 C/A phase 0-10 0.00187 -0.000 44247 1406 342 0.10
L1 C/A doppler 0-10 0.42212 0.023 45653 0 342 6.58
L1 Y range 0-10 0.32562 -0.009 41789 2394 1812 8.31
L1 Y phase 0-10 0.00210 -0.000 41734 2449 1812 0.10
L1 Y doppler 0-10 0.40715 0.039 44183 0 1812 6.58
L1 C/A range 10-20 0.21968 -0.043 71231 16 16 7.18
L1 C/A phase 10-20 0.00071 0.000 71231 16 16 0.01
L1 C/A doppler10-20 0.52486 -0.005 71247 0 16 1.41
L1 Y range 10-20 0.20557 -0.061 70634 266 363 7.77
L1 Y phase 10-20 0.00071 0.000 70627 273 363 0.01
L1 Y doppler 10-20 0.52367 -0.006 70900 0 363 1.41
...
The
ddGen program has two modes of operation. The first uses a single master SV to form the double difference. The second forms all unique combinations of SV pairs at each epoch. Since memory constraints limit the length of data that can easily be processed using this technique, the length of data analyzed needs to be traded off against the strength of the statistical characterization. This is also why all unique combinations of two SVs are used at each epoch as opposed to just using a single "master" SV to difference all other SVs against. Each combination is a unique observation of the receiver noise. So, instead of getting n-1 observations of noise at each epoch, we get

observations, where n is the number of SVs in track. Experience shows that processing more than 24 hours of data in this manner does not affect the standard deviation or the mean. Processing spans less than 24 hours have not been investigated.
The Double Difference
There are many differences that can be formed, each with different properties. The intent of this analysis is to derive a process for examining the receiver noise of a stationary GPS receiver based upon the receiver's raw range measurements. This analysis assumes that two identical receivers are connected to a common antenna in what is commonly referred to as a zero-baseline configuration. While the receivers share an antenna, they do not share a common frequency references or internal clock.
The basic GPS range equation may be written as (see symbol key at end):
A first difference is formed between two receivers (

) at the same epoch for the same satellite. This difference has the effect of reducing the common mode effects proportional to the inverse of the length of the baseline. For a zero-baseline configuration, this has the desireable effect of removing may sources of errors. Specifically

, and

and are all canceled out.
This first difference is also formed for a second SV at the same epoch.
Note that in the first difference, the receiver clock offset still is the major term. Forming a second difference (

) between the two first differences will cancel this term.
If the receiver noise is assumed to be non-correlated between receivers and SVs, the magnitude of this double difference is

times the receiver noise of a single receiver.
One significant problem with the preceding analysis is that the two receivers did not take their observations at precisely the same time. When each receiver is taking observations synchronously to its internal clock, the difference in the two receivers' clock offsets (

) is the difference in the time between when the observations were taken. To account for this, the observations from one receiver may be shifted to align it with the other receiver. The magnitude of this shift is the line-of-sight motion multiplied by the difference in receiver offsets.
The Doppler measurement is an estimate of the line of sight motion so the above equation can be rewritten as:
Symbols
-
: true line-of-sight range
-
: observed code range
-
: observed carrier phase measurement
-
: time-adjusted code range measurement
-
: observed carrier phase rate of change, an observation of line of sight motion (m/s)
-
: receiver noise
-
: receiver clock error
-
: satellite clock error
-
: user range error; represents the uncertainty in knowing the satellite's position
-
: ionospheric delay
-
: tropospheric delay
-
: multipath error
The first numeric subscript is the receiver index while the second one is the SV index. So

would be the noise of receiver 1 due to tracking SV 2.
ddStats
Computes statistics on ddGen output. Currently this is done in ddGen.
-b, --elev-bin=ARG | A range of elevations, used in computing the statistical summaries. Repeat to specify multiple bins. The default is "b 0-10 -b 10-20 -b 20-60 -b 10-90". |
-o, --statsFile=ARG | Filename for output of stats only. Stats will still be included at the end of the ord file. |
-s, --sigma=ARG | Multiplier for sigma stripping used in statistical computations. The default value is 6. |
ddPlot
This tool plots the double difference results. It is written in python and uses matplotlib for generating the graphs. All double differences will be plotted by default, or you may specify plotting criteria using the command line options. A sample plot is show below. Click on the thumbnail to see a larger image.
Options:
-h, --help | Show this help message and exit |
-d, --debug | Increase the debugLevel. |
-l, --legend | Include a legend. |
-a, --averages | Plot the averages using the same plotting criteria. Use twice and only averages will be plotted. |
-u, --no-unhlthy | Do not plot data from unhealthy SVs. |
-r, --range | Plot range double difference values. |
-D, --doppler | Plot Doppler double difference values. |
-p, --phase | Plot phase double difference values. |
-1, --L1 | Plot data from L1 freq band. |
-2, --L2 | Plot data from L2 freq band. |
-i INPUTFILE | Input data file, defaults to stdin.= |
-t TITLE | Specify a title for the plot. Defaults to the name of the input stream. |
-f SAVEFIG | Save the figure to the indicated file. |
-y YRANGE | Fix the y range on the ords to be +- this value. |
-s TSTART | Start time. Format as "YYYY DOY HH:MM:SS.S" (Note the trailing decimal place). |
-e TEND | End time. Format as "YYYY DOY HH:MM:SS.S" (Note the trailing decimal place). |