sdr.toa_crlb(snr: ArrayLike, time: ArrayLike, bandwidth: ArrayLike, rms_bandwidth: ArrayLike | None = None, noise_bandwidth: ArrayLike | None = None) NDArray[float64]

Calculates the Cramér-Rao lower bound (CRLB) on time of arrival (TOA) estimation.

Parameters:
snr: ArrayLike

The signal-to-noise ratio (SNR) of the signal \(\gamma = S / (N_0 B_n)\) in dB.

time: ArrayLike

The integration time \(T\) in seconds.

bandwidth: ArrayLike

The signal bandwidth \(B_s\) in Hz.

rms_bandwidth: ArrayLike | None = None

The root-mean-square (RMS) bandwidth \(B_{s,\text{rms}}\) in Hz. If None, the RMS bandwidth is calculated assuming a rectangular spectrum, \(B_{s,\text{rms}} = B_s/\sqrt{12}\).

noise_bandwidth: ArrayLike | None = None

The noise bandwidth \(B_n\) in Hz. If None, the noise bandwidth is assumed to be the signal bandwidth \(B_s\).

Returns:

The Cramér-Rao lower bound (CRLB) on the time of arrival (TOA) estimation error standard deviation \(\sigma_{\text{toa}}\) in seconds.

Notes

The Cramér-Rao lower bound (CRLB) on the time of arrival (TOA) estimation error standard deviation \(\sigma_{\text{toa}}\) is given by

\[\sigma_{\text{toa}} = \frac{1}{\pi \sqrt{8} B_{s,\text{rms}}} \frac{1}{\sqrt{B_n T \gamma}}\]

\[ B_{s,\text{rms}} = \sqrt{\frac {\int_{-\infty}^{\infty} (f - \mu_f)^2 \cdot S(f - \mu_f) \, df} {\int_{-\infty}^{\infty} S(f - \mu_f) \, df} } \]

where \(\gamma\) is the signal-to-noise ratio (SNR), \(S(f)\) is the power spectral density (PSD) of the signal, and \(\mu_f\) is the centroid of the PSD.

Note

The constant terms from Stein’s original equations were rearranged. The factor of 2 was removed from \(\gamma\) and the factor of \(2\pi\) was removed from \(B_{s,\text{rms}}\) and incorporated into the CRLB equation.

The signal-to-noise ratio (SNR) \(\gamma\) is improved by the coherent integration gain, which is the time-bandwidth product \(B_n T\). The product \(B_n T \gamma\) is the output SNR of the matched filter or correlator, which is equivalent to \(E / N_0\).

\[B_n T \gamma = B_n T \frac{S}{N_0 B_n} = \frac{S T}{N_0} = \frac{E}{N_0}\]

Warning

According to Stein, the CRLB equation only holds for output SNRs greater than 10 dB. This ensures there is sufficient SNR to correctly identify the time/frequency peak without high \(P_{fa}\). Given the rearrangement of scaling factors, CRLB values with output SNRs less than 7 dB are set to NaN.

The time measurement precision is inversely proportional to the bandwidth of the signal and the square root of the output SNR.

Examples

In [1]: snr = 10

In [2]: time = np.logspace(-6, 0, 101)

In [3]: plt.figure(); \
   ...: plt.loglog(time, sdr.toa_crlb(snr, time, 1e5), label="100 kHz"); \
   ...: plt.loglog(time, sdr.toa_crlb(snr, time, 1e6), label="1 MHz"); \
   ...: plt.loglog(time, sdr.toa_crlb(snr, time, 1e7), label="10 MHz"); \
   ...: plt.loglog(time, sdr.toa_crlb(snr, time, 1e8), label="100 MHz"); \
   ...: plt.legend(title="Bandwidth"); \
   ...: plt.xlim(1e-6, 1e0); \
   ...: plt.ylim(1e-12, 1e-6); \
   ...: plt.xlabel("Integration time (s), $T$"); \
   ...: plt.ylabel(r"CRLB on TOA (s), $\sigma_{\text{toa}}$"); \
   ...: plt.title(f"Cramér-Rao lower bound (CRLB) on TOA estimation error\nstandard deviation with {snr}-dB SNR");
   ...: 
../../_images/sdr_toa_crlb_1.png