Click or drag to resize

Phased Array Antenna Code Sample

The following is an example of how to configure and use a phased array receiver for steering a null in the direction of jamming interference.

Note Note

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

Java
EarthCentralBody earth = CentralBodiesFacet.getFromContext().getEarth();
JulianDate epoch = new JulianDate(new GregorianDate(2017, 2, 10, 17, 0, 0.0));
Vector alignmentReferenceVector = new VectorFixed(earth.getInertialFrame().getAxes(), new Cartesian(1.0, 0.0, 0.0));

JulianDate analysisStartTime = epoch;
JulianDate analysisStopTime = analysisStartTime.addSeconds(840.0);

double aircraftAltitude = 11e3;
double frequency = 14.5e9;
double transmitPower = 1000.0;
double dataRate = 1.0e6;
double jammerPower = 10000.0;

//Construct the receiver's Point and Axes
PointCartographic receiverPoint = new PointCartographic(earth, new Cartographic(Trig.degreesToRadians(-75.5966), Trig.degreesToRadians(40.038), 0.0));
AxesEastNorthUp receiverAxes = new AxesEastNorthUp(earth, receiverPoint);

//Define the waypoints for the transmitter's WaypointPropagator
ArrayList<JulianDate> waypointTimes = new ArrayList<>();
waypointTimes.add(analysisStartTime);
waypointTimes.add(analysisStopTime);

ArrayList<Cartographic> waypointLocations = new ArrayList<>();
waypointLocations.add(new Cartographic(Trig.degreesToRadians(-76.37869961), Trig.degreesToRadians(40.04153207), aircraftAltitude));
waypointLocations.add(new Cartographic(Trig.degreesToRadians(-74.67085047), Trig.degreesToRadians(40.03188320), aircraftAltitude));

//Construct the transmitter's Point and Axes
WaypointPropagator transmitterPropagator = WaypointPropagator.constructConstantVelocityWaypointPropagator(earth, waypointTimes, waypointLocations);
PropagatorPoint transmitterPoint = transmitterPropagator.createPoint();
VectorTrueDisplacement transmitterToReceiver = new VectorTrueDisplacement(transmitterPoint, receiverPoint);

//Transmitter axes is targeted to the receiver location using the AxesAlignedConstrained type.
AxesAlignedConstrained transmitterAxes = new AxesAlignedConstrained(transmitterToReceiver, AxisIndicator.THIRD, alignmentReferenceVector, AxisIndicator.FIRST);

//Construct the transmitter as a ComplexDigitalTransmitter with a Parabolic antenna gain pattern.
ComplexDigitalTransmitter transmitter = new ComplexDigitalTransmitter("DesiredTransmitter", transmitterPoint, transmitterAxes, new ModulationBpsk(),
        new ParabolicGainPattern(1.0, 0.75, 0.001), frequency, transmitPower, dataRate, null);

//Define the waypoints for the jamming transmitter's WaypointPropagator
waypointLocations = new ArrayList<>();
waypointLocations.add(new Cartographic(Trig.degreesToRadians(-75.57784380), Trig.degreesToRadians(40.73625037), aircraftAltitude));
waypointLocations.add(new Cartographic(Trig.degreesToRadians(-75.59714152), Trig.degreesToRadians(39.24067626), aircraftAltitude));

//Construct the jamming transmitter's Point and Axes
WaypointPropagator jammerPropagator = WaypointPropagator.constructConstantVelocityWaypointPropagator(earth, waypointTimes, waypointLocations);
PropagatorPoint jammerPoint = jammerPropagator.createPoint();
VectorTrueDisplacement jammerToReceiver = new VectorTrueDisplacement(jammerPoint, receiverPoint);

//Jamming transmitter's axes is targeted to the receiver location using the AxesAlignedConstrained type.
AxesAlignedConstrained jammerAxes = new AxesAlignedConstrained(jammerToReceiver, AxisIndicator.THIRD, alignmentReferenceVector, AxisIndicator.FIRST);

//Construct the jamming transmitter as a ComplexDigitalTransmitter with same configuration as the desired transmitter.
ComplexDigitalTransmitter jammer = new ComplexDigitalTransmitter("Jammer", jammerPoint, jammerAxes, new ModulationBpsk(), new ParabolicGainPattern(1.0, 0.75,
        0.001), frequency, jammerPower, dataRate, null);

//Construct the receiver's PhasedArrayGainPattern and initialize with the 9 array elements.
PhasedArrayGainPattern phasedArray = new PhasedArrayGainPattern();
phasedArray.getElementPattern().add(new PhasedArrayElement(-0.5, -0.5));
phasedArray.getElementPattern().add(new PhasedArrayElement(-0.5, 0.0));
phasedArray.getElementPattern().add(new PhasedArrayElement(-0.5, 0.5));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.0, -0.5));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.0, 0.0));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.0, 0.5));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.5, -0.5));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.5, 0.0));
phasedArray.getElementPattern().add(new PhasedArrayElement(0.5, 0.5));
phasedArray.setDesignFrequency(frequency);
phasedArray.setElementFactor(new CosineExponentElementFactor(1.0, 0.25));

