Zero baseline experiment

I’ve been busy with some consulting projects recently so it’s been a while since my last post but I’m finally caught up and had some time to write something.  I thought I would describe an experiment I did to both try out the “fixed” mode in RTKLIB and also provide some insight into the composition of the errors in the pseudorange and carrier phase measurements in the u-blox M8T receiver.

The “fixed” mode is an alternative to “static” or “kinematic” in which the exact rover location is specified as well as the base position and remains fixed.  The residual errors are then calculated  from the actual position rather than the measured position.  I describe it in a little more detail in this post.  It is intended to be used as a tool to characterize and analyze the residual errors in the pseudorange and carrier phase measurements.

The basic idea in this experiment was to connect two M8T receivers to a single antenna and then compare residuals between the two receivers.  I first looked at the solution using one receiver as base and the other as rover (the zero baseline case) and then compared solutions between each receiver and a local CORS reference station about 8 km away.

The M8T is typically setup to use an active antenna for which it provides power on the antenna input.  I was concerned about connecting the two antenna power feeds together, so to avoid this, I added a 47 pf capacitor in series in one of the antenna feeds to act as a DC block.  In the photo below, the capacitor is inside the metal tape wrapped around a male to male SMA adapter.  I cut the adapter in half, soldered the capacitor to each end, then wrapped it in metal tape as a shield.


The receivers are from CSG and each one is connected to a Next Thing CHIP single board computer, which logs the data and transmits it over wireless to my laptop.  They are very similar to the Raspberry Pi data loggers I described in a previous post, but the on-board wireless makes them more convenient to use.  At $9 each, they are also quite affordable, especially since they do not need micro SD cards like the Raspberry Pi Zeros.  They also have a built-in LiPo battery connector which can be convenient for providing power., although they can also be powered over the USB connectors.  They are also linux based, so setting them up is very similar to the instructions in my Raspberry Pi post.

I first looked at the zero baseline case where I used one receiver as base and the other as rover.  In this case the two receivers are seeing exactly the same signal from the single antenna.  Any error contributions from the satellites, atmosphere, or antenna should cancel and the only contributor to the residual errors should be from the receivers.

I collected about an hour of measurement data from my back patio.  It is next to the house and nearby trees so as usual, the data quality is only mediocre and will include both some multipath and signal attenuation.  I prefer to look at less than perfect data because that is where the challenges are, not in the perfect data sets collected in wide-open skies.

Here are the residuals for a high elevation, high signal strength GPS satellite.  Standard deviations are 0.24 meters for the pseudorange and 0.0008 meters for the carrier phase.


For a lower elevation GPS satellite with low and varying signal strength, the standard deviations increased to 0.46 meters for the pseudorange and 0.0017 meters for the carrier phase.  Notice how the residuals increase as the signal strength decreases as you would expect.



The GLONASS satellites had noticeably higher residuals.  Here is an example of a satellite with high elevation and reasonable signal strength.  The standard deviations were 1.02 meters for pseudorange and 0.0039 meters for carrier phase, more than twice the GPS residuals.


I’m not quite sure how relevant it is, but the ratio between the pseudorange residuals and carrier phase residuals in each case is roughly 300, the same value I have found works best for “eratio1”, the config file input parameter that specifies the ratio between the two.

RTKLIB also estimates the standard devations of the GLONASS satellites measurements at 1.5 times the standard deviations of the GPS satellites which is less than the difference I see in the example above.

However, my numbers are for only the receiver components of the measurement errors, I’m not sure exactly which components the RTKLIB config parameters are intended to include.

For the second experiment, I calculated solutions for both receivers relative to a CORS reference station about 8 km away.  In this case, I was curious to see how close the two solutions are as they will have common satellite, atmospheric, and antenna errors but will differ in their receiver errors.  The plot below shows the residuals for a GPS satellite from each solution plotted on top of each other.  As you can see the errors are quite a bit larger than before and the correlation between the two receivers is very high.  Based on the frequency of the errors, I suspect they are dominated by multipath which will vary roughly sinusoidally as the direct path and reflected path go in and out of phase with each other.

