Antenna Module

The antenna module provides comprehensive antenna modeling capabilities for RF system analysis, including polarization calculations, dish gain computations, and radiation pattern analysis.

Polarization Loss

The polarization loss between two antennas with given axial ratios is calculated using the standard formula for polarization mismatch:

\[\text{PLF} = \frac{1}{2} +\ \frac{1}{2} \frac{4 \gamma_1 \gamma_2 -\ (1-\gamma_1^2)(1-\gamma_2^2)}{(1+\gamma_1^2)(1+\gamma_2^2)}\]

where:

  • \(\gamma_1\) and \(\gamma_2\) are the voltage axial ratios (linear, not dB)

  • PLF is the polarization loss factor (linear)

The polarization loss in dB is then:

\[L_{\text{pol}} = -10 \log_{10}(\text{PLF})\]

For circular polarization, the axial ratio is 0 dB, and for linear polarization, it is >40 dB.

Dish Gain

The gain of a parabolic dish antenna is given by:

\[G = \eta \left(\frac{\pi D}{\lambda}\right)^2\]

where:

  • \(\eta\) is the efficiency factor (typically 0.55 to 0.70)

  • \(D\) is the diameter of the dish

  • \(\lambda\) is the wavelength

Spherical Coordinate System

This module uses the standard spherical coordinate system with the following conventions:

  • \(\theta\) is the polar angle measured from the +z axis with range [0, π] radians.

  • \(\phi\) is the azimuthal angle measured from the +x axis in the xy-plane with range [0, 2π) or [-π, π) radians.

spacelink.core.antenna.polarization_loss(ar1, ar2)[source]

Calculate the polarization loss in dB between two antennas with given axial ratios.

Parameters:
  • ar1 (Decibels) – First antenna axial ratio in dB (amplitude ratio)

  • ar2 (Decibels) – Second antenna axial ratio in dB (amplitude ratio)

Returns:

Polarization loss in dB (positive value)

Return type:

Decibels

spacelink.core.antenna.dish_gain(diameter, frequency, efficiency)[source]

Calculate the gain in dB of a parabolic dish antenna.

Parameters:
  • diameter (Length) – Dish diameter

  • frequency (Frequency) – Frequency

  • efficiency (Dimensionless) – Antenna efficiency (dimensionless)

Returns:

Gain in decibels (dB)

Return type:

Decibels

Raises:

ValueError – If frequency is not positive

class spacelink.core.antenna.Handedness(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)[source]

Bases: Enum

Handedness of the polarization ellipse.

The handedness is the direction of rotation of the E-field. The thumb points in the direction of propagation, and the fingers curl in the direction of the E-field rotation. When looking in the direction of propagation, the E-field rotates counter- clockwise for left-hand polarization and clockwise for right-hand polarization.

LEFT = 1
RIGHT = 2
class spacelink.core.antenna.Polarization(tilt_angle, axial_ratio, handedness)[source]

Bases: object

Represents a polarization state.

__init__(tilt_angle, axial_ratio, handedness)[source]

Create a polarization state.

Parameters:
  • tilt_angle (Angle) – Tilt angle of the major axis of the polarization ellipse, measured in the local tangent plane, relative to \(\hat{\theta}\).

  • axial_ratio (Dimensionless) – Ratio of the major to minor axis of the polarization ellipse.

  • handedness (Handedness) – The direction of rotation of the E-field when looking in the direction of propagation.

classmethod lhcp()[source]

Left-hand circular polarization.

Return type:

Self

classmethod rhcp()[source]

Right-hand circular polarization.

Return type:

Self

class spacelink.core.antenna.SphericalInterpolator(theta, phi, values, floor=<Quantity -200. dB>)[source]

Bases: object

Interpolates a regular grid of complex values in spherical coordinates.

__init__(theta, phi, values, floor=<Quantity -200. dB>)[source]

Create a spherical interpolator.

Parameters:
  • theta (Angle) – 1D array of equally spaced polar angles in [0, pi] radians with shape (N,).

  • phi (Angle) – 1D array of equally spaced azimuthal angles in [0, 2*pi) radians with shape (M,). Note that the last element must be less than 2π.

  • values (u.Quantity) – 2D complex array of values with shape (N, M) to interpolate.

  • floor (Decibels) – Floor value for the magnitude in dB. The interpolation approach used cannot handle 0 values anywhere, so 0s (-∞ dB) are replaced with this prior to interpolation.

class spacelink.core.antenna.RadiationPattern(theta, phi, e_theta, e_phi, rad_efficiency)[source]

Bases: object

Represents an antenna radiation pattern on a spherical coordinate system.

__init__(theta, phi, e_theta, e_phi, rad_efficiency)[source]

Create a radiation pattern from a set of E-field components.

\[\vec{E}(\theta, \phi) = E_\theta(\theta, \phi)\hat{\theta} + E_\phi(\theta, \phi)\hat{\phi}\]
Parameters:
  • theta (Angle) – 1D array of equally spaced polar angles in [0, pi] radians with shape (N,).

  • phi (Angle) – 1D array of equally spaced azimuthal angles in [0, 2*pi) radians with shape (M,). Note that the last element must be less than 2π.

  • e_theta (Dimensionless) – 2D complex array of \(E_{\theta}(\theta, \phi)\) values with shape (N, M) normalized such that the magnitude squared is equal to directivity.

  • e_phi (Dimensionless) – 2D complex array of \(E_{\phi}(\theta, \phi)\) values with shape (N, M) normalized such that the magnitude squared is equal to directivity.

  • rad_efficiency (Dimensionless) – Radiation efficiency \(\eta\) in [0, 1].

