GNSS tri-band, quad-constellation sky recording

I’d like to share my first tri-band GNSS sky recording along with scripts for acquisition and tracking.

The recording is 50 seconds long with three channels of simultaneous 2-bit complex samples at 70 Msa/s (approx. 50 MHz usable bandwidth per channel) centered on L1, L2, and E5 (~1191 MHz). It’s therefore guaranteed to contain a complete data frame for each satellite—the length of an ephemeris frame is 30 seconds for all the GNSS systems, at least for the legacy data formats (though Galileo cuts this in half when using dual frequency via interleaving). An autonomous solution can be obtained for GPS, GLONASS, and Galileo (all of which have at least 4 satellites present), and nearly for BeiDou (only 3 satellites present).

Here is the recording in tcpdump / libpcap format. The utility packet2wav_3ch extracts one of the three RF channels from this packet stream and converts to a raw stream of signed 8-bit values for a downstream software receiver or other tool.

gnss-20170427-L1L2L5.pcap (5.4 GB)

By my count there are 34 satellites in this recording that are emitting 64 distinct GNSS signals (more if you include P/Y and M and CS/PRS codes and count I and Q separately). The satellites with active signals are as follows:

GNSS system PRNs or FDMA channels
GPS 2 4 5 12 13 15 18 20 21 25 26 29
GLONASS -7 -5 -3 -2 1 2 3 5 6
Galileo 7 12 14 19 20 24 26
BeiDou 7 14 34
SBAS 133 135 138

and the signals themselves:

GNSS system Band PRNs or FDMA channels
GPS L1 2 4 5 12 13 15 18 20 21 25 26 29
GPS L2C 4 5 12 25 26 29
GPS L5 25
GLONASS L1 -7 -5 -3 -2 2 5 6
GLONASS L2 -7 -5 -3 -2 1 2 3 5 6
Galileo E1 7 12 14 19 20 24 26
Galileo E5b 7 12 14 19 24 26
Galileo E5a 7 12 14 19 24 26
BeiDou B1I 7 14 34
BeiDou B2I 14
SBAS L1 135
SBAS L5 133 135 138

Below are plots of some of the acquisition metrics (but I’ve not yet automated any sort of detection threshold). Click for larger image:


The L5/E5 channel should support tracking of the full Galileo E5 signal (E5ab). I haven’t implemented this tracking mode yet, but it involves using a combination of a pure PLL for the pilot signals and a Costas loop for the data signals, optimally weighted and combined. (These would be the “C8X” and “L8X” observables in the taxonomy of RINEX 3.0.)

A makefile is provided in the GNSS-DSP-tools repository that will download the recording, run all the acquisition routines, and track the signals. Acquisition of GPS L1 is quick, but some other signal types are slower because they search all PRNs exhaustively and with a fairly high sensitivity.

Some miscellaneous notes on the signals:

  • I’m not sure why SBAS 133 and 138 are not showing up on L1. They have strong signals on L5, and other recordings in the past have shown them on both L1 and L5 with no trouble. Perhaps there’s some flaw in the acquisition related to the higher data rate on SBAS (although I do only 1 ms integrations, so it should not matter).
  • Same for GLONASS channels 1 and 3 on L1 vs. L2.
  • BeiDou PRNs 7 and 34 are apparently not transmitting on B2I. (PRN 34 is probably transmitting the BeiDou phase 3 L1 MBOC signal, incidentally.)
  • The GLONASS L3OC PRNs nominally run from 1 to 24, corresponding to the slot number, at least according to this GPS World article. Not sure why there’s a PRN 26 being transmitted by one of the GLONASS-K satellites. As I recall, there were other PRNs outside of the range 1–24 also used by GLONASS-K; perhaps the code assignments have changed over time.

The antenna is a homemade 3-turn helical with highpass filter and LNA, both from Mini-Circuits. It’s pretty much the simplest thing that could possibly work while still having acceptable bandwidth (1150–1610 MHz) and acceptable spatial pattern and circular polarization. Some slight interference from LTE is visible in the waterfall plots (using baudline), but it’s weak enough that the GNSS signals are not affected. Probably better preselection filtering is needed, or a stronger LNA, or both.