sdr.shnidman(p_d: ArrayLike, p_fa: ArrayLike, n_nc: ArrayLike = 1, swerling: int = 0) NDArray[float64]

Estimates the minimum input signal-to-noise ratio (SNR) required to achieve the desired probability of detection \(P_d\) for the Swerling target model.

Parameters:
p_d: ArrayLike

The desired probability of detection \(P_d\) in \((0, 1)\).

p_fa: ArrayLike

The desired probability of false alarm \(P_{fa}\) in \((0, 1)\).

n_nc: ArrayLike = 1

The number of non-coherent combinations \(N_{nc} \ge 1\).

swerling: int = 0

The Swerling target model.

  • 0: Non-fluctuating target.

  • 1: Dwell-to-dwell decorrelation. Rayleigh PDF. Target has many scatterers, none are dominant. Set of \(N_{nc}\) returned pulses are correlated within a dwell but independent with the next set of \(N_{nc}\) pulses on the next dwell.

  • 2: Pulse-to-pulse decorrelation. Rayleigh PDF. Target has many scatterers, none are dominant. Set of \(N_{nc}\) returned pulses are independent from each other within a dwell.

  • 3: Dwell-to-dwell decorrelation. Chi-squared PDF with 4 degrees of freedom. Target has many scatterers, with one dominant. Set of \(N_{nc}\) returned pulses are correlated within a dwell but independent with the next set of \(N_{nc}\) pulses on the next dwell.

  • 4: Pulse-to-pulse decorrelation. Chi-squared PDF with 4 degrees of freedom. Target has many scatterers, with one dominant. Set of \(N_{nc}\) returned pulses are independent from each other within a dwell.

  • 5: Same as Swerling 0.

Returns:

The minimum required input SNR \(\gamma\) in dB.

See also

sdr.min_snr

Notes

This function implements Shnidman’s equation. The error in the estimated minimum SNR is claimed to be less than 1 dB for

\[0.1 \leq P_d \leq 0.99\]
\[10^{-9} \leq P_{fa} \leq 10^{-3}\]
\[1 \le N_{nc} \le 100 .\]

References

Examples

Compare the theoretical minimum required SNR across Swerling target models for 1, 3, and 30 non-coherent combinations.

In [1]: p_d = 0.9; \
   ...: p_fa = np.logspace(-12, -1, 21)
   ...: 

In [2]: fig, ax = plt.subplots(3, 1, figsize=(8, 12));

In [3]: for i, n_nc in enumerate([1, 3, 30]):
   ...:     ax[i].semilogx(p_fa, sdr.shnidman(p_d, p_fa, n_nc=n_nc, swerling=0), label=0)
   ...:     ax[i].semilogx(p_fa, sdr.shnidman(p_d, p_fa, n_nc=n_nc, swerling=1), label=1)
   ...:     ax[i].semilogx(p_fa, sdr.shnidman(p_d, p_fa, n_nc=n_nc, swerling=2), label=2)
   ...:     ax[i].semilogx(p_fa, sdr.shnidman(p_d, p_fa, n_nc=n_nc, swerling=3), label=3)
   ...:     ax[i].semilogx(p_fa, sdr.shnidman(p_d, p_fa, n_nc=n_nc, swerling=4), label=4)
   ...:     ax[i].legend(title="Swerling")
   ...:     ax[i].set_xlabel("Probability of false alarm, $P_{fa}$")
   ...:     ax[i].set_ylabel("Minimum required input SNR (dB), $\gamma$")
   ...:     ax[i].set_title(f"$N_{{nc}} = {n_nc}$")
   ...: 

In [4]: fig.suptitle("Minimum required SNR across Swerling target models");
../../_images/sdr_shnidman_1.png