sdr.albersheim(p_d: ArrayLike, p_fa: ArrayLike, N_nc: ArrayLike = 1) NDArray[float_]

Estimates the minimum required single-sample SNR, given \(N_{NC}\) non-coherent combinations, to achieve a probability of detection \(P_D\) and probability of false alarm \(P_{FA}\). This function implements Albersheim’s equation.

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\).

Returns:

The minimum required single-sample SNR \(\gamma\) in dB.

Notes

Albersheim’s equation is given by:

\[A = \ln \frac{0.62}{P_{FA}}\]

\[B = \ln \frac{P_D}{1 - P_D}\]

\[ \text{SNR}_{\text{dB}} = -5 \log_{10} N_{NC} + \left(6.2 + \frac{4.54}{\sqrt{N_{NC} + 0.44}}\right) \log_{10} \left(A + 0.12AB + 1.7B\right) \]

The error in the estimated minimum SNR is claimed to be less than 0.2 dB for \(10^{-7} \leq P_{FA} \leq 10^{-3}\), \(0.1 \leq P_D \leq 0.9\), and \(1 \le N_{NC} \le 8096\).

References

Examples

In [1]: p_d = 0.9; \
   ...: p_fa = np.logspace(-7, -3, 100)
   ...: 

In [2]: plt.figure(figsize=(8, 4)); \
   ...: plt.semilogx(p_fa, sdr.albersheim(p_d, p_fa, N_nc=1), label="$N_{NC}$ = 1"); \
   ...: plt.semilogx(p_fa, sdr.albersheim(p_d, p_fa, N_nc=2), label="$N_{NC}$ = 2"); \
   ...: plt.semilogx(p_fa, sdr.albersheim(p_d, p_fa, N_nc=10), label="$N_{NC}$ = 10"); \
   ...: plt.semilogx(p_fa, sdr.albersheim(p_d, p_fa, N_nc=20), label="$N_{NC}$ = 20"); \
   ...: plt.legend(); \
   ...: plt.grid(True, which="both"); \
   ...: plt.xlabel("Probability of false alarm, $P_{FA}$"); \
   ...: plt.ylabel("Minimum required SNR (dB)"); \
   ...: plt.title(f"Estimated minimum required SNR across non-coherent combinations for $P_D = 0.9$\nusing Albersheim's approximation"); \
   ...: plt.tight_layout()
   ...: 
../../_images/sdr_albersheim_1.png