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

Calculates the Cramér-Rao lower bound (CRLB) on frequency of arrival (FOA) 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_integration_time: ArrayLike | None = None

The root-mean-square (RMS) integration time \(T_{\text{rms}}\) in Hz. If None, the RMS integration time is calculated assuming a rectangular power envelope, \(T_{\text{rms}} = T/\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 frequency of arrival (FOA) estimation error standard deviation \(\sigma_{\text{foa}}\) in Hz.

Notes

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

\[\sigma_{\text{foa}} = \frac{1}{\pi \sqrt{8} T_{\text{rms}}} \frac{1}{\sqrt{B_n T \gamma}}\]

\[ T_{\text{rms}} = \sqrt{\frac {\int_{-\infty}^{\infty} (t - \mu_t)^2 \cdot \left| x(t - \mu_t) \right|^2 \, dt} {\int_{-\infty}^{\infty} \left| x(t - \mu_t) \right|^2 \, dt} } \]

where \(\gamma\) is the signal-to-noise ratio (SNR), \(\left| x(t) \right|^2\) is the power envelope of the signal, and \(\mu_t\) is the centroid of the power envelope.

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 \(T_{\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 frequency measurement precision is inversely proportional to the integration time of the signal and the square root of the output SNR.

Examples

In [1]: snr = 10

In [2]: bandwidth = np.logspace(5, 8, 101)

In [3]: plt.figure(); \
   ...: plt.loglog(bandwidth, sdr.foa_crlb(snr, 1e-6, bandwidth), label="1 μs"); \
   ...: plt.loglog(bandwidth, sdr.foa_crlb(snr, 1e-5, bandwidth), label="10 μs"); \
   ...: plt.loglog(bandwidth, sdr.foa_crlb(snr, 1e-4, bandwidth), label="100 μs"); \
   ...: plt.loglog(bandwidth, sdr.foa_crlb(snr, 1e-3, bandwidth), label="1 ms"); \
   ...: plt.legend(title="Integration time"); \
   ...: plt.xlim(1e5, 1e8); \
   ...: plt.ylim(1e0, 1e6); \
   ...: plt.xlabel("Bandwidth (Hz), $B$"); \
   ...: plt.ylabel(r"CRLB on FOA (Hz), $\sigma_{\text{foa}}$"); \
   ...: plt.title(f"Cramér-Rao lower bound (CRLB) on FOA estimation error\nstandard deviation with {snr}-dB SNR");
   ...: 
../../_images/sdr_foa_crlb_1.png