Click or drag to resize

Navigation Communications

The Navigation Advanced Library contains objects that provide communications capabilities for the GPS constellation. Navigation accuracy modeling is enhanced with the addition of communications links between GPS satellites and receivers. This new capability constrains visibility further and allows for navigation modeling in electronically threatened environments.

Note Note

The functionality described in this topic requires a license for the Navigation Accuracy Library and the Communications Library.

GPS Communications Front End

GPS communications are modeled on a GPS satellite block basis; different blocks of GPS satellites transmit different signal types with differing power levels. Both a GPS L1 transmitter antenna gain pattern and a Fixed Radiation Pattern Antenna (FRPA) for GPS receivers are provided. Additional antenna patterns can also be used if desired. GPS Receivers implement this new behavior by adding a GpsCommunicationsFrontEnd object to the receiver's Antenna (get / set) property. This class implements GPS receiver communications constraints and behaviors for navigation accuracy calculations, including:

  • C/N0 tracking

  • Multiple receiver channels

  • C/A to P(Y) handover

  • GPS specific link budgets

  • Interference and jamming

  • Noise

  • Power spectral density

  • Modern signal architectures

GpsCommunicationsFrontEnd is a Platform, and provides the location and orientation information that the GpsReceiver requires. It is used with a GpsReceiver just as you would with another platform defining the antenna; the front end is assigned to the Antenna (get / set) property of the GpsReceiver once created.

The GpsCommunicationsFrontEnd, once defined, creates NavigationReceiverChannels for each satellite in the provided constellation. Each of these NavigationReceiverChannels contains a set of NavigationSignals which it attempts to track by looking for access to similarly broadcast signals from a single GPS satellite. Communication access is then determined by whether the satellite is broadcasting the appropriate signal and if the signal's C/N0 value is above the specified threshold when received by the front end. The front end currently only supports tracking via C/N0 constraints. Additional non-communications constraints are also taken into account when added to the GpsReceiver.SatelliteConstraints (get) or GpsReceiver.ReceiverConstraints (get) collections. In no case will more satellites be reported as tracked than the specified number of channels in the GpsReceiver.

The front end can be constructed in three ways. You can use the default constructor, setting the properties yourself, or you can specify a typical GpsSignalConfiguration, or supply a NavigationSignalCollection containing the signals you want each channel to track. When you specify your own NavigationSignalCollection, you must decide which signals are primary vs. secondary, and whether you want to allow direct acquisition or handover acquisition. With handover acquisition, you specify a signal that starts the tracking process, then specify a signal (or set of signals) that maintains track. When you use a specific GpsSignalConfiguration, the following defaults are used:

  • Direct Acquisition

    • Single Frequency

      • Signal priority: Primary

      • C/N0 threshold: 35 dB/Hz

      • Tracking type: Maintaining

    • Dual Frequency

      • Signal priority: Primary

        • C/N0 threshold: 35 dB/Hz

        • Tracking type: Maintaining

      • Signal priority: Secondary

        • C/N0 threshold: 35 dB/Hz

        • Tracking type: Maintaining

  • Handover Acquisition

    • Dual Frequency

      • Signal priority: Primary

        • C/N0 threshold: 35 dB/Hz

        • Tracking type: Starting

      • Signal priority: Primary

        • C/N0 threshold: 30 dB/Hz

        • Tracking type: Maintaining

      • Signal priority: Secondary

        • C/N0 threshold: 30 dB/Hz

        • Tracking type: Maintaining

The handover logic uses an internally built access query to define the handover transition. A start query and a maintain query are defined. The start query must be satisfied before the maintain query is tested. When the start and maintain queries are satisfied at some time, the receiver will maintain lock, even if later the start query fails. Note that the handover configuration requires that the front end's Epoch (get / set) property be set. Setting this to the start of the evaluation interval for your analysis is fine.

If more than one signal is expected to be tracked (as in dual frequency receivers), all signals must be above their threshold or track is lost. In the handover case, this means that the two signals expected to maintain track must be above the threshold. If the maintaining signal(s) lose track, the starting signal will try to track again.

It's important to note that if you modify the properties of the GpsCommunicationsFrontEnd after construction, the front end will be reconstructed internally. So, if you have obtained the set of NavigationReceiverChannels, for example, from the front end, then modify any of the front end's properties, the NavigationReceiverChannels you have obtained will be out of sync with the current state of the front end, and should be re-obtained.


There are many parameters on the front end, including engineering level tracking parameters, antennas and gain parameters to mention a few. Using any constructor for the GpsCommunicationsFrontEnd, these properties are all set to typical defaults, but are able to be set individually as well. The defaults used are listed here for each property:

Creating a GPS Communications Front End

First, create a navigation constellation that has GPS transmitters on it. You can use the GpsCommunicationsConstellation.create method to create a constellation of GPS satellites that have the appropriate navigation signal transmitters on them. Use a SemAlmanac and the GPSData.txt file from the same day. The GPSData.txt file describes which block each satellite is assigned to and can be downloaded from the AGI FTP site at: This file is updated daily. This information is used by the library to determine the proper signals to transmit and to apply appropriate power levels for each signal. Alternatively, you can create your own constellation that uses your defined navigation signal transmitters. To do this, add a NavigationTransmitterExtension to each satellite in your constellation, and then add each satellite to a PlatformCollection.

