Click or drag to resize

Wireless Propagation

When computing Access in STK Components, links are used to identify the connection between two objects which are communicating with each other in a certain way. One link may represent a spacecraft using optics to observe a target on the ground. Another link may represent the ability of a ground station to track a launch effectively. In the Communications Library, the primary use is to represent a wireless RF signal, given certain physical effects which degrade its fidelity.

Note Note

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

Wireless Links

There are two kinds of links provided with STK Components: LinkInstantaneous, which models instantaneous communication along the link, and LinkSpeedOfLight, which models the time delay of light traveling along the link. The WirelessLinkExtension takes this time delay into account when evaluating signal propagation. Specifically, when a receiving antenna asks a communication link for its signals, the signals will be transmitted at a time prior to reception as determined by the link. The extension also applies the effects of SignalPropagationModels to the signal before reaching the receiver. Here is a list of some of the models which affect wireless signals, including many based on standards from the International Telecommunication Union (ITU):

Once all the links are configured, they should then be added to a SignalPropagationGraph. This keeps track of which transmitters are relevant to which receivers in order to define how signals are propagated from one platform to another. The SignalPropagationGraph is then used to create SignalEvaluators, as well as constraints and figures of merit. One benefit of the SignalPropagationGraph type is that it allows the user to set up multiple communication scenarios with different transmitters and link paths within the same EvaluatorGroup.

The SignalPropagationGraph plays an important role in informing the receivers which signals to process. The following figure illustrates a SignalPropagationGraph with multiple transmitters and interference.

Example Signal Propagation Graph

There are four intended transmitters, two receivers, and five transmitters which act solely as interference. When the library asks Receiver 2 to output signals, the receiver asks the SignalPropagationGraph for all the links (shown in green) coming into the receiver. At this stage, there is no distinction made between "intended" and "interfering" signals. Moreover, when Transmitter 4 acts as a transponder for Receiver 1, Receiver 1 asks the SignalPropagationGraph for all the links shown in blue. Unless any of those signals are eliminated by a filter between Receiver 1 and Transmitter 4, Transmitter 4 will retransmit the interference along with the intended signals. Ultimately, an IntendedSignalStrategy is needed to distinguish the intended signal. When the signal originating at Transmitter 1 is identified as the intended signal, the signals from Transmitter 2 and Transmitter 3 will be treated as interference. Likewise, when Transmitter 2 creates the intended signal, Transmitter 1 and Transmitter 3 are treated as interference.

Code Sample
Java
SignalPropagationGraph signalPropagation = new SignalPropagationGraph();

WirelessLinkExtension downlinkExtension = new WirelessLinkExtension();
// Add Propagation Models
// Note that the propagation models are applied in order.
// So, if a model is to be computed before doppler and/or freespace loss,
// make sure it is in the correct place in the list.
downlinkExtension.getPropagationModels().add(0, new AtmosphericAttenuationModelItuRP676(ItuRP676Version.VERSION5));
downlinkExtension.getPropagationModels().add(new RainAttenuationModelItuRP618(ItuRP618RainAttenVersion.VERSION9));
LinkSpeedOfLight downlink = new LinkSpeedOfLight(downlinkXmtr, rcvrPhiladelphia, earth.getInertialFrame());
downlink.getExtensions().add(downlinkExtension);
// The link doesn't propagate a signal through the Earth
downlink.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(downlink, earth)));
signalPropagation.addLink(downlink);

// Add the uplinks
LinkSpeedOfLight uplinkOne = new LinkSpeedOfLight(transmitterOne, uplinkRcvr, earth.getInertialFrame());
// Reuse the list of propagation models
WirelessLinkExtension wirelessExtension = new WirelessLinkExtension(downlinkExtension.getPropagationModels());
uplinkOne.getExtensions().add(wirelessExtension);
uplinkOne.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(uplinkOne, earth)));
signalPropagation.addLink(uplinkOne);
LinkSpeedOfLight uplinkTwo = new LinkSpeedOfLight(transmitterTwo, uplinkRcvr, earth.getInertialFrame());
// Reuse the list of propagation models
wirelessExtension = new WirelessLinkExtension(downlinkExtension.getPropagationModels());
uplinkTwo.getExtensions().add(wirelessExtension);
uplinkTwo.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(uplinkTwo, earth)));
signalPropagation.addLink(uplinkTwo);
LinkSpeedOfLight uplinkThree = new LinkSpeedOfLight(transmitterThree, uplinkRcvr, earth.getInertialFrame());
// Reuse the list of propagation models
wirelessExtension = new WirelessLinkExtension(downlinkExtension.getPropagationModels());
uplinkThree.getExtensions().add(wirelessExtension);
uplinkThree.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(uplinkThree, earth)));
signalPropagation.addLink(uplinkThree);

// Add the uplink interferers
for (Platform interferer : uplinkInterferers) {
    LinkSpeedOfLight link = new LinkSpeedOfLight(interferer, uplinkRcvr, earth.getInertialFrame());
    // just use free space loss and doppler shift by default
    wirelessExtension = new WirelessLinkExtension();
    link.getExtensions().add(wirelessExtension);
    link.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(link, earth)));
    signalPropagation.addLink(link);
}

// Add the downlink interferers
for (Platform interferer : downlinkInterferers) {
    LinkSpeedOfLight link = new LinkSpeedOfLight(interferer, rcvrPhiladelphia, earth.getInertialFrame());
    // just use free space loss and doppler shift by default
    wirelessExtension = new WirelessLinkExtension();
    link.getExtensions().add(wirelessExtension);
    link.getExtensions().add(new AccessConstraintsExtension(new CentralBodyObstructionConstraint(link, earth)));
    signalPropagation.addLink(link);
}
IntendedSignalStrategy intendedSignalIdentifier = new IntendedSignalByModulation<>(new TypeLiteral<ModulationQpsk>() {}, frequencyForDownlink);
// Use the propagation graph and the intended signal strategy to compute parameters at the receiver
ScalarCarrierToNoise carrierToNoise = new ScalarCarrierToNoise(rcvrPhiladelphia, signalPropagation, intendedSignalIdentifier);
// To evaluate parameters at the receiver, apply a delay to scalars which occur at different points
// along the signal propagation path.
Scalar effectiveIsotropicRadiatedPower = new ScalarDelayedByLink(
        new ScalarEffectiveIsotropicRadiatedPower(downlink, signalPropagation, intendedSignalIdentifier),
        downlink, LinkRole.RECEIVER);
// Create evaluators
EvaluatorGroup group = new EvaluatorGroup();
ScalarEvaluator cnrEvaluator = carrierToNoise.getEvaluator(group);
ScalarEvaluator eirpEvaluator = effectiveIsotropicRadiatedPower.getEvaluator(group);
group.optimizeEvaluators();