I found it quite impressive to see how repeatable the errors are between the two solutions.  It indicates, at least at this distance, that the errors from the receiver are small compared to the other errors in the system.zeroBL4

Again, the GLONASS results were not as good as the GPS results and include a DC shift in the carrier phase that I’m not sure exactly what the cause is.


I haven’t spent a lot of time trying to figure out how to best use the information in these plots but in particular I found the similarity between the two receiver solutions in the longer baseline experiment quite encouraging.  If the errors are dominated by multipath as I expect, then the baseline length isn’t that relevant and I would expect to see similar results with shorter baselines.  If that’s true, then it may be possible to derive information about the receiver’s environment from the multipath data.  People do this with more expensive dual frequency receivers to monitor things like tides and ground moisture content.  It would be interesting to see if it can be done with these low cost receivers.  Or maybe it already has been done …



13 thoughts on “Zero baseline experiment”

  1. Hi Tim, looking at a way how to connect two receivers to a single antenna myself. I learned there is an part called “DC block” that may be used instead of your capacitor. These are readily available on ebay and AliExpress for $5-15/piece (search for “SMA DC block”). But they seem to do the “DC block” by using a large resistor (50 Ohm) and are specified to allow RF in the range of about 100 MHz to 6 GHz. Do you think the resistor could work or did you have a particular reason in using a capacitor? Capacitor seems to be used in a “bias tee” as I found out.

    Here is a product example:


    1. Hi Kozuch. I am actually using off-the shelf DC blocks in my experiments now that look exactly like the part you linked to, and probably are the same part. The 50 ohms you refer to is an impedence, not a resistance and is used for impedence matching not for blocking the DC.


  2. Hi,
    this is very interesting.
    Starting from a working “Static” configuration i tried to use the “Fixed”. I have changed the rover position as “Rinex header” but i got no results (Q=0). The RINEX of the rover ha the correct antenna position. The rover is a single-frequency rx. The RTKlib version is the 2.4.3. b28. Can you help me ? Thanks.


    1. Hi Gerard. The header of the Rinex file usually indicates the approximate location of the receiver, not the exact location. I would specify the exact base and rover locations in the antenna position config inputs and see if that helps. If that doesn’t work, I would set the debug level to 3 in the input configuration file, then look at the trace file for messages indicating why Q=0. I have not tried fixed mode with the official 2.4.3 b28 code, but have no reason to think it doesn’t work.


  3. Hi
    I too connect two receivers to the one antenna. Interesting is , that the carrier phase, pseudorange and doppler speed are different on different receivers. I see it in u-center.
    As I think, if recievers are connected to one antenna, phase, pseudorange and doppler must be equals. May be i’m wrong. The resievers are ublox 7p and evk-7m.
    Can you compare phase, pseudorange and doppler on you resievers?


    1. Only if the two receivers shared an external oscillator, then pseudorange and Doppler would be statistically equivalent, i.e., the absolute difference across identical receivers would be negligible vis-a-vis their precision. Carrier phase would still be receiver dependent because the initial ambiguities are arbitrary.


  4. Very interesting. Have you try to use different receiver from other company to repeat the test checking the same result?


  5. Hi,
    Glad to hear you are busy. Just wanted to let you know that I’ve been using your latest version almost exclusively for post-processing with Emlid M8T Reach L1 GPS units.

    I rarely, if ever get the glitches in coordinates that used to plague the RTK Kinetic and Static solutions. Thanks again.


  6. Interesting results. I’m curious how the phase residuals look like when plotted over elevation angle instead of time; it might be possible to improve the calibration of the a/b coefficients in the a+b/sinEl model implemented in RTKLIB. Also, the value of 300 for the code/carrier noise ratio should be different for each receiver and antenna model combination — maybe it could be reported by RTKPOST by default to warn the user? Here’s a similar zero-baseline experiment: de Bakker et al. (2012) “Short and zero baseline analysis of GPS L1 C/A, L5Q, GIOVE E1B, and E5aQ signals”, GPS Solut 16:53,


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: