A high-sensitivity ADS-B receiver

Since the end of August I have been working on a new ADS-B receiver application that is intended to outperform existing open source receivers in scenarios with weak signals or message collisions. Now I have reached a point where this software is ready to be published. The name of this project is more1090, and it is a Rust application and library licensed under an Apache 2.0 or MIT license. The receiver operates at 8 Msps IQ and uses FFTs for signal detection. Therefore, it is much more CPU intensive than other ADS-B receivers such as readsb. It will probably not run on your Raspberry Pi (I haven’t tried; maybe there is a hope for the Pi 5 or other modern high-performance ARM boards), but it runs 4 times faster than real-time on a modern x86-64 laptop (the receiver is single-threaded, so the core count doesn’t matter), and it can decode way more messages than readsb.

The more1090 receiver only decodes Mode-S extended squitter replies (DF17 and DF18), which is how ADS-B is transmitted at 1090 MHz. Other receivers such as readsb also attempt to decode other Mode-S reply message types and even Mode-A/C replies. The challenge to decode other Mode-S message types is that only extended squitter and acquisition squitter (one particular use of DF11) are intended to be broadcast messages to be decoded by any receiver. The remaining messages are intended to be replies to an interrogator, to be decoded only by that interrogator. Their CRC is XORed with information only known to the interrogator, such as the ICAO address of the replier or the interrogator identification code. Therefore, it is difficult for another receiver to determine if it has decoded these messages without errors. Because of this, more1090 focuses on decoding extended squitter messages as best as possible and ignoring everything else. It is possible to decode acquisition squitter messages using a similar approach, but these messages only contain the ICAO address of the transmitter, so they are of limited interest, and decoding them is not implemented at the moment.

In addition to the ADS-B receiver, more1090 contains a signal simulator that can generate all types of Mode-S and Mode-A/C replies that appear at 1090 MHz in the real world. This simulator can generate both signal snippets containing a single message, which are useful for benchmarking things such as decode probability at a given CN0, and full scenarios which contain all message types with transmission times following a Poisson process. The full scenarios characterize the receiver performance in more realistic conditions.

At the moment this simulator doesn’t generate TACAN/DME signals. There are a few ground-to-air TACAN channels that are within 4 MHz of 1090 MHz: 125Y, 126Y, 1Y, 2Y, 3Y, 4Y, 5Y, 6Y, 7Y. These channels are used infrequently (an example is the SSY VOR/DME in Madrid, Spain, which transmits on 125Y at 1086 MHz). Additionally, there are also air-to-ground TACAN channels within 4 MHz of 1090 MHz: 62X, 62Y, 63X, 63Y, 64X, 64Y, 65X, 65Y, 66X, 66Y, 67X, 67Y, 68X, 68Y, 69X, 69Y, 70X, 70Y. Real world usage of these channels includes around 100 civilian VOR/DME, VORTAC or DME-only in channel 70X (1094 MHz) and a number of military TACAN in the remaining X channels. These are a potential source of interference to ADS-B and other secondary surveillance radar services at 1090 MHz.

The signal simulator is used for benchmarking the more1090 receiver, both in synthetic conditions (isolated messages at a fixed CN0) and in scenarios which are representative of a typical terrestrial receiver and a typical receiver on a LEO satellite.

In the rest of this post I explain more details about this new ADS-B receiver.

Analysis of DME signals

You might remember that back in July I made a recording of the DME ground-to-air and air-to-ground frequencies for a nearby VOR-DME station. In that post, I performed a preliminary analysis of the recording. I mentioned that I was interested in measuring the delay between the signals received directly from the aircraft and the ground transponder replies, and match these to the aircraft trajectories. This post is focused on that kind of study. I will present a GNU Radio out-of-tree module gr-dme that I have written to detect and measure DME pulses, and show a Jupyter notebook where I match aircraft pulses with their corresponding ground transponder replies and compare the delays to those calculated from the aircraft positions given in ADS-B data.

Aircraft reflections of a 2.3GHz beacon

A couple months ago, Andrés Calleja EB4FJV installed a 2.3GHz beacon in his home in Colmenar Viejo, Madrid. The beacon has 2W of power, radiates with an omnidirectional antenna in the vertical polarization, and transmits a tone and CW identification at the frequency 2320.865MHz.

Since Colmenar Viejo is only 10km away from Tres Cantos, where I live, I can receive the beacon with a very strong signal from home. The Madrid-Barajas airport is also quite near (15km to the threshold of runway 18R) and several departure and approach aircraft routes pass nearby, particularly those flying over the Colmenar VOR. Therefore, it is quite easy to see reflections off aircraft when listening to the beacon.

On July 8 I did a recording of the beacon from 10:04 to 11:03 UTC from the countryside just outside Tres Cantos. In this post I will examine the aircraft reflections seen in the recording and match them with ADS-B aircraft position and velocity data obtained from adsbexchange.com. This will show the locations and trajectories which produce reflections strong enough to be detected.

GOMX-3 data download

This weekend, Mike DK3WN caught GOMX-3 downloading a good amount of data. See his post here. This data consists mainly of the satellite retransmitting a lot of beacons that were generated during the last 16 hours or so.

GomSpace has recently released a complete parser for GOMX-3 beacons of type 1 0 (these are the beacons that contain ADS-B data). I have already incorporated this code into my gr-ax100 fork.

The binary data in KISS format (almost 250KB) and the parsed beacon data received during this data download is in gist. Probably the most interesting thing is the ADS-B data. Below you can see all the aircraft on the map. Clicking on any of them will show the details for that aircraft.

Since the orbit of GOMX-3 has an inclination of 51.6º, the satellite doesn’t usually detect aircraft above 55ºN or below 55ºS. GomSpace has an image which shows lots of flights received with GOMX-3. There, the major air routes and hubs are apparent.