//Construct the receiver's front end filter.
RectangularFilter filter = new RectangularFilter();
filter.setFrequency(frequency);
filter.setLowerBandwidthLimit(-1.0e6);
filter.setUpperBandwidthLimit(1.0e6);

//Construct the receiver's front end amplifier
ConstantGainAmplifier amplifier = new ConstantGainAmplifier();
amplifier.setGain(1000.0);

//Construct the receiver as a ComplexReceiver type.
ComplexReceiver receiver = new ComplexReceiver("Receiver", receiverPoint, receiverAxes, amplifier, phasedArray);
receiver.setFilter(filter);

//Construct the desired link and jamming link and add the WirelessLinkExtension to enable communications modeling.
LinkInstantaneous desiredLink = new LinkInstantaneous(transmitter, receiver);
desiredLink.getExtensions().add(new WirelessLinkExtension());

LinkInstantaneous jammerLink = new LinkInstantaneous(jammer, receiver);
jammerLink.getExtensions().add(new WirelessLinkExtension());

//Construct the SignalPropagationGraph and add the desired and jamming links.
agi.foundation.communications.SignalPropagationGraph graph = new SignalPropagationGraph();
graph.addLink(desiredLink);
graph.addLink(jammerLink);

//Construct the intended signal strategy as an IntendedSingalByTransmitter with the desired transmitter instance.
IntendedSignalByTransmitter intendedSignalStrategy = new IntendedSignalByTransmitter(transmitter);

//Construct the MVDR beamformer and assign to the phased array instance.
MinimumVarianceDistortionlessResponseBeamformer mvdrBeamformer = new MinimumVarianceDistortionlessResponseBeamformer();
phasedArray.setBeamformer(mvdrBeamformer);

//Construct a new instance of the LinkDirectionsProvider and add the desired link to the provider's list of links.
LinkDirectionsProvider linkDirectionsProvider = new LinkDirectionsProvider();
linkDirectionsProvider.getLinks().add(desiredLink);
linkDirectionsProvider.setTimeObserver(receiver);
mvdrBeamformer.setBeamDirectionsProvider(linkDirectionsProvider);

//Construct an instance of the ScalarCarrierToNoisePlusInterference communications scalar in order to compute C/(N+I) for the case where there is no null steering (for comparison purposes).
ScalarCarrierToNoisePlusInterference carrierToNoisePlusInterferenceNoNullSteeringScalar = new ScalarCarrierToNoisePlusInterference(receiver, graph,
        intendedSignalStrategy);
ScalarEvaluator carrierToNoisePlusInterferenceNoNullSteeringEvaluator = carrierToNoisePlusInterferenceNoNullSteeringScalar.getEvaluator();

//Add the constant weight link extension. This determines the weight assigned to this jammer when forming the corresponding null.
jammerLink.getExtensions().add(new ScalarWeightLinkExtension(10000.0));

//Construct a new instance of the LinkDirectionsProvider and add the jammer link to the provider's list of links.
linkDirectionsProvider = new LinkDirectionsProvider();
linkDirectionsProvider.getLinks().add(jammerLink);
linkDirectionsProvider.setTimeObserver(receiver);
mvdrBeamformer.setNullDirectionsProvider(linkDirectionsProvider);

//Construct an instance of the ScalarCarrierToNoisePlusInterference communications scalar in order to compute C/(N+I) for the case where we are nulling the jammer transmitter.
ScalarCarrierToNoisePlusInterference carrierToNoisePlusInterferenceNullSteeringScalar = new ScalarCarrierToNoisePlusInterference(receiver, graph, intendedSignalStrategy);
ScalarEvaluator carrierToNoisePlusInterferenceNullSteeringEvaluator = carrierToNoisePlusInterferenceNullSteeringScalar.getEvaluator();

ArrayList<Double> cOverNPlusINullSteeringValues = new ArrayList<>();
ArrayList<Double> cOverNPlusINoNullSteeringValues = new ArrayList<>();
ArrayList<Double> difference = new ArrayList<>();

//Compute the C/(N+I) values over the desired analysis interval and compare.
double stepSize = 60.0;
JulianDate computeTime = analysisStartTime;
while (JulianDate.lessThan(computeTime, analysisStopTime)) {

    double cOverNPlusINullSteering = CommunicationAnalysis.toDecibels(carrierToNoisePlusInterferenceNullSteeringEvaluator.evaluate(computeTime));
    cOverNPlusINullSteeringValues.add(cOverNPlusINullSteering);

    double cOverNPlusINoNullSteering = CommunicationAnalysis.toDecibels(carrierToNoisePlusInterferenceNoNullSteeringEvaluator.evaluate(computeTime));
    cOverNPlusINoNullSteeringValues.add(cOverNPlusINoNullSteering);

    difference.add(Math.abs(cOverNPlusINullSteering - cOverNPlusINoNullSteering));
    computeTime = computeTime.addSeconds(stepSize);
}