Skip to content

Monopulse

Amplitude monopulse angle estimation.

Implements the sum-and-difference amplitude monopulse technique for estimating target angle from a two-element array, including peak-finding across a range-Doppler map.

amplitude_monopulse(sig_a, sig_b, dx)

Estimates sin(theta) at each sample or bin via amplitude monopulse ratio.

Computes the standard sum/difference monopulse estimator: v_theta = arctan(2 * Im(delta/sum)) / (2pidx)

where sum = sig_a + sig_b and delta = sig_a - sig_b.

Parameters:

Name Type Description Default
sig_a ndarray

Complex signal from the first array element.

required
sig_b ndarray

Complex signal from the second array element.

required
dx float

Element separation in wavelengths.

required

Returns:

Name Type Description
v_theta ndarray

Estimated sin(theta) at each sample or bin.

Source code in src/rad_lab/monopulse.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def amplitude_monopulse(sig_a: np.ndarray, sig_b: np.ndarray, dx: float) -> np.ndarray:
    """Estimates sin(theta) at each sample or bin via amplitude monopulse ratio.

    Computes the standard sum/difference monopulse estimator:
        v_theta = arctan(2 * Im(delta/sum)) / (2*pi*dx)

    where sum = sig_a + sig_b and delta = sig_a - sig_b.

    Args:
        sig_a: Complex signal from the first array element.
        sig_b: Complex signal from the second array element.
        dx: Element separation in wavelengths.

    Returns:
        v_theta (np.ndarray): Estimated sin(theta) at each sample or bin.
    """
    rho = 2 * np.pi * dx
    sum_ = sig_a + sig_b
    delta = sig_a - sig_b
    return np.arctan(2 * (delta / sum_).imag) / rho

monopulse_angle_at_peak_deg(sig_a, sig_b, dx)

Estimates target angle in degrees at the peak power bin.

Finds the index of maximum magnitude in sig_a, then returns the monopulse angle estimate at that bin. Suitable for use on RDMs or frequency-domain signals where monopulse is only meaningful at bins containing target power.

Parameters:

Name Type Description Default
sig_a ndarray

Complex signal from the first array element (used for peak detection).

required
sig_b ndarray

Complex signal from the second array element.

required
dx float

Element separation in wavelengths.

required

Returns:

Name Type Description
float float

Estimated angle in degrees at the peak bin.

Source code in src/rad_lab/monopulse.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
def monopulse_angle_at_peak_deg(sig_a: np.ndarray, sig_b: np.ndarray, dx: float) -> float:
    """Estimates target angle in degrees at the peak power bin.

    Finds the index of maximum magnitude in sig_a, then returns the
    monopulse angle estimate at that bin. Suitable for use on RDMs or
    frequency-domain signals where monopulse is only meaningful at bins
    containing target power.

    Args:
        sig_a: Complex signal from the first array element (used for peak detection).
        sig_b: Complex signal from the second array element.
        dx: Element separation in wavelengths.

    Returns:
        float: Estimated angle in degrees at the peak bin.
    """
    theta = monopulse_angle_deg(sig_a, sig_b, dx)
    peak_index = np.unravel_index(np.argmax(np.abs(sig_a)), sig_a.shape)
    return float(theta[peak_index])

monopulse_angle_deg(sig_a, sig_b, dx)

Estimates target angle in degrees at each sample or bin.

Parameters:

Name Type Description Default
sig_a ndarray

Complex signal from the first array element.

required
sig_b ndarray

Complex signal from the second array element.

required
dx float

Element separation in wavelengths.

required

Returns:

Type Description
ndarray

np.ndarray: Estimated angle in degrees at each sample or bin.

Source code in src/rad_lab/monopulse.py
33
34
35
36
37
38
39
40
41
42
43
44
def monopulse_angle_deg(sig_a: np.ndarray, sig_b: np.ndarray, dx: float) -> np.ndarray:
    """Estimates target angle in degrees at each sample or bin.

    Args:
        sig_a: Complex signal from the first array element.
        sig_b: Complex signal from the second array element.
        dx: Element separation in wavelengths.

    Returns:
        np.ndarray: Estimated angle in degrees at each sample or bin.
    """
    return np.rad2deg(np.arcsin(amplitude_monopulse(sig_a, sig_b, dx)))