Raises:
  • ValueError – If theta or phi are not in [0, pi], or if theta or phi are not sorted in strictly increasing order, or if theta or phi are not equally spaced, or if phi does not cover less than 2π radians.

  • ValueError – If the surface integral of the directivity is greater than 4π.

classmethod from_circular_e_field(cls, theta, phi, e_lhcp, e_rhcp, rad_efficiency)[source]

Create a radiation pattern from a set of LHCP/RHCP E-field components.

\[\vec{E}(\theta, \phi) = E_\text{LHCP}(\theta, \phi)\hat{\text{LHCP}} + E_\text{RHCP}(\theta, \phi)\hat{\text{RHCP}}\]
Parameters:
  • theta (Angle) – 1D array of equally spaced polar angles in [0, pi] radians with shape (N,).

  • phi (Angle) – 1D array of equally spaced azimuthal angles in [0, 2*pi) radians with shape (M,).

  • e_lhcp (Dimensionless) – 2D complex array of \(E_{\text{LHCP}}(\theta, \phi)\) values with shape (N, M) normalized such that the magnitude squared is equal to directivity.

  • e_rhcp (Dimensionless) – 2D complex array of \(E_{\text{RHCP}}(\theta, \phi)\) values with shape (N, M) normalized such that the magnitude squared is equal to directivity.

  • rad_efficiency (Dimensionless) – Radiation efficiency \(\eta\) in [0, 1].

Return type:

Self

classmethod from_circular_gain(cls, theta, phi, gain_lhcp, gain_rhcp, phase_lhcp, phase_rhcp, rad_efficiency)[source]

Create a radiation pattern from circular gain and phase.

Parameters:
  • theta (Angle) – 1D array of equally spaced polar angles in [0, pi] radians with shape (N,).

  • phi (Angle) – 1D array of equally spaced azimuthal angles in [0, 2*pi) radians with shape (M,).

  • gain_lhcp (Dimensionless) – 2D array of LHCP gain with shape (N, M).

  • gain_rhcp (Dimensionless) – 2D array of RHCP gain with shape (N, M).

  • phase_lhcp (Angle) – 2D array of LHCP phase angles with shape (N, M).

  • phase_rhcp (Angle) – 2D array of RHCP phase angles with shape (N, M).

  • rad_efficiency (Dimensionless) – Radiation efficiency \(\eta\) in [0, 1].

Return type:

Self

classmethod from_linear_gain(cls, theta, phi, gain_theta, gain_phi, phase_theta, phase_phi, rad_efficiency)[source]

Create a radiation pattern from linear gain and phase.

Parameters:
  • theta (Angle) – 1D array of equally spaced polar angles in [0, pi] radians with shape (N,).

  • phi (Angle) – 1D array of equally spaced azimuthal angles in [0, 2*pi) radians with shape (M,).

  • gain_theta (Dimensionless) – 2D array of \(\hat{\theta}\) gain with shape (N, M).

  • gain_phi (Dimensionless) – 2D array of \(\hat{\phi}\) gain with shape (N, M).

  • phase_theta (Angle) – 2D array of \(\hat{\theta}\) phase angles with shape (N, M).

  • phase_phi (Angle) – 2D array of \(\hat{\phi}\) phase angles with shape (N, M).

  • rad_efficiency (Dimensionless) – Radiation efficiency \(\eta\) in [0, 1].

Return type:

Self

e_field(theta, phi, polarization)[source]

Normalized complex E-field in the desired polarization state.

Parameters:
  • theta (Angle) – Polar angles.

  • phi (Angle) – Azimuthal angles.

  • polarization (Polarization) – Desired polarization state.

Returns:

Complex E-field values. The E-field is normalized such that the magnitude squared is the directivity. Shape is determined by standard Numpy broadcasting rules from the shapes of theta and phi.

Return type:

Dimensionless

directivity(theta, phi, polarization)[source]

Directivity of the antenna.

Directivity as a function of the E-field in V/m is

\[D(\theta, \phi) = \frac{ 4 \pi r^2 |\vec{E}(r, \theta, \phi)|^2 }{2\eta_0 P_\text{rad}}\]

However, this class uses normalized E-fields since the intent is to represent only the relative power and phase of the E-field as a function of direction. Thus the directivity is simply

\[D(\theta, \phi) = |\vec{E}(\theta, \phi)|^2\]
Parameters:
  • theta (Angle) – Polar angles.

  • phi (Angle) – Azimuthal angles.

  • polarization (Polarization) – Desired polarization state.

Returns:

Directivity. Shape is determined by standard Numpy broadcasting rules from the shapes of theta and phi.

Return type:

Decibels

gain(theta, phi, polarization)[source]

Gain of the antenna.

\[G(\theta, \phi) = \eta \cdot D(\theta, \phi)\]

where \(\eta\) is the radiation efficiency.

Parameters:
  • theta (Angle) – Polar angles.

  • phi (Angle) – Azimuthal angles.

  • polarization (Polarization) – Desired polarization state.

Returns:

Gain. Shape is determined by standard Numpy broadcasting rules from the shapes of theta and phi.

Return type:

Decibels

axial_ratio(theta, phi)[source]

Axial ratio of the antenna.

The axial ratio is the ratio of the major to minor axis of the polarization ellipse. An axial ratio of 0 dB corresponds to circular polarization, and an axial ratio of ∞ corresponds to linear polarization. Elliptical polarizations have axial ratios between these two extremes.

Parameters:
  • theta (Angle) – Polar angles.

  • phi (Angle) – Azimuthal angles.

Returns:

Axial ratio. Shape is determined by standard Numpy broadcasting rules from the shapes of theta and phi.

Return type:

Decibels