Real time Doppler correction with GNU Radio

Satellite RF signals are shifted in frequency proportionally to the line-of-sight velocity between the satellite and groundstation, due to the Doppler effect. The Doppler frequency depends on time, on the location of the groundstation, and on the orbit of the satellite, as well as on the carrier frequency. In satellite communications, it is common to correct for the Doppler present in the downlink signals before processing them. It is also common to correct for the uplink Doppler before transmitting an uplink signal, so that the satellite receiver sees a constant frequency.

For Earth satellites, these kinds of corrections can be done in GNU Radio using the gr-gpredict-doppler out-of-tree module and Gpredict (see this old post). In this method, Gpredict calculates the current Doppler frequency and sends it to gr-gpredict-doppler, which updates a variable in the GNU Radio flowgraph that controls the Doppler correction (for instance by changing the frequency of a Frequency Xlating FIR Filter or Signal Source).

I’m more interested in non Earth orbiting satellites, for which Gpredict, which uses TLEs, doesn’t work. I want to perform Doppler correction using data from NASA HORIZONS or computed with GMAT. To do this, I have added a new Doppler Correction C++ block to gr-satellites. This block reads a text file that lists Doppler frequency versus time, and uses that to perform the Doppler correction. In this post, I describe how the block works.

GPS SVN49 broadcasting non-standard codes again

As a GNSS engineer at my day job in GMV, it’s not uncommon to find myself looking at spectrums of the GNSS signal bands, either on a spectrum analyzer or on an IQ recording done by an SDR. A few days ago, I spotted something in the L1 band (1575.42MHz) that quickly caught my eye: a pair of strong carriers at +/- 511.5kHz away from the L1 centre frequency. This was visible on some of the recordings that we had done in the last few days, and also live on a spectrum analyzer.

When monitoring the signal on the spectrum analyzer, it disappeared a few hours later, making me suspect that it was transmitted by a satellite rather than a local interferer. Back at home, I did some recordings with STRF to try to identify the satellite using its Doppler.

The Doppler signature of the signal was a perfect match for GPS SVN49, also as USA-203 and GPS IIRM-7. This satellite, launched in 2009, was the first to demonstrate the L5 signal. During in-orbit testing, an anomaly with its navigation signals caused by the L5 filter was discovered. The satellite was never put into operational use, and has been used for varied tests ever since.

After searching information about this satellite, I learned that some researchers from Torino, Italy, had already observed back in 2017 the same kind of signals that I was seeing.

This post is a detailed study of the L1 signal that is currently being broadcast by GPS SVN49. The data used here has been published in Zenodo as “RF recordings of GPS SVN49 broadcasting non-standard codes“.

Measuring QO-100 beacons frequency

Continuing with my frequency measurements of Es’hail 2, I have now been measuring the frequency of the beacons of the QO-100 narrowband transponder for several days. The main goal of these frequency measurements is to use Doppler to study the orbit of Es’hail 2. Previously, I had been doing frequency measurements on the engineering beacons at 10706MHz and 11205MHz. However, these beacons are currently being transmitted on a MENA beam, so I’m quite lucky to be in Spain, as they can’t be received in many other parts of Europe.

During the in-orbit tests of Es’hail 2, the engineering beacons were transmitted on a global beam, and I performed some differential Doppler studies with Jean Marc Momple 3B8DU, in Mauritius. The engineering beacons are no longer any good for these kind of studies, since their area of coverage is small. Thus, I have started to measure the beacons in the narrowband transponder, which covers all the satellite footprint.

Es’hail 2 frequency measurements

After being busy with other projects, I have resumed my frequency measurements of the Es’hail 2 beacons. The last measurement I performed was made when the satellite reached its operational slot at 26ºE. After manoeuvering to this spot, the Doppler was very small, on the order of 0.8ppb peak-to-peak, indicating a very accurate geostationary orbit. Now Es’hail 2 has been two months in its operational slot, inaugurating its Amateur transponders on February 14 and entering commercial service on March 7.

I am curious about studying again the Doppler at this point in the mission, to see how accurate the GEO orbit is. I am also interested in collaborating with other Amateurs to perform differential Doppler measurements, as I did with Jean Marc Momple 3B8DU. Here I detail the first results of my measurements.

Es’hail 2 stationed in 26ºE

If you’ve been following my posts about Es’hail 2, you’ll know that shortly after launch Es’hail 2 was stationed in a test slot at 24ºE. It remained in this slot until December 29, when it started to move to its operational slot at 26ºE. As of January 2, Es’hail is now stationed at 26ºE (25.8ºE, according to the TLEs).

The new GEO orbit at 26ºE is much more perfect than the orbit it had at 24ºE. This is to be expected for an operational orbit. Since December 30, I’ve been recording Doppler data of the satellite moving to its operational slot, and I have found some interesting effects of orbital dynamics in the data. This post is an account of these.

An STRF crash course

Recently, the STRF satellite tracking toolkit for radio observations by Cees Bassa has been gaining some popularity. This toolkit allows one to process RF recordings to extract frequency measurements and perform TLE matching and optimization via Doppler curves. Unfortunately, there is not a lot of documentation for this toolkit. There are some people that want to use STRF but don’t have a clear idea of where to start.

