Beamforming

lyceanem.electromagnetics.beamforming.EGCWeights(Etheta, Ephi, command_angles, polarization_switch='Etheta', az_range=array([-180., -160., -140., -120., -100., -80., -60., -40., -20., 0., 20., 40., 60., 80., 100., 120., 140., 160., 180.]), elev_range=array([-90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.]))[source]

calculate the equal gain combining weights for a given set of element coordinates, wavelength, and command angles (az,elev)

lyceanem.electromagnetics.beamforming.MaximumDirectivityMap(Etheta, Ephi, source_coords, wavelength, az_range=array([-180., -160., -140., -120., -100., -80., -60., -40., -20., 0., 20., 40., 60., 80., 100., 120., 140., 160., 180.]), elev_range=array([-90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.]), az_index=None, elev_index=None, forming='Total', total_solid_angle=12.566370614359172, phase_resolution=24)[source]

Uses wavefront beamsteering, and equal gain combining algorithms to steer the antenna array to each possible command angle in the farfield, mapping out the maximum achieved directivity at the command angle for each command angle set.

Parameters:
  • Etheta (3D numpy array) – The Etheta polarisation farfield patterns, arranged in terms of the number of elements, azimuth resolution, and elevation resolution

  • Ephi (3D numpy array) – The Ephi polarisation farfield patterns, arranged in terms of the number of elements, azimuth resolution, and elevation resolution

  • source_coords (open3d.geometry.PointCloud) – The source coordinates of each element, corresponding to the order of element patterns in Etheta and Ephi. Units should be m

  • wavelength (float) – The wavelength of interest

  • az_range (1D numpy array of float) – The azimuth values for the farfield mesh, arranged from smallest to largest

  • elev_range (1D numpy array of float) – The elevation values for the farfield mesh, arranged from smallest to largest

  • az_index (1D array of int) – optional parameter, can be specified as an index of the azimuth values of interest via indexing, defaults to [None], which ensures all values are covered

  • elev_index (1D array of int) – optional parameter, can be specified as an index of the elevation values of interest via indexing, defaults to [None], which ensures all values are covered

  • forming (str) – Which polarisation should be beamformed, the default is [Total], beamforming the total directivity pattern, avoiding issues with elements which have a strongly $Etheta$ or $Ephi$ pattern. This can also be set to [Etheta] or [Ephi]

  • total_solid_angle (float) – the total solid angle covered by the farfield patterns, this defaults to $4pi$ for a full spherical pattern

  • phase_resolution (int) – the desired phase resolution of the beamforming architecture in bits. Default is [24], which means no practical truncation will occur. If beam mapping at a single resolution is required, then this can be set between 2 and 24. If multiple values are required, it may be more efficient to use lyceanem.electromagnetics.beamforming.MaximumDirectivityMapDiscrete(), which allows a 1D array of resolutions to be supplied, and produces a maximum directivity map for each.

Returns:

directivity_map – The achieved maximum directivity map. At each point the directivity corresponds to the achieved directivity at that command angle. Arranged as elev axis, azimuth axis, Dtheta,Dphi,Dtot

Return type:

3D numpy array of float

lyceanem.electromagnetics.beamforming.MaximumDirectivityMapDiscrete(Etheta, Ephi, source_coords, wavelength, az_range=array([-180., -160., -140., -120., -100., -80., -60., -40., -20., 0., 20., 40., 60., 80., 100., 120., 140., 160., 180.]), elev_range=array([-180., -160., -140., -120., -100., -80., -60., -40., -20., 0., 20., 40., 60., 80., 100., 120., 140., 160., 180.]), az_index=None, elev_index=None, forming='Total', total_solid_angle=12.566370614359172, phase_resolution=array([24]))[source]

Uses wavefront beamsteering, and equal gain combining algorithms to steer the antenna array to each possible command angle in the farfield, mapping out the maximum achieved directivity at the command angle for each command angle set.

