Antenna Patterns in SpaceLink
Executive Summary
High-fidelity antenna pattern modeling is essential for credible link analysis during all phases of a space mission. Oversimplified assumptions, such as representing an antenna with a single gain value or using crude pointing-loss approximations, can lead to overdesign (excess mass, power, cost and complexity) or communication blackouts during critical operations. The antenna modeling capabilities developed by Cascade Space make it easy to replace fragile assumptions with the precise calculations needed for mission success.
This paper introduces SpaceLink’s antenna modeling capabilities. SpaceLink is Cascade's open-source Python package for RF link analysis with an emphasis on space applications. To our knowledge, it is the only free, open-source option that supports interpolation of antenna patterns in three dimensions. In this paper we describe how SpaceLink represents antenna radiation patterns and how it derives key link design quantities such as directivity, gain, and axial ratio. We also give an overview of the API and a quickstart.
The Challenge: From Real Patterns to Trustworthy Analysis
Incorporating antenna gain into link analysis presents several challenges:
- Space vehicle attitude and position relative to ground stations is rarely constant. A single “antenna gain” value is inadequate for dynamic scenarios.
- Polarization matters. Cross-pol leakage and axial-ratio variation can materially change link margin, especially across off-boresight angles.
- Gain is frequency-dependent.
- Patterns come from diverse sources: EM solvers, vendor catalogs, and measurements.
- Sampled pattern data requires interpolation over a spherical coordinate system.
- Phase information must be preserved to accurately model passive combinations of multiple antennas.
- Software capable of leveraging antenna patterns is typically expensive, closed-source, and cumbersome to use.
SpaceLink addresses these needs by making it easy to calculate antenna pattern quantities in any direction for any frequency and polarization via accurate modeling and fully vectorized operations.
Math of Radiation Patterns in SpaceLink
In this section we present the math implemented in SpaceLink to represent radiation patterns.
SpaceLink uses a standard spherical coordinate system with the following conventions:
- $\theta$ is the polar angle measured from the +Z axis in $[0, \pi]$ radians.
- $\phi$ is the azimuthal angle measured from the +X axis in the xy-plane, typically in $[0, 2\pi)$ or $[-\pi, \pi)$ radians.
Spherical coordinate system convention used in SpaceLink.
E-Field Representation
At the core of the RadiationPattern class is the electric field (E-field) $\mathbf{E}(\theta, \phi)$. This was chosen as the internal representation of the pattern because the E-field preserves phase information, without which it would be impossible to correctly model combinations of multiple antennas. Other quantities of interest in link analysis such as directivity, gain, and axial ratio are easily derived from the E-field.
To handle arbitrary polarization states the E-field is a Jones vector, which represents the time-harmonic E-field phasor as coefficients on an orthonormal polarization basis. We chose $\hat{\theta}$ and $\hat{\phi}$ as the polarization basis vectors, so
$$\mathbf{E}(\theta, \phi) = E_\theta(\theta, \phi)\hat{\theta} + E_\phi(\theta, \phi)\hat{\phi}.$$
For radiation patterns we want to represent both the magnitude and phase of the E-field but we don't need to know the actual field strength in Volts per meter at arbitrary locations in 3D space. We only need the magnitude information necessary to compute directivity, which is independent of radius and total radiated power. Thus we define a normalized E-field
$$ \tilde{\mathbf{E}}(\theta,\phi) \equiv \frac{\mathbf{E}(\theta,\phi)} { \sqrt{ \frac{1}{4\pi} \int_{4\pi} \lVert\mathbf{E}(\theta,\phi) \rVert ^2 , d\Omega}} $$
where the normalization is chosen such that directivity is simply
$$ D(\theta,\phi) = \lVert \tilde{\mathbf{E}}(\theta,\phi) \rVert ^2. $$
This simplifies computation of gain and directivity and eliminates the need to keep track of total radiated power $P_\text{rad}$ as part of the radiation pattern.
Here's what the first few rows and columns of $\tilde{\mathbf{E}}$ look like for a real antenna:
$E_\phi(\theta,\phi)$
| $\theta$ | $\phi=0.0^\circ$ | $\phi=3.0^\circ$ | $\phi=6.0^\circ$ | $\phi=9.0^\circ$ |
|---|---|---|---|---|
| $\theta=0.0^\circ$ | -0.547+0.620j | -0.509+0.649j | -0.470+0.676j | -0.430+0.701j |
| $\theta=1.0^\circ$ | -0.548+0.619j | -0.510+0.648j | -0.471+0.674j | -0.430+0.699j |
| $\theta=2.0^\circ$ | -0.549+0.619j | -0.511+0.648j | -0.472+0.674j | -0.432+0.699j |
| $\theta=3.0^\circ$ | -0.549+0.618j | -0.511+0.647j | -0.472+0.673j | -0.432+0.698j |
$E_\theta(\theta,\phi)$
| $\theta$ | $\phi=0.0^\circ$ | $\phi=3.0^\circ$ | $\phi=6.0^\circ$ | $\phi=9.0^\circ$ |
|---|---|---|---|---|
| $\theta=0.0^\circ$ | -0.710-0.564j | -0.737-0.531j | -0.763-0.496j | -0.786-0.460j |
| $\theta=1.0^\circ$ | -0.708-0.563j | -0.736-0.530j | -0.762-0.495j | -0.785-0.459j |
| $\theta=2.0^\circ$ | -0.708-0.563j | -0.735-0.530j | -0.761-0.495j | -0.785-0.460j |
| $\theta=3.0^\circ$ | -0.706-0.562j | -0.734-0.529j | -0.760-0.495j | -0.784-0.459j |
Polarization State Representation
SpaceLink represents an arbitrary polarization state as a Jones vector in the $[\hat{\theta},\hat{\phi}]$ basis. The Polarization class constructor accepts the following three parameters:
- Tilt angle $\psi$: angle of the ellipse major axis in the local tangent plane measured from $\hat{\theta}$
- Axial ratio $\mathrm{AR} = a/b \ge 1$: ratio of the ellipse major to minor axis
- Handedness $h \in {\text{LH},,\text{RH}}$: direction of E-field rotation when looking along the propagation direction
Polarization ellipse parameterization. The polarization ellipse is shown in a plane tangent to the sphere known as the local tangent plane. The direction of propagation is out of the screen.
With sign $s = -1$ for LH and $s = +1$ for RH, the unnormalized Jones vector is
$$ \mathbf{p}_\text{raw}(\psi, \mathrm{AR}, s) = \begin{bmatrix} \cos\psi + s,j,\dfrac{\sin\psi}{\mathrm{AR}} \ \sin\psi - s,j,\dfrac{\cos\psi}{\mathrm{AR}} \end{bmatrix} . $$
SpaceLink normalizes this vector to unit magnitude and removes the arbitrary global phase by rotating so that the first component is real:
$$\mathbf{p} = \frac{\exp\big(-j,\arg{[\mathbf{p}\text{raw}]0}\big)}{\lVert \mathbf{p}\text{raw} \rVert},\mathbf{p}\text{raw}.$$
Convenience constructors provide circular states with $\psi=\tfrac{\pi}{4}$ and $\mathrm{AR}=1$:
- $\mathbf{p}_\text{RHCP} = \tfrac{1}{\sqrt{2}},[,1,,-j,]^\top$ via
Polarization.rhcp() - $\mathbf{p}_\text{LHCP} = \tfrac{1}{\sqrt{2}},[,1,,+j,]^\top$ via
Polarization.lhcp()
Polarization Projection
E-field, directivity, and gain methods of the RadiationPattern class all project the radiation pattern E-field onto a desired polarization state to calculate the field quantity in that polarization. Given a RadiationPattern’s complex, normalized Jones field $\mathbf{\tilde{E}}(\theta,\phi[,f]) = [,E_\theta,,E_\phi,]^\top$ and a desired polarization state $\mathbf{p}$, SpaceLink computes the field in that polarization by the standard Jones projection
$$\tilde{E}_{\mathbf{p}}(\theta,\phi[,f]) = \mathbf{p}^\mathrm{H},\mathbf{\tilde{E}}(\theta,\phi[,f]) .$$
Directivity and Gain
Directivity in that polarization follows immediately as
$$D_{\mathbf{p}}(\theta,\phi[,f]) = \big|E_{\mathbf{p}}(\theta,\phi[,f])\big|^2,$$
and gain is
$$G_{\mathbf{p}} = \eta,D_{\mathbf{p}}$$
using the radiation efficiency $\eta$.
LHCP and RHCP gain of the PlaneWave PW2022-101 low-gain antenna at 2160 MHz.
Axial Ratio
Axial ratio (AR) quantifies how close the polarization is to circular or linear. It is defined as the ratio of the polarization ellipse’s major to minor semi-axes, $\mathrm{AR}=a/b\ge1$. Thus, circular polarization has $\mathrm{AR}=1$ (0 dB) and ideal linear polarization has $\mathrm{AR}\to\infty$.
SpaceLink computes AR by forming the 2×2 coherency (polarization) matrix
$$\mathbf{C} = \mathbf{\tilde{E}},\mathbf{\tilde{E}}^{\mathrm{H}} ;,$$
whose eigenvalues $\lambda_{\max}\ge\lambda_{\min}\ge0$ are proportional to the squared semi-axis lengths of the polarization ellipse. The axial ratio is then
$$ \mathrm{AR}(\theta,\phi[,f]) = \sqrt{\frac{\lambda_{\max}}{\lambda_{\min}}},,\qquad \mathrm{AR}{\mathrm{dB}} = 20\log{10}!\big(\mathrm{AR}\big). $$
Axial ratio of the PlaneWave PW2022-101 low-gain antenna at 2160 MHz.
API Overview
This section gives a quick overview of the RadiationPattern API. Details beyond this overview can be found in the official SpaceLink antenna module documentation.
Constructing Patterns
SpaceLink offers multiple construction paths for RadiationPattern depending on available data:
| Constructor Method | Input Data |
|---|---|
RadiationPattern.__init__ |
Complex E-fields in $(\hat{\theta},\hat{\phi})$ basis |
RadiationPattern.from_circular_e_field |
Complex E-fields in LHCP/RHCP |
RadiationPattern.from_linear_gain |
Gain + phase in $(\hat{\theta},\hat{\phi})$ |
RadiationPattern.from_circular_gain |
Gain + phase in LHCP/RHCP |
In all cases frequency dependence is supported but optional:
- Frequency-aware patterns are defined over $(\theta, \phi, f)$
- Frequency-invariant patterns are defined over $(\theta, \phi)$
Patterns may be defined over the full sphere or a subset. All construction paths validate input data for grid consistency and confirm that the surface integral of directivity never exceeds 4π.
Methods for Interpolated Quantities
The following quantities are interpolated from the normalized E-field data over any combination of $(\theta, \phi)$ angles and frequencies via instance methods:
| Method | Quantity |
|---|---|
pattern.e_field |
Normalized E-field $\tilde{E}_\mathbf{p}$ |
pattern.directivity |
Directivity $D_\mathbf{p}$ |
pattern.gain |
Gain $G_\mathbf{p}$ |
pattern.axial_ratio |
Axial ratio $\mathrm{AR}$ |
Scalar or array arguments for $\theta$, $\phi$, and $f$ are supported. Standard NumPy broadcasting rules apply for array arguments of different shapes.
Data I/O
Import and export features for RadiationPattern objects are provided by the pattern_io module:
pattern_io.import_hfss_csvimports from HFSS-exported CSV files containing appropriate columns.pattern_io.save_radiation_pattern_npzandpattern_io.load_radiation_pattern_npzstore and recover patterns using NumPy's space-efficient NPZ file format.
Quickstart
Install:
pip install spacelink
Minimal usage with a synthetic cosine pattern:
import numpy as np
import astropy.units as u
from spacelink.core import antenna
theta = np.linspace(0, np.pi, 100) * u.rad
phi = np.linspace(0, 2*np.pi, 100) * u.rad
theta_grid, phi_grid = np.meshgrid(theta, phi, indexing='ij')
pattern = 6 * np.maximum(np.cos(theta_grid), 0)**2
e_theta = np.sqrt(pattern) * u.dimensionless
e_phi = np.zeros_like(e_theta) * u.dimensionless
pattern = antenna.RadiationPattern(
theta=theta,
phi=phi,
frequency=None,
e_theta=e_theta,
e_phi=e_phi,
rad_efficiency=0.8 * u.dimensionless,
default_polarization=antenna.Polarization.lhcp()
)
gain_boresight = pattern.gain(theta=0 * u.deg, phi=0 * u.deg)
Example Applications
- Dynamic link margin: Evaluate gain over a spacecraft attitude timeline and compute margin statistics.
- Apply a minimum gain mask to the pattern and determine the % of vehicle attitudes that exceed this threshold.
- Cross-pol sensitivity studies: Plot axial ratio or polarization loss vs. angles.
- Pattern comparison and validation: Import measured and simulated patterns for comparison.
Why SpaceLink vs. Alternatives
- Complements EM solvers, doesn’t replace them: Use your favorite EM solver to generate patterns; SpaceLink consumes and interpolates those patterns to produce derived quantities like gain and axial ratio in arbitrary directions.
- Open, code-first link analysis: Modern Python API backed by high-performance NumPy/SciPy vectorized operations is easy to integrate into mission-specific codebases. Nothing is hidden behind a tedious GUI.
- Free: No costly per-seat, Windows-only licenses.
Conclusion
SpaceLink makes antenna pattern modeling practical, accurate, and integration-ready.
Get started:
- Install:
pip install spacelink - Read the documentation
- Try the tutorial notebook
- Need help? Email us or start a GitHub discussion.