Skip to content

SAR Radar

SAR system parameters and target models.

Defines :class:SarRadar (SAR platform and system parameters for stripmap and spotlight modes) and :class:SarTarget (a point scatterer in 3-D space).

SarRadar dataclass

SAR system parameters (stripmap and spotlight modes).

All gain and loss fields are linear power ratios (not dB). Derived quantities (n_pulses, wavelength, pulse_spacing) are computed automatically in __post_init__.

For stripmap mode, leave scene_center as None. Optionally set beamwidth to apply broadside beam-pattern weighting (body-fixed antenna). For spotlight mode, set both scene_center and beamwidth to steer the beam toward a fixed scene centre.

Attributes:

Name Type Description
fcar float

Carrier frequency [Hz].

tx_power float

Transmit power [W].

tx_gain float

Transmit antenna gain [linear].

rx_gain float

Receive antenna gain [linear].

op_temp float

Receiver operating temperature [K].

sample_rate float

ADC sampling rate [Hz].

noise_factor float

Receiver noise factor [linear].

total_losses float

Total two-way system losses [linear].

prf float

Pulse repetition frequency [Hz].

platform_velocity float

Platform ground speed along the flight path [m/s].

aperture_length float

Synthetic aperture length [m].

platform_altitude float

Platform altitude above the scene [m].

scene_center list[float] | None

Scene centre [x, y, z] that the antenna tracks [m]. None for stripmap mode. Requires beamwidth.

beamwidth float | None

One-way 3-dB antenna beamwidth [rad]. In stripmap mode (scene_center=None), enables broadside beam-pattern weighting. In spotlight mode, weights by the steered beam.

n_pulses int

Number of pulses in the synthetic aperture, computed as ceil(aperture_length / pulse_spacing) [dimensionless].

wavelength float

Carrier wavelength [m], derived from fcar.

pulse_spacing float

Along-track distance between pulses [m], derived from platform_velocity / prf.

Source code in src/rad_lab/sar_radar.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
@dataclass
class SarRadar:
    """SAR system parameters (stripmap and spotlight modes).

    All gain and loss fields are linear power ratios (not dB).
    Derived quantities (``n_pulses``, ``wavelength``, ``pulse_spacing``)
    are computed automatically in ``__post_init__``.

    For **stripmap** mode, leave ``scene_center`` as ``None``.
    Optionally set ``beamwidth`` to apply broadside beam-pattern
    weighting (body-fixed antenna).  For **spotlight** mode, set both
    ``scene_center`` and ``beamwidth`` to steer the beam toward a
    fixed scene centre.

    Attributes:
        fcar: Carrier frequency [Hz].
        tx_power: Transmit power [W].
        tx_gain: Transmit antenna gain [linear].
        rx_gain: Receive antenna gain [linear].
        op_temp: Receiver operating temperature [K].
        sample_rate: ADC sampling rate [Hz].
        noise_factor: Receiver noise factor [linear].
        total_losses: Total two-way system losses [linear].
        prf: Pulse repetition frequency [Hz].
        platform_velocity: Platform ground speed along the flight path [m/s].
        aperture_length: Synthetic aperture length [m].
        platform_altitude: Platform altitude above the scene [m].
        scene_center: Scene centre ``[x, y, z]`` that the antenna tracks
            [m].  ``None`` for stripmap mode.  Requires ``beamwidth``.
        beamwidth: One-way 3-dB antenna beamwidth [rad].  In stripmap
            mode (``scene_center=None``), enables broadside beam-pattern
            weighting.  In spotlight mode, weights by the steered beam.
        n_pulses: Number of pulses in the synthetic aperture, computed as
            ``ceil(aperture_length / pulse_spacing)`` [dimensionless].
        wavelength: Carrier wavelength [m], derived from ``fcar``.
        pulse_spacing: Along-track distance between pulses [m], derived from
            ``platform_velocity / prf``.
    """

    fcar: float
    tx_power: float
    tx_gain: float
    rx_gain: float
    op_temp: float
    sample_rate: float
    noise_factor: float
    total_losses: float
    prf: float
    platform_velocity: float
    aperture_length: float
    platform_altitude: float = 0.0
    scene_center: list[float] | None = None
    beamwidth: float | None = None
    n_pulses: int = field(init=False)
    wavelength: float = field(init=False)
    pulse_spacing: float = field(init=False)

    def __post_init__(self) -> None:
        """Compute derived quantities from the input parameters."""
        self.wavelength = c.C / self.fcar
        self.pulse_spacing = self.platform_velocity / self.prf
        self.n_pulses = int(math.ceil(self.aperture_length / self.pulse_spacing))
        if self.scene_center is not None and self.beamwidth is None:
            raise ValueError("beamwidth is required when scene_center is set (spotlight mode).")

