The 1090 Megahertz Riddle (second edition)

A Guide to Decoding Mode S and ADS-B Signals
By: Junzi Sun (junzis.com)

Aircraft identification and category

Within the group of ADS-B messages, the Aircraft Identification and Category message is designed to broadcast the identification (also known as the ‘callsign’), and the wake vortex category of the aircraft.

In this message, the Type Code can be from 1 to 4. The 56-bit ME filed consists of 10 parts and is structured as follows:

+------+------+------+------+------+------+------+------+------+------+
| TC,5 | CA,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 |
+------+------+------+------+------+------+------+------+------+------+

TC: Type code
CA: Aircraft category
C*: A character

Here, number 6 represents the number of bits used to encode each of the characters.

Identification (call sign)

The aircraft identification included in the message is the callsign. Be aware that callsign is not a unique identifier of an aircraft, since different aircraft flying the same route at different times would share the same callsign.

The last eight fields in the previous structure diagram represent the callsign characters. In order to decode each character, a lookup table is needed to map the corresponding decimal number (represented in binary code) to each character.

The character mapping is shown as follows:

#ABCDEFGHIJKLMNOPQRSTUVWXYZ##### ###############0123456789######

Firstly, the # symbols represent characters that are not used. In summary, characters and their decimal representations are as follows, where the symbol refers to a space character.

A - Z :   1 - 26
0 - 9 :  48 - 57
    ␣ :  32

If you are familiar with the ASCII (American Standard Code for Information Interchange) code, it is easy to identify that a callsign character is encoded using the lower six bits of the same character in ASCII.

Wake vortex category

The CA value in combination with TC value defines the wake vortex category of the aircraft. Table 1.1 lists the definitions and related TC and CA codes.

Wake vortex in ADS-B identification and category message
TC CA Category
1 ANY Reserved
ANY 0 No category information
2 1 Surface emergency vehicle
2 3 Surface service vehicle
2 4–7 Ground obstruction
3 1 Glider, sailplane
3 2 Lighter-than-air
3 3 Parachutist, skydiver
3 4 Ultralight, hang-glider, paraglider
3 5 Reserved
3 6 Unmanned aerial vehicle
3 7 Space or transatmospheric vehicle
4 1 Light (less than 7000 kg)
4 2 Medium 1 (between 7000 kg and 34000 kg)
4 3 Medium 2 (between 34000 kg to 136000 kg)
4 4 High vortex aircraft
4 5 Heavy (larger than 136000 kg)
4 6 High performance (>5 g acceleration) and high speed (>400 kt)
4 7 Rotorcraft

It is worth noting that ADS-B has its own definition of wake categories, which is different from the ICAO wake turbulence category definition commonly used in aviation. The relationships of ICAO wake turbulence category (WTC) and ADS-B wake vortex category are:

  • ICAO WTC L (Light) is equivalent to ADS-B (TC=4, CA=1).

  • ICAO WTC M (Medium) is equivalent to ADS-B (TC=4, CA=2 or CA=3).

  • ICAO WTC H (Heavy) or J (Super) is equivalent to ADS-B (TC=4, CA=5).

Decoding example

Let us use the following raw message as an example to demonstrate the decoding:

8D4840D6202CC371C32CE0576098

The ME field is:

HEX: 202CC371C32CE0
BIN: 00100000001011001100001101110001110000110010110011100000

The structure of the ME field can be decomposed as follows:

00100 000 001011 001100 001101 110001 110000 110010 110011 100000 

 TC   CA    11     12     13     49     48     50     51     32     
  4    0     K      L      M      1      0      2      3      _      

With TC=4, we can confirm it is an identification and category message. The decoded identity (callsign) of the aircraft is KLM1023 (with the trailing space ignored). With CA=0, we can see that the aircraft did not transmit any information on the wake vortex category.

Try it out Using pyModeS, we can decode the callsign as follows:

import pyModeS as pms

pms.adsb.category("8D4840D6202CC371C32CE0576098")
# Output: 0

pms.adsb.callsign("8D4840D6202CC371C32CE0576098")
# Output: KLM1023_

© Copyright 2021 Junzi Sun. Build with LaTeX, Pandoc, and GitHub