- 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}\).
See also
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"); ...: