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 γ=S/(N0Bn) in dB.

time: ArrayLike

The integration time T in seconds.

bandwidth: ArrayLike

The signal bandwidth Bs in Hz.

rms_bandwidth: ArrayLike | None = None

The root-mean-square (RMS) bandwidth Bs,rms in Hz. If None, the RMS bandwidth is calculated assuming a rectangular spectrum, Bs,rms=Bs/12.

noise_bandwidth: ArrayLike | None = None

The noise bandwidth Bn in Hz. If None, the noise bandwidth is assumed to be the signal bandwidth Bs.

Returns:

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

Notes

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

σtoa=1π8Bs,rms1BnTγ

Bs,rms=(fμf)2S(fμf)dfS(fμf)df

where γ is the signal-to-noise ratio (SNR), S(f) is the power spectral density (PSD) of the signal, and μ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 γ and the factor of 2π was removed from Bs,rms and incorporated into the CRLB equation.

The signal-to-noise ratio (SNR) γ is improved by the coherent integration gain, which is the time-bandwidth product BnT. The product BnTγ is the output SNR of the matched filter or correlator, which is equivalent to E/N0.

BnTγ=BnTSN0Bn=STN0=EN0

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 Pfa. 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