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 |
---|
The functionality described in this topic requires a license for the Communications Library. |
EarthCentralBody earth = CentralBodiesFacet.getFromContext().getEarth(); JulianDate epoch = new GregorianDate(2017, 2, 10, 17, 0, 0.0).toJulianDate(); 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. 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); }