Skip to content

Scenarios

Scenarios define the operating conditions for analysis. Different scenario types support different applications.

Overview

phased-array-systems supports two main scenario types:

Scenario Class Application
Communications CommsLinkScenario Link budget analysis
Radar RadarDetectionScenario Detection performance

All scenarios inherit from ScenarioBase and share common parameters.

CommsLinkScenario

For communications link budget analysis.

Parameters

Parameter Type Default Description
freq_hz float Required Operating frequency (Hz)
bandwidth_hz float Required Signal bandwidth (Hz)
range_m float Required Link range (m)
required_snr_db float Required Required SNR for demod (dB)
scan_angle_deg float 0.0 Beam scan angle (degrees)
rx_antenna_gain_db float None RX antenna gain (dB)
rx_noise_temp_k float 290.0 RX noise temperature (K)
path_loss_model str "fspl" Propagation model
atmospheric_loss_db float 0.0 Atmospheric loss (dB)
rain_loss_db float 0.0 Rain fade margin (dB)
polarization_loss_db float 0.0 Polarization loss (dB)

Example

from phased_array_systems.scenarios import CommsLinkScenario

# Point-to-point terrestrial link
scenario = CommsLinkScenario(
    freq_hz=10e9,              # 10 GHz (X-band)
    bandwidth_hz=10e6,         # 10 MHz
    range_m=50e3,              # 50 km
    required_snr_db=12.0,      # 12 dB for 16-QAM
    scan_angle_deg=15.0,       # 15° off boresight
    rx_antenna_gain_db=30.0,   # 30 dBi receive antenna
    rx_noise_temp_k=300.0,     # System noise temperature
    atmospheric_loss_db=0.5,   # Atmospheric absorption
    rain_loss_db=3.0,          # Rain fade margin
)
# Geostationary satellite downlink
geo_scenario = CommsLinkScenario(
    freq_hz=12e9,              # Ku-band
    bandwidth_hz=36e6,         # 36 MHz transponder
    range_m=36000e3,           # GEO distance
    required_snr_db=8.0,       # QPSK
    scan_angle_deg=0.0,        # Boresight
    rx_antenna_gain_db=40.0,   # Large ground station
    rx_noise_temp_k=100.0,     # Cooled LNA
    atmospheric_loss_db=0.3,
    rain_loss_db=5.0,          # High rain margin
)

Path Loss Models

Currently supported:

Model Description
"fspl" Free Space Path Loss

Free space path loss:

\[ L_{FSPL} = 20 \log_{10}(4\pi d f / c) \]

Extra Losses

Total extra loss is computed automatically:

# Available as property
total_loss = scenario.total_extra_loss_db
# = atmospheric_loss_db + rain_loss_db + polarization_loss_db

RadarDetectionScenario

For radar detection performance analysis.

Parameters

Parameter Type Default Description
freq_hz float Required Operating frequency (Hz)
target_rcs_m2 float Required Target RCS (m²)
range_m float Required Target range (m)
required_pd float 0.9 Required detection probability
pfa float 1e-6 False alarm probability
pulse_width_s float Required Pulse width (s)
prf_hz float Required Pulse repetition frequency (Hz)
n_pulses int 1 Pulses to integrate
integration_type str "coherent" Integration type
swerling_model int 1 Target fluctuation model
scan_angle_deg float 0.0 Beam scan angle (degrees)
system_loss_db float 0.0 System losses (dB)

Example

from phased_array_systems.scenarios import RadarDetectionScenario

scenario = RadarDetectionScenario(
    freq_hz=10e9,              # X-band
    target_rcs_m2=1.0,         # 1 m² target
    range_m=100e3,             # 100 km
    required_pd=0.9,           # 90% detection probability
    pfa=1e-6,                  # 10⁻⁶ false alarm rate
    pulse_width_s=10e-6,       # 10 μs pulse
    prf_hz=1000,               # 1 kHz PRF
    n_pulses=10,               # Integrate 10 pulses
    integration_type="coherent",
    swerling_model=1,          # Swerling 1 target
)

Swerling Models

Model Description Target Type
0 Non-fluctuating Steady target
1 Scan-to-scan decorrelation Many scatterers, slow
2 Pulse-to-pulse decorrelation Many scatterers, fast
3 Scan-to-scan, dominant scatterer Large + small, slow
4 Pulse-to-pulse, dominant scatterer Large + small, fast

Integration Types

Type Description Gain
"coherent" Phase-coherent integration \(N\) (linear)
"noncoherent" Magnitude-only integration \(\sqrt{N}\) (approx)

ScenarioBase

Both scenario types inherit common parameters:

Parameters

Parameter Type Default Description
freq_hz float Required Operating frequency (Hz)
name str None Optional scenario name

Properties

Property Returns Description
wavelength_m float Wavelength (c/f)
scenario = CommsLinkScenario(freq_hz=10e9, ...)
print(f"Wavelength: {scenario.wavelength_m * 100:.2f} cm")  # 3.00 cm

Typical Parameter Values

Frequency Bands

Band Frequency Typical Use
L 1-2 GHz Long-range radar, satcom
S 2-4 GHz Weather radar, ATC
C 4-8 GHz Satcom, weather
X 8-12 GHz Military radar, satcom
Ku 12-18 GHz DBS, satcom
Ka 26-40 GHz High-throughput satcom

Required SNR by Modulation

Modulation Typical SNR
BPSK 6-10 dB
QPSK 8-12 dB
8PSK 12-15 dB
16-QAM 14-18 dB
64-QAM 20-24 dB

Typical Detection Requirements

Application Pd Pfa
Air traffic control 0.95 10⁻⁷
Weather radar 0.9 10⁻⁶
Military search 0.8-0.9 10⁻⁶
Tracking 0.99 10⁻⁴

YAML Configuration

Scenarios can be defined in YAML:

# Communications scenario
scenario:
  type: comms
  freq_hz: 10.0e9
  bandwidth_hz: 10.0e6
  range_m: 100.0e3
  required_snr_db: 10.0
  scan_angle_deg: 0.0
  rx_noise_temp_k: 290.0
  atmospheric_loss_db: 0.5
# Radar scenario
scenario:
  type: radar
  freq_hz: 10.0e9
  target_rcs_m2: 1.0
  range_m: 100.0e3
  required_pd: 0.9
  pfa: 1.0e-6
  pulse_width_s: 10.0e-6
  prf_hz: 1000
  n_pulses: 10
  swerling_model: 1

Load with:

from phased_array_systems.io import load_config

config = load_config("config.yaml")
scenario = config.get_scenario()

Scenario Selection Guide

graph TD
    A[Application?] --> B{Type}
    B -->|Communications| C[CommsLinkScenario]
    B -->|Radar| D[RadarDetectionScenario]
    C --> E[Point-to-Point?]
    E -->|Yes| F[Set range_m, rx_antenna_gain_db]
    E -->|No| G[Satellite?]
    G -->|Yes| H[Large range_m, set atmospheric/rain losses]
    D --> I[Set target_rcs_m2]
    I --> J[Set detection requirements]
    J --> K[Choose Swerling model]

See Also