"""
Radar System Characteristics
============================
Core functions related to radar system components like antenna gain, pulse parameters,
wavelength/frequency conversion, and radar constants.
.. autosummary::
:nosignatures:
:toctree: generated/
ant_eff_area
antenna_gain
frequency
frequency_from_wavelength
power_return_target
pulse_duration
pulse_duration_from_length
pulse_length
pulse_length_from_duration
radar_const
radar_equation
size_param
solve_peak_power
wavelength
wavelength_from_frequency
"""
import numpy as np
from .constants import C
[docs]
def ant_eff_area(gain_dbi, wavelength):
"""
Compute effective antenna area from gain and wavelength.
Parameters
----------
gain_dbi : float
Antenna gain [dBi]
wavelength : float
Wavelength [m]
Returns
-------
float
Effective antenna area [m^2]
"""
gain_linear = 10 ** (gain_dbi / 10)
return (gain_linear * wavelength**2) / (4 * np.pi)
[docs]
def antenna_gain(p_beam, p_iso):
"""
Compute antenna gain in dB from power ratio.
Parameters
----------
p_beam : float or array-like
Power on the beam axis [W]
p_iso : float or array-like
Power from an isotropic antenna [W]
Returns
-------
float or array-like
Antenna gain in dB.
"""
return 10.0 * np.log10(np.asarray(p_beam) / np.asarray(p_iso))
[docs]
def frequency(wavelength):
"""
Alias for frequency_from_wavelength.
"""
return frequency_from_wavelength(wavelength)
[docs]
def frequency_from_wavelength(wavelength):
"""
Compute frequency from radar wavelength.
Parameters
----------
wavelength : float or array-like
Radar wavelength [m]
Returns
-------
float or array-like
Frequency [Hz]
"""
return C / np.asarray(wavelength)
[docs]
def power_return_target(power_tx, gain_dbi, wavelength, sigma, range_m):
"""
Compute received power from a radar target using the radar equation.
Parameters
----------
power_tx : float
Transmitted power [W]
gain_dbi : float
Antenna gain [dBi]
wavelength : float
Radar wavelength [m]
sigma : float
Radar cross-section [m^2]
range_m : float
Range to target [m]
Returns
-------
float
Received power [W]
"""
gain_linear = 10 ** (gain_dbi / 10)
return (power_tx * gain_linear**2 * wavelength**2 * sigma) / (
(4 * np.pi) ** 3 * range_m**4
)
[docs]
def pulse_duration(pulse_length_val):
"""
Alias for pulse_duration_from_length.
"""
return pulse_duration_from_length(pulse_length_val)
[docs]
def pulse_duration_from_length(pulse_length):
"""
Compute pulse duration from physical pulse length.
Parameters
----------
pulse_length : float or array-like
Pulse length [m]
Returns
-------
float or array-like
Pulse duration [s]
"""
return 2.0 * np.asarray(pulse_length) / C
[docs]
def pulse_length(pulse_duration):
"""
Alias for pulse_length_from_duration.
"""
return pulse_length_from_duration(pulse_duration)
[docs]
def pulse_length_from_duration(pulse_duration):
"""
Compute physical pulse length from pulse duration.
Parameters
----------
pulse_duration : float or array-like
Pulse duration [s]
Returns
-------
float or array-like
Pulse length [m]
"""
return C * np.asarray(pulse_duration) / 2.0
[docs]
def radar_const(power_t, gain, tau, wavelength, bw_h, bw_v, aloss, rloss):
"""
Compute the radar constant (unitless).
Adapted from CSU Radar Meteorology tools (AT741 notes).
Parameters
----------
power_t : float
Transmitted power [W]
gain : float
Antenna Gain [dB]
tau : float
Pulse Width [s]
wavelength : float
Radar wavelength [m]
bw_h : float
Horizontal antenna beamwidth [degrees]
bw_v : float
Vertical antenna beamwidth [degrees]
aloss : float
Antenna/waveguide/coupler loss [dB]
rloss : float
Receiver loss [dB]
Returns
-------
float
Radar constant (unitless)
"""
alosslin = 10 ** (aloss / 10.0)
rlosslin = 10 ** (rloss / 10.0)
gainlin = 10 ** (gain / 10.0)
bw_hr = np.deg2rad(bw_h)
bw_vr = np.deg2rad(bw_v)
numer = (
np.pi**3 * C * power_t * gainlin**2 * tau * bw_hr * bw_vr * alosslin * rlosslin
)
denom = 1024.0 * np.log(2) * wavelength**2
return numer / denom
[docs]
def radar_equation(
pt: float,
g_tx: float,
g_rx: float,
wavelength: float,
sigma: float,
r: float,
loss: float = 1.0,
) -> float:
"""
Compute the received power using the radar range equation.
Parameters
----------
pt : float
Transmitter peak power [W].
g_tx : float
Transmit antenna gain (linear).
g_rx : float
Receive antenna gain (linear).
wavelength : float
Radar wavelength [m].
sigma : float
Radar cross-section [m^2].
r : float
Range to target [m].
loss : float, optional
System loss factor (default is 1.0).
Returns
-------
float
Received power [W].
"""
numerator = pt * g_tx * g_rx * wavelength**2 * sigma
denominator = ((4 * np.pi) ** 3) * r**4 * loss
return numerator / denominator
[docs]
def size_param(diameter, wavelength):
"""
Compute size parameter alpha.
Parameters
----------
diameter : float
Diameter of the particle [m]
wavelength : float
Radar wavelength [m]
Returns
-------
float
Size parameter alpha
"""
return np.pi * diameter / wavelength
[docs]
def solve_peak_power(
pr: float,
g_tx: float,
g_rx: float,
wavelength: float,
sigma: float,
r: float,
loss: float = 1.0,
) -> float:
"""
Solve for transmitter peak power using the radar equation.
Parameters
----------
pr : float
Received power [W].
g_tx : float
Transmit antenna gain (linear).
g_rx : float
Receive antenna gain (linear).
wavelength : float
Radar wavelength [m].
sigma : float
Radar cross-section [m^2].
r : float
Range to target [m].
loss : float, optional
System loss factor (default is 1.0).
Returns
-------
float
Required transmitter peak power [W].
"""
numerator = pr * ((4 * np.pi) ** 3) * r**4 * loss
denominator = g_tx * g_rx * wavelength**2 * sigma
return numerator / denominator
[docs]
def wavelength(freq):
"""
Alias for wavelength_from_frequency.
"""
return wavelength_from_frequency(freq)
[docs]
def wavelength_from_frequency(freq):
"""
Compute wavelength from radar frequency.
Parameters
----------
freq : float or array-like
Frequency [Hz]
Returns
-------
float or array-like
Wavelength [m]
"""
return C / np.asarray(freq)
__all__ = [
"ant_eff_area",
"antenna_gain",
"frequency",
"frequency_from_wavelength",
"power_return_target",
"pulse_duration",
"pulse_duration_from_length",
"pulse_length",
"pulse_length_from_duration",
"radar_const",
"radar_equation",
"size_param",
"solve_peak_power",
"wavelength",
"wavelength_from_frequency",
]