While I have tested very briefly STRF in the past, I had never used it for doing any serious task, so I’m also a newcomer. I have decided to test this tool and learn to use it properly, writing some sort of walk-through as I learn the main functionality. Perhaps this crash course will be useful to other people that want to get started with STRF.

As I have said, I’m no expert on STRF, so there might be some mistakes or omissions in this tutorial that hopefully the experts of STRF will point out. The crash course is organized as a series of exercises that explain basic concepts and the workflow of the tools. The exercises revolve around an IQ recording that I made of the QB50 release from ISS in May 2017. That recording is interesting because it is a wide band recording of the full 70cm Amateur satellite band on an ISS pass on May 29. During a few days before this, a large number of small satellites had been released from the ISS. Therefore, this recording is representative of the TLE lottery situation that occurs after large launches, where the different satellites haven’t drifted much yet and one is trying to match each satellite to a TLE.

The IQ recording can be downloaded here. I suggest that you download it and follow the exercises on your machine. After you finish all the exercises, you can invent your own. Certainly, there is a lot that can be tried with that recording.

A number of supporting files are created during the exercises. For reference, I have created a gist with these files.

Es’hail 2 differential Doppler measurements

Since I published my Es’hail 2 Doppler measurement experiments, Jean Marc Momple 3B8DU has become interested in performing the same kind of measurements. The good thing about having several stations measuring Doppler simultaneously is that you can perform differential measurements, by subtracting the measurements done at each station. This eliminates all errors due to transmitter drift, since the drift is the same at both stations.

Of course, differential measurements need to be done with distant stations, to ensure different geometry that produces different Doppler curves in each station. Otherwise, the two stations see very similar Doppler curves, and subtracting yields nothing.

The good thing is that Jean Marc is in Mauritius, which, if you look at the map, is on the other side of the satellite compared to my station. The satellite is at 0ºN, 24ºE, my station is at 41ºN, 4ºW, and Jean Marc’s is at 20ºS, 58ºE. This provides a very good geometry for differential measurements.

Some days ago, Jean Marc sent me the measurements he had done on December 22, 23 and 24. This post contains an analysis of these measurements and the measurements I took over the same period, as well as some geometric analysis of Doppler.

It would be interesting if other people in different geographic locations join us and also perform measurements. As I’ll explain below, a station in Eastern Europe or South Africa would complement the measurements done from Spain and Mauritius well. If you want to join the fun, note a couple of things first: The Doppler is very small, around 1ppb (or 10Hz). Therefore, you need to have everything locked to a GPS reference, not only your LNB. Also, the change in Doppler is very slow. The Doppler looks like a sinusoidal curve with a period of one day. To obtain meaningful results, continuous measurements need to be done over a long period. At least 12 hours, and preferably a couple days.

One month of Es’hail 2 Doppler data

In a previous post I talked about my Doppler measurements of the Es’hail 2 10706MHz beacon. I’ve now been measuring the Doppler for almost a month and this is a follow-up post with the results. This experiment is a continuation of the previous post, so the measurement setup is as described there.

It is worthy to note that, besides the usual satellite movement in its geostationary orbit, which causes the small Doppler seen here, and the station-keeping manoeuvres done sometimes, another interesting thing has happened during the measurement period.

On 2018-12-13 at 8:00 UTC, the antenna where the 10706MHz beacon is transmitted was changed. Before this, it was transmitted on a RHCP beam with global coverage. After the change, the signal was vertically polarized and the coverage was regional. Getting a good coverage map of this beam is tricky, but according to reports I have received from several stations, the signal was as strong as usual in Spain, the UK and some parts of Italy, but very weak or inexistent in Central Europe, Brazil and Mauritius. It is suspected that the beam used was designed to cover the MENA (Middle East and North Africa) region, and that Spain and the UK fell on a sidelobe of the radiation pattern.

At some point on 2018-12-19, the beacon was back on the RCHP global beam, and it has remained like this until now.

The figure below shows my raw Doppler measurements, in parts-per-billion offset from the nominal 10706MHz frequency. The rest of the post is devoted to the analysis of these measurements.

Studying Es’hail 2 Doppler

Es’hail 2, the first geostationary satellite carrying an Amateur radio payload, was launched on November 15. I wrote a post studying the launch and geostationary transfer orbit, and I expected to track Es’hail 2’s manoeuvres by following the NORAD TLEs. However, for reasons not completely known, no NORAD TLEs were published during the first two weeks after launch.

On November 23, people found Es’hail 2 around the 24ºE geostationary orbital slot by receiving its Ku-band beacons at 10706MHz and 11205MHz. On November 27, NORAD TLEs started being published, confirming the position of Es’hail 2 around 24ºE. Since then, it has remained in this slot. Apparently, this is the slot that will be used for in-orbit test before moving the satellite to its operational slot on 25.5ºE or 26ºE.

Since November 27, I have been monitoring the frequency of the 10706MHz beacon to measure the Doppler. A geostationary satellite is never in a fixed location as seen from the Earth. It moves slightly due to imperfections in its orbit and orbital perturbations. This movement is detectable as a small amount of Doppler. Here I study the measurements I’ve been doing.

Plotting DSLWP-B observations Doppler and geometry

I have made a Python script to plot the Doppler and geometry for a DSLWP-B observation. This can be useful for several things: predicting the downlink and uplink Doppler corrections, checking for the Doppler of the Moonbounce signal, checking the position of DSLWP-B in the sky, and studying Moonbounce geometry.