Main Content

Aircraft-to-Satellite Communication for ADS-B Out

This example examines the Automatic Dependent Surveillance–Broadcast (ADS-B) Out connectivity of a flight from JFK International Airport in New York to L.F. Wade International Airport in Bermuda. The ADS-B Out system can connect to a variety of targets including airports and the Iridium NEXT satellite constellation. As a result, even while the aircraft does not have a direct line of sight with any ground station due to the Earth curvature over open water, the satellite ADS-B connection allows the aircraft to still provide continuous attitude, GPS position, and status to all other aircraft and airports interested in the aircraft state. The ADS-B system responds to the strongest ADS-B update initiator. The omnidirectional antennas on the top and bottom of the aircraft broadcast out to initiate the ADS-B update.

This example consists of three main parts:

  1. Create the scenario containing the aircraft, airports, and Iridium satellite network.

  2. Perform access analysis to determine when the aircraft has line-of-sight access with the airports or satellites within the Iridium network.

  3. Perform link closure analysis of the ADS-B Out system with the airports and the satellites.

This example uses:

  • Sensor Fusion and Tracking Toolbox™ geoTrajectory (Sensor Fusion and Tracking Toolbox) function to generate the aircraft trajectory.

  • (Optionally) You can also use the geoTrajectory (Radar Toolbox) function in Radar Toolbox.

  • Satellite Communications Toolbox satelliteScenario object to analyze and visualize the results for both the satellite, aircraft, and ground station.

  • (Optionally) You can also create satelliteScenario (Aerospace Toolbox) object using the Aerospace Toolbox.

  • Satellite Communications Toolbox link and linkIntervals functions to determine communications links.

  • (Optionally) Phased Array System Toolbox phased.CosineAntennaElement (Phased Array System Toolbox) functions to approximate the 48-beam antenna pattern of the Iridium satellite.

For more information on the Iridium NEXT satellite constellation and network, see

Construct the Scenario

Create a satellite scenario. Specify a start date and duration for the scenario. Choose the duration to equal to the flight time from New York to Bermuda, approximately six hours.

startTime = datetime(2020,5,5,0,0,0);
stopTime = startTime + hours(6);
sampleTime = 60;                                      %seconds
sc = satelliteScenario(startTime,stopTime,sampleTime);
viewer = satelliteScenarioViewer(sc);


Create the airports properties in the scenario.

airportName = ["JFK International (New York)";...
    "L.F. Wade International Airport (Bermuda)"];
airportLat = [40.6413;32.3634];
airportLon = [-73.7781;-64.7053];

Add the airports to the scenario using the groundStation function.

airports = groundStation(sc,airportLat,airportLon,Name=airportName);


Create a geoTrajectory (Sensor Fusion and Tracking Toolbox) starting and ending latitude/longitude/altitude (LLA) objects based on the airport locations and flying altitude of 10.6 km, which is typical of large commercial aircraft. The geoTrajectory function generates trajectories based on waypoints in geodetic coordinates. Set the flight time based on the scenario duration. Sample the trajectory every 30 seconds.

startLLA = [airportLat(1) airportLon(1) 10600];
endLLA = [airportLat(2) airportLon(2) 10600];
timeOfTravel = [0 seconds(sc.StopTime-sc.StartTime)];
sampleRate  = 1/30;