SemAlmanac Almanac = SemAlmanac.readFrom(almanacFileName, 1);
GPSSatellitesWithTransmitters = GpsCommunicationsConstellation.create(Almanac, gpsDataFileName);

Then, decide which type of receiver configuration you want to model. Currently, the library supports the following types:

  • Single Frequency L1 CA code

  • Single Frequency L1 M code

  • Single Frequency L1 P(Y) (direct acquisition)

  • Dual Frequency L1 C/A code, L2 C code

  • Dual Frequency L1 C/A code, L5 IQ code

  • Dual Frequency L2 C code, L5 IQ code

  • Dual Frequency L1 P(Y) code, L2 P(Y) code (direct acquisition)

  • Dual Frequency L1 C/A code, then L1 P(Y) code and L2 P(Y) code after handover.

  • Dual Frequency L1 M code, L2 M code

For the dual frequency configurations, the first signal listed is considered the primary signal for a given receiver channel.

Next, define the location and orientation of the antenna.

Finally, create the new GpsCommunicationsFrontEnd.

location = getSomeLocation();
orientation = getSomeOrientation();
GpsSignalConfiguration signalConfiguration = GpsSignalConfiguration.SINGLE_FREQUENCY_L1CA;
GpsCommunicationsFrontEnd frontEnd = new GpsCommunicationsFrontEnd(GPSSatellitesWithTransmitters, signalConfiguration, location, orientation);

Alternatively, using a different constructor you can supply a NavigationSignalCollection containing the signals for the receiver to track on each channel.

location = getSomeLocation();
orientation = getSomeOrientation();
NavigationSignalCollection signals = new NavigationSignalCollection();
signals.add(new NavigationSignal(NavigationSignalType.GPSL1CA, NavigationSignalPriority.PRIMARY, NavigationSignalTrackingType.STARTING, 0, 35.0));
signals.add(new NavigationSignal(NavigationSignalType.GPSL1PY, NavigationSignalPriority.PRIMARY, NavigationSignalTrackingType.MAINTAINING, 0, 30.0));
signals.add(new NavigationSignal(NavigationSignalType.GPSL2M, NavigationSignalPriority.SECONDARY, NavigationSignalTrackingType.MAINTAINING, 0, 30.0));
ArrayList<SignalPropagationModel> models = new ArrayList<>();
models.add(new FreeSpacePathLossModel());
models.add(new DopplerShiftModel());
models.add(new AtmosphericAttenuationModelItuRP676());
frontEnd = new GpsCommunicationsFrontEnd(GPSSatellitesWithTransmitters, signals, models, location, orientation);

Interference sources can be added to the front end by adding them to the InterferingSources (get) property. Typically interference sources are instances of simple or complex, digital or analog transmitters. Each GPS satellite can also technically be an interference source to other receiver channels not receiving signals from that satellite. You can model this small effect by setting the IncludeGpsSignalsAsInterferers (get / set) property to true. Note that calculation times will increase when this is enabled.

To add a GPS Interference source, create a transmitter, then add it to the GpsCommunicationsFrontEnd.

// Jammer location - 10 km directly above the receiver
PointFixedOffset jammerLocation = new PointFixedOffset(frontEnd.getReferenceFrame(), new Cartesian(0D, 0D, 10000D));
AxesEastNorthUp jammerOrientation = new AxesEastNorthUp(CentralBodiesFacet.getFromContext().getEarth(), jammerLocation);
// Jammer Polarization
ConstantPolarizationSource jammerPolarization = new ConstantPolarizationSource(new RightHandCircularPolarization());
SimpleAnalogTransmitter jammer = new SimpleAnalogTransmitter("L1Jammer", jammerLocation, jammerOrientation, 1575.42e6, 1.0, 1.023e6, jammerPolarization);
// 1 watt, narrow band jammer centered at the L1 frequency.

Then, set the front end as the Antenna (get / set) property of the GpsReceiver and get evaluators from your receiver, just as you would normally. The difference is that now GPS communications constraints are taken into account as well for satellite accessibility.

GpsReceiver receiver = getSomeGpsReceiver();
Link Budgets

Link budget analysis can be performed using the front end. You can obtain a GnssLinkBudgetScalarsCollection from the front end by calling the getAllLinkBudgets or getSatelliteLinkBudgets methods. The getSatelliteLinkBudgets method will return a collection of link budgets for all the signals from just the navigation satellite specified by the satelliteID. The getAllLinkBudgets method returns a collection of link budgets for all signals on all navigation satellites.

Using the findFirst or findAll methods on the GnssLinkBudgetScalarsCollection, you can look for a particular satellite in the collection by PRN number or by NavigationSignalType, and get one or more GnssLinkBudgetScalars for that criteria.

GnssLinkBudgetScalarsCollection allLinkBudgets = frontEnd.getAllLinkBudgets(receiver);
GnssLinkBudgetScalarsCollection PRN1LinkBudgets = frontEnd.getSatelliteLinkBudgets(receiver, 1);
GnssLinkBudgetScalars Prn1L2MLinkBudget = PRN1LinkBudgets.findFirst(NavigationSignalType.GPSL2M);

Then, obtain the desired link budget scalar type and evaluate it over your duration of interest.

ScalarEvaluator CToN0Evaluator = Prn1L2MLinkBudget.getCarrierToNoiseDensityPlusInterference().getEvaluator();
double CToN0 = CToN0Evaluator.evaluate(EvaluationTime);