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:
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.
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])