trajectory = geoTrajectory([startLLA;endLLA],timeOfTravel,...

Output the LLA waypoints of the trajectory and orientation of the aircraft at the sample rate of the scenario.

[positionLLA,orientation] = trajectory();

[aircraftPosition,aircraftOrientation] = lookupPose(trajectory,...

Generate a timetable for the aircraft position and orientation. Use the retime function to interpolate the position and orientation into the same time step as the scenario, every 60 seconds.

aircraftPositionTT = timetable(aircraftPosition,...
aircraftOrientationTT = timetable(compact(aircraftOrientation),...

aircraftPositionTT = retime(aircraftPositionTT,'regular','linear',TimeStep=seconds(sc.SampleTime));
aircraftOrientationTT = retime(aircraftOrientationTT,'regular','nearest',TimeStep=seconds(sc.SampleTime));

Note: You sample the aircraftOrientationTT to the nearest neighbor to avoid interpolation errors of the quaternion values.

Visualize the aircraft trajectory using geoplot.

lat = aircraftPositionTT.("Lat-Lon-Alt")(:,1);
lon = aircraftPositionTT.("Lat-Lon-Alt")(:,2);
geoplot(lat, lon, "b-")
geobasemap topographic;

Add the aircraft to the scenario using the satellite function. The satellite function approximates the aircraft as a satellite with the ephemeris specified by aircraftPositionTT and aircraftOrientationTT.

aircraft = satellite(sc,aircraftPositionTT, CoordinateFrame="geographic", Name="Aircraft");


The Iridium NEXT satellite network, launched between 2018 and 2019 [1], contains 66 active LEO satellites with:

  • Six orbital planes with an approximate inclination of 86.6 degrees and difference of RAAN of approximately 30 degrees between planes [1].

  • 11 satellites per orbital plane with an approximate difference in true anomaly of 32.7 degrees between satellites [1].

Add the active Iridium NEXT satellites to the scenario. Create the orbital elements for the satellites in the Iridium network and create the satellites using the satellite function.

numSatellitesPerOrbitalPlane = 11;
numOrbits = 6;

RAAN = [];
trueanomaly = [];

for i = 1:numOrbits
    for j = 1:numSatellitesPerOrbitalPlane 
        RAAN(end+1) = 180*(i-1)/numOrbits; %#ok<SAGROW>
        if mod(i,2)
            trueanomaly(end+1) = 360*(j-1)/numSatellitesPerOrbitalPlane; %#ok<SAGROW>
            % Satellites offset in alternating orbits
            trueanomaly(end+1) = 360*(j-1 + 0.5)/numSatellitesPerOrbitalPlane; %#ok<SAGROW> 

semimajoraxis = repmat((6371 + 780)*1e3,size(RAAN)); % kms
inclination = repmat(86.4,size(RAAN)); % degrees
eccentricity = zeros(size(RAAN)); % degrees
argofperiapsis = zeros(size(RAAN)); % degrees

iridiumSatellites = satellite(sc,semimajoraxis,eccentricity,inclination,RAAN,argofperiapsis,trueanomaly,Name="Iridium " + string(1:66)');

If you have a license for Aerospace Toolbox, you can also create the Iridium constellation using the walkerStar (Aerospace Toolbox) function.

Since many satellites share common orbital planes, display the orbital path of only the first satellite in each plane.


Add conical sensors to the Iridium satellites to act as a camera to establish visual access between the satellites and the aircraft.

iridiumConicalSensors = conicalSensor(iridiumSatellites,"MaxViewAngle",125);

Aircraft Access Analysis

Determine access analysis between the aircraft, airports, and satellites using the scenario. Calculate the access interval between the aircraft and airports using the access and accessIntervals functions based on when the aircraft has line-of-sight access to the airport. JFK and L.F. Wade airports can see the aircraft during the first and last two hours of the flight, respectively. Otherwise the aircraft is blocked by the curvature of the Earth.

acAirport = access(aircraft,sc.GroundStations);
airportAccessIntvls = accessIntervals(acAirport)
airportAccessIntvls=2×8 table
      Source                        Target                       IntervalNumber         StartTime                EndTime           Duration    StartOrbit    EndOrbit
    __________    ___________________________________________    ______________    ____________________    ____________________    ________    __________    ________

    "Aircraft"    "JFK International (New York)"                       1           05-May-2020 00:00:00    05-May-2020 01:49:00      6540         NaN          NaN   
    "Aircraft"    "L.F. Wade International Airport (Bermuda)"          1           05-May-2020 04:14:00    05-May-2020 06:00:00      6360         NaN          NaN   

Calculate a similar access analysis between the aircraft and the satellites based on the visibility of the aircraft within the conical sensors' field of view. This serves as a first-round approximation of the Iridium multibeam antenna shown in the next section.

acSatellite = access(aircraft,iridiumConicalSensors);
satelliteAccessIntvls = accessIntervals(acSatellite);

[sSatellite,time] = accessStatus(acSatellite); 
satVisPlotData = double(sSatellite);
satVisPlotData(satVisPlotData == false) = NaN; % Hide invisible satellites.
satVisPlotData = satVisPlotData + (0:numel(iridiumSatellites)-1)'; % Add space to satellites to be stacked.

plot(time,satVisPlotData," .",Color="blue")
title("Satellite Visibility")
grid on
axis tight

The access intervals computation shows that the aircraft has continuous satellite communication access with the Iridium network when the aircraft is over the open ocean. Combined with the airport access, the aircraft has continuous line-of-sight access throughout the flight.

Aircraft Link Analysis

After establishing that the aircraft maintains a direct connection with either airports and the Iridium network throughout the entire flight, generate a link budget for the respective ground and satellite-based ADS-B Out systems. The ADS-B Out system uses the existing Mode A/C and S transponder antennas located on the top and bottom of the aircraft, respectively. ADS-B uses the Mode S of the transponder and operates the ADS-B Out on a frequency of 1090 MHz with a minimum effective isotropic radiated power (EIRP) of 125 Watts.

fADSB = 1090e6; % 1090 MHz

For this example, model the pair of Mode-S transponders as a single isotropic transmitter at the center of the aircraft.

aircraftADSBAntenna = arrayConfig("Size",[1 1]); % Create an isotropic antenna element

aircraftADSBTransmitter = transmitter(aircraft, ...
    Antenna = aircraftADSBAntenna, ...
    Frequency = fADSB,...
    Power=10*log10(125),...     % ADS-B Out minimum as EIRP of 125 Watts
    MountingAngles = [0;0;0],... % In degrees
    Name="ADS-B Aircraft Transmitter");

Aircraft to Airport ADS-B Out Link

Add isotropic antennas and receivers to the airports.

% Airport Antenna 
airportADSBAntenna = arrayConfig("Size",[1 1]); % Create an isotropic antenna element
airportADSBReceiver = receiver(...
    airports, ...
    Antenna=airportADSBAntenna, ...    
    Name=airports.Name + " Receiver");

Aircraft to Satellite ADS-B Out Link

Using only Satellite Communication Toolbox, you can model the antenna on the Iridium satellite as an isotropic antenna. If you have a license for Phased Array Toolbox, you can model an approximation of the custom 48-beam antenna used by the Iridium NEXT satellites [2]. Use this dropdown to select the antenna to model.

antennaType = "Isotropic";

Simulate Iridium Satellites Link with Isotropic Antennas

Create and add an isotropic antenna receiver to the Iridium satellites.

if antennaType == "Isotropic"

    % Create and add an isotropic antenna receiver to the Iridium satellites.
    satelliteADSBAntenna = arrayConfig("Size",[1 1]); % Add code comment    
    satelliteADSBReceiver = receiver(iridiumSatellites, ...
        Antenna=satelliteADSBAntenna, ...
        MountingAngles=[0,0,0], ...
        Name=iridiumSatellites.Name + " Receiver");

    % Play the scenario.

Simulate Iridium Satellites Link with Custom 48-Beam Antenna

Create and add a custom antenna element receiver to the Iridium satellites using the HelperCustom48BeamAntenna convenience function.

Note: The mounting angle matches the default frames of Phased Array System Toolbox and the Satellite Communications Toolbox.

if antennaType == "Custom 48-Beam"

    % Use Custom Antenna Element on 48-spot beam    
    satelliteADSBAntenna = HelperCustom48BeamAntenna(fADSB);
    satelliteADSBReceiver = receiver(iridiumSatellites, ...
        Antenna=satelliteADSBAntenna, ...
        MountingAngles=[0,-90,0], ...
        Name=iridiumSatellites.Name + " Receiver");

    % Play the scenario.

ADS-B Out Link Closure Times

Add ADS-B Out link analysis from the aircraft to airports and satellites.

lnkADSB = link(aircraftADSBTransmitter, [airportADSBReceiver, satelliteADSBReceiver]);

Plot the maximum margin for the link to any of the available receivers. The margin is the received Eb/No minus the required Eb/No for that receiver.

[eL,time] = ebno(lnkADSB);
marginADSB = eL - repmat([airportADSBReceiver.RequiredEbNo,satelliteADSBReceiver.RequiredEbNo]',[1,size(eL,2)]);
ylabel("Margin (dB)");
title("ADS-B Out Link Margin vs. Time");


[1] Attachment EngineeringStatement SAT-MOD-20131227-00148. Accessed 17 Jan. 2023.

[2] Attachment Exhibit A SAT-MOD-20131227-00148. Accessed 17 Jan. 2023.