Antennas¶
The simulation module extends the core module’s antenna descriptions by modeling radio-frequency chains connected to antenna arrays and directive polarization / gain characteristics of individual antennna elements within the array.
Simulated antenna arrays are described by the SimulatedAntennaArray
class.
On the surface, this description contains a combination of a set of available SimulatedAntennaPorts
,
to which RfChains
feeding one or multiple SimulatedAntenna
elements are connected.
In a fully digitally controlled antenna array, each port feeds a single antenna element over a dedicated RF-chain:
%%{init: {"flowchart":{"useMaxWidth": false}}}%% flowchart LR porta[Antenna Port] --> rfa[RF-Chain] --> anta[Antenna] portb[Antenna Port] --> rfb[RF-Chain] --> antb[Antenna] x[⋮]:::invis ~~~ b[⋮]:::invis ~~~ c[⋮]:::invis portc[Antenna Port] --> rfc[RF-Chain] --> antc[Antenna] classDef invis fill-opacity:0,stroke-opacity:0,font-weight:bold; click porta "simulation.antennas.SimulatedAntennaPort.html" "Simulated Antenna Port" click portb "simulation.antennas.SimulatedAntennaPort.html" "Simulated Antenna Port" click portc "simulation.antennas.SimulatedAntennaPort.html" "Simulated Antenna Port" click rfa "simulation.rf_chain.html" "RF-Chain" click rfb "simulation.rf_chain.html" "RF-Chain" click rfc "simulation.rf_chain.html" "RF-Chain" click anta "simulation.antennas.SimulatedAntenna.html" "Simulated Antenna" click antb "simulation.antennas.SimulatedAntenna.html" "Simulated Antenna" click antc "simulation.antennas.SimulatedAntenna.html" "Simulated Antenna"
Manually defining an antenna array this way can be achieved by instantiating the SimulatedCustomArray
class
and individually adding the desired antenna elements, which will automatically be connected to a new RF-chain and antenna port:
1antennas = SimulatedCustomArray()
2for x in range(10):
3 antennas.add_antenna(SimulatedPatchAntenna(
4 pose=Transformation.From_Translation(np.array([.5*x*wavelength, 0, 0]))
5 ))
In this example, SimulatedPatchAntennas
are uniformly distributed
along the array’s x-axis, with a spacing of 0.5 wavelengths, effectively creating a uniform linear array.
The antenna elements are connected to a RfChain
, respectively.
Since this is a rather common antenna configuration, the shorthand SimulatedUniformArray
class
can be used to create the same antenna array:
1uniform_array = SimulatedUniformArray(SimulatedIdealAntenna, .5 * wavelength, [10, 1, 1])
In this case, instead of patch antennas, the array is populated with ideal isotropic antennas. When simulating analog or hybrid antenna arrays, a single RF-chain can feed multiple antenna elements.
%%{init: {"flowchart":{"useMaxWidth": false}}}%% flowchart LR porta[Antenna Port] --> rfa[RF-Chain] --> antaa[Antenna] & antab[⋮]:::invis & antac[Antenna] classDef invis fill-opacity:0,stroke-opacity:0,font-weight:bold; click porta "simulation.antennas.SimulatedAntennaPort.html" "Simulated Antenna Port" click rfa "simulation.rf_chain.html" "RF-Chain" click antaa "simulation.antennas.SimulatedAntenna.html" "Simulated Antenna" click antac "simulation.antennas.SimulatedAntenna.html" "Simulated Antenna"
This can be modeled by assigning multiple antenna elements to the same antenna port:
1hybrid_array = SimulatedCustomArray()
2for x in range(10):
3 port = SimulatedAntennaPort(
4 pose=Transformation.From_Translation(np.array([.5*x*wavelength, 0, 0]))
5 )
6 for y in range(5):
7 port.add_antenna(SimulatedPatchAntenna(
8 pose=Transformation.From_Translation(np.array([0, .5*y*wavelength, 0]))
9 ))
10 hybrid_array.add_port(port)
The snippet initializes a antenna array featuring 10 antenna ports, each feeding 5 antenna elements,
so that the array is populated with 50 antenna elements in total.
Within the context of a full simulation, antenna arrays are assigned as a configuration property
to SimulatedDevices
:
1simulation = Simulation()
2device = simulation.new_device()
3device.antennas = SimulatedUniformArray(SimulatedIdealAntenna, .5 * wavelength, [10, 1, 1])