Parameters:
  • Etheta (3D numpy array) – The $E heta$ polarisation farfield patterns, arranged in terms of the number of elements, azimuth resolution, and elevation resolution

  • Ephi (3D numpy array) – The $Ephi$ polarisation farfield patterns, arranged in terms of the number of elements, azimuth resolution, and elevation resolution

  • source_coords (open3d.geometry.PointCloud) – The source coordinates of each element, corresponding to the order of element patterns in $E heta$ and $Ephi$. Units should be m

  • wavelength (float) – The wavelength of interest

  • az_res (int) – Azimuth resolution

  • elev_res (int) – Elevation resolution

  • az_range (1D numpy array of float) – The azimuth values for the farfield mesh, arranged from smallest to largest

  • elev_range (1D numpy array of float) – The elevation values for the farfield mesh, arranged from smallest to largest

  • forming (str) – Which polarisation should be beamformed, the default is [Total], beamforming the total directivity pattern, avoiding issues with elements which have a strongly $E heta$ or $Ephi$ pattern. This can also be set to [Etheta] or [Ephi]

  • total_solid_angle (float) – the total solid angle covered by the farfield patterns, this defaults to $4pi$ for a full spherical pattern

  • phase_resolution (1D numpy array of int) – the desired phase resolution of the beamforming architecture in bits. Default is [24], which means no practical truncation will occur. If beam mapping is desired at a single resolution is required, then this can be set between 2 and 24, if more than one resolution value is required, then a 1D array of values can be specified. resolutions to be supplied, and produces a maximum directivity map for each.

Returns:

directivity_map – The achieved maximum directivity map (a 3D numpy array for each phase resolution) . For each phase resolution for each point the directivity corresponds to the achieved directivity at that command angle.

Return type:

4D numpy array of float

lyceanem.electromagnetics.beamforming.PatternPlot(data, az, elev, pattern_min=-40, plot_max=0.0, plottype='Polar', logtype='amplitude', ticknum=6, title_text=None)[source]

Plot the relavent 3D data in relative power (dB) or normalised directivity (dBi)

Parameters:
  • data (2D array of floats or complex) – the data to plot

  • az (2D array of floats) – the azimuth angles for each datapoint in [data] in degrees

  • elev (2D array of floats) – the elevation angles for each datapoint in [data] in degrees

  • pattern_min (float) – the desired scale minimum in dB, default is [-40]

  • plot_max (float) – the desired scale maximum in dB, default is [0]

  • plottype (str) – the plot type, either [Polar], [Cartesian-Surf], or [Contour]. The default is [Polar]

  • logtype (str) – the type of data being considered, either [amplitude] or [power], to ensure the correct logarithm is used, default is [amplitude]

  • ticknum (int) – the number of ticks on the colorbar, default is [6]

  • title_text (str) – the graph title, defaults to [None]

Return type:

None

lyceanem.electromagnetics.beamforming.Steering_Efficiency(Dtheta, Dphi, Dtot, first_dimension_angle, second_dimension_angle, angular_coverage)[source]

Calculate Steering Efficiency for the provided pattern, in radians

Parameters:
  • Dtheta (numpy 2D array of floats or complex) – DESCRIPTION.

  • Dphi (numpy 2D array of floats or complex) – DESCRIPTION.

  • Dtot (numpy 2D array of floats or complex) – DESCRIPTION.

  • coverage (angular) – the total angular coverage to be considered, should be $4pi$ steradians

Returns:

  • setheta (float) – steering efficiency in Dtheta

  • sephi (float) – steering efficiency in Dphi

  • setot (float) – steering efficiency in Dtotal

lyceanem.electromagnetics.beamforming.WavefrontWeights(source_coords, steering_vector, wavelength)[source]

calculate the weights for a given set of element coordinates, wavelength, and steering vector (cartesian)

lyceanem.electromagnetics.beamforming.directivity_transform(Etheta, Ephi, az_range=array([-180., -160., -140., -120., -100., -80., -60., -40., -20., 0., 20., 40., 60., 80., 100., 120., 140., 160., 180.]), elev_range=array([-90., -80., -70., -60., -50., -40., -30., -20., -10., 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.]), total_solid_angle=12.566370614359172)[source]

Directivity Transform for Etheta and Ephi

directivity is defined in terms of the power radiated in a specific direction, over the average radiated power power per unit solid angle

Parameters:
  • Etheta (numpy 2D array of floats or complex) –

  • Ephi (numpy 2D array of floats or complex) –

  • az_range (numpy array of floats) –

  • elev_range (numpy array of floats) –

  • total_solid_angle (float) –

Returns:

  • Dtheta (numpy 2D array of floats) – The directivity pattern in Etheta

  • Dphi (numpy 2D array of floats) – The directivity pattern in Ephi

  • Dtot (numpy 2D array of floats) – The total directivity pattern

  • Dmax (numpy array of floats) – The maximum directivity in Dtheta,Dphi,Dtot