aperture_length instance-attribute

beamwidth = None class-attribute instance-attribute

fcar instance-attribute

n_pulses = field(init=False) class-attribute instance-attribute

noise_factor instance-attribute

op_temp instance-attribute

platform_altitude = 0.0 class-attribute instance-attribute

platform_velocity instance-attribute

prf instance-attribute

pulse_spacing = field(init=False) class-attribute instance-attribute

rx_gain instance-attribute

sample_rate instance-attribute

scene_center = None class-attribute instance-attribute

total_losses instance-attribute

tx_gain instance-attribute

tx_power instance-attribute

wavelength = field(init=False) class-attribute instance-attribute

__init__(fcar, tx_power, tx_gain, rx_gain, op_temp, sample_rate, noise_factor, total_losses, prf, platform_velocity, aperture_length, platform_altitude=0.0, scene_center=None, beamwidth=None)

__post_init__()

Compute derived quantities from the input parameters.

Source code in src/rad_lab/sar_radar.py
70
71
72
73
74
75
76
def __post_init__(self) -> None:
    """Compute derived quantities from the input parameters."""
    self.wavelength = c.C / self.fcar
    self.pulse_spacing = self.platform_velocity / self.prf
    self.n_pulses = int(math.ceil(self.aperture_length / self.pulse_spacing))
    if self.scene_center is not None and self.beamwidth is None:
        raise ValueError("beamwidth is required when scene_center is set (spotlight mode).")

SarTarget dataclass

A point scatterer in a SAR scene.

Targets are defined by their 3-D position in a scene-centred coordinate system where x is along-track (flight direction), y is cross-track (range direction), and z is altitude.

Attributes:

Name Type Description
position list[float]

3-D Cartesian coordinates [x, y, z] [m]. x = along-track, y = cross-track, z = altitude.

rcs float

Radar cross section [m^2].

Source code in src/rad_lab/sar_radar.py
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
@dataclass
class SarTarget:
    """A point scatterer in a SAR scene.

    Targets are defined by their 3-D position in a scene-centred coordinate
    system where *x* is along-track (flight direction), *y* is cross-track
    (range direction), and *z* is altitude.

    Attributes:
        position: 3-D Cartesian coordinates ``[x, y, z]`` [m].
            *x* = along-track, *y* = cross-track, *z* = altitude.
        rcs: Radar cross section [m^2].
    """

    position: list[float]
    rcs: float

position instance-attribute

rcs instance-attribute

__init__(position, rcs)

cross_range_resolution(wavelength, slant_range, aperture_length)

Computes the cross-range (azimuth) resolution for a stripmap SAR.

Resolution improves with a longer aperture and degrades at longer range.

Parameters:

Name Type Description Default
wavelength float

Carrier wavelength [m].

required
slant_range float

Slant range to the target [m].

required
aperture_length float

Synthetic aperture length [m].

required

Returns:

Type Description
float

Cross-range 3-dB resolution [m].

Source code in src/rad_lab/sar_radar.py
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def cross_range_resolution(wavelength: float, slant_range: float, aperture_length: float) -> float:
    """Computes the cross-range (azimuth) resolution for a stripmap SAR.

    Resolution improves with a longer aperture and degrades at longer range.

    Args:
        wavelength: Carrier wavelength [m].
        slant_range: Slant range to the target [m].
        aperture_length: Synthetic aperture length [m].

    Returns:
        Cross-range 3-dB resolution [m].
    """
    return wavelength * slant_range / (2 * aperture_length)

spotlight_cross_range_resolution(wavelength, delta_theta)

Computes the cross-range resolution for a spotlight SAR.

In spotlight mode the antenna steers to keep the scene illuminated, so resolution depends on the total angular extent of the synthetic aperture rather than on the physical aperture length.

Parameters:

Name Type Description Default
wavelength float

Carrier wavelength [m].

required
delta_theta float

Total angle subtended by the synthetic aperture [rad].

required

Returns:

Type Description
float

Cross-range 3-dB resolution [m].

Source code in src/rad_lab/sar_radar.py
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
def spotlight_cross_range_resolution(wavelength: float, delta_theta: float) -> float:
    """Computes the cross-range resolution for a spotlight SAR.

    In spotlight mode the antenna steers to keep the scene illuminated,
    so resolution depends on the total angular extent of the synthetic
    aperture rather than on the physical aperture length.

    Args:
        wavelength: Carrier wavelength [m].
        delta_theta: Total angle subtended by the synthetic aperture [rad].

    Returns:
        Cross-range 3-dB resolution [m].
    """
    return wavelength / (2 * delta_theta)