sdr.peebles(p_d: ArrayLike, p_fa: ArrayLike, n_nc: ArrayLike) NDArray[float64]

Estimates the non-coherent integration gain for a given probability of detection \(P_d\) and false alarm \(P_{fa}\).

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

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

Returns:

The non-coherent integration gain \(G_{nc}\).

Notes

This function implements Peebles’ equation, given by

\[ G_{nc} = 6.79 \cdot \left(1 + 0.253 \cdot P_d\right) \cdot \left(1 + \frac{\log_{10}(1 / P_{fa})}{46.6}\right) \cdot \log_{10}(N_{nc}) \cdot \left(1 - 0.14 \cdot \log_{10}(N_{nc}) + 0.0183 \cdot (\log_{10}(n_{nc}))^2\right) \]

The error in the estimated non-coherent integration gain is claimed to be less than 0.8 dB for

\[0.5 \leq P_d \leq 0.999\]
\[10^{-10} \leq P_{fa} \leq 10^{-2}\]
\[1 \le N_{nc} \le 100 .\]

Peebles’ equation approximates the non-coherent integration gain using a square-law detector.

References

Examples

Compare the theoretical non-coherent gain for a square-law detector against the approximation from Peebles’s equation. This comparison plots curves for various post-integration probabilities of detection.

In [1]: fig, ax = plt.subplots(1, 2, sharey=True); \
   ...: p_fa = 1e-8; \
   ...: n = np.linspace(1, 100, 31).astype(int);
   ...: 

In [2]: for p_d in [0.5, 0.8, 0.95]:
   ...:     snr = sdr.min_snr(p_d, p_fa, detector="square-law")
   ...:     ax[0].semilogx(n, sdr.non_coherent_gain(n, snr, p_fa=p_fa, detector="square-law", snr_ref="output"), label=p_d)
   ...: 

In [3]: ax[0].semilogx(n, sdr.coherent_gain(n), color="k", label="Coherent"); \
   ...: ax[0].legend(title="$P_d$"); \
   ...: ax[0].set_xlabel("Number of samples, $N_{nc}$"); \
   ...: ax[0].set_ylabel("Non-coherent gain, $G_{nc}$"); \
   ...: ax[0].set_title("Theoretical");
   ...: 

In [4]: for p_d in [0.5, 0.8, 0.95]:
   ...:     ax[1].semilogx(n, sdr.peebles(p_d, p_fa, n), linestyle="--", label=p_d)
   ...: 

In [5]: ax[1].semilogx(n, sdr.coherent_gain(n), color="k", label="Coherent"); \
   ...: ax[1].legend(title="$P_d$"); \
   ...: ax[1].set_xlabel("Number of samples, $N_{nc}$"); \
   ...: ax[1].set_ylabel("Non-coherent gain, $G_{nc}$"); \
   ...: ax[1].set_title("Peebles's approximation");
   ...: 
../../_images/sdr_peebles_1.png