sdr.composite_snr(snr1: ArrayLike, snr2: ArrayLike) NDArray[float64]

Calculates the signal-to-noise ratio (SNR) of the product of two signals.

Parameters:
snr1: ArrayLike

The signal-to-noise ratio (SNR) of the first signal \(\gamma_1\) in dB.

snr2: ArrayLike

The signal-to-noise ratio (SNR) of the second signal \(\gamma_2\) in dB.

Returns:

The signal-to-noise ratio (SNR) of the product of the two signals \(\gamma\) in dB.

Notes

The effective or composite SNR \(\gamma\) of the product of two signals with SNRs \(\gamma_1\) and \(\gamma_2\) is given by

\[\frac{1}{\gamma} = \frac{1}{\gamma_1} + \frac{1}{\gamma_2} + \frac{1}{\gamma_1 \gamma_2} .\]

When both \(\gamma_1\) and \(\gamma_2\) are greater than 0 dB, and if \(\gamma_1 = \gamma_2\), then \(\gamma = \gamma_1 / 2 = \gamma_2 / 2\). If one is much less than the other, then \(\gamma\) is approximately equal to the smaller one. When both are less than 0 dB, the composite SNR is approximately \(\gamma = \gamma_1 \gamma_2\).

Note

The constant terms from Stein’s original equations were rearranged. The factor of 2 was removed and incorporated into the CRLB equations. This was done so that when \(\gamma_2 = \infty\) then \(\gamma = \gamma_1\).

References

Examples

Calculate the composite SNR of two signals with equal SNRs. Notice for positive input SNR, the composite SNR is linear with slope 1 and intercept -3 dB. For negative input SNR, the composite SNR is linear with slope 2 and intercept 0 dB.

In [1]: snr1 = np.linspace(-60, 60, 101)

In [2]: plt.figure(); \
   ...: plt.plot(snr1, sdr.composite_snr(snr1, snr1)); \
   ...: plt.xlim(-60, 60); \
   ...: plt.ylim(-60, 60); \
   ...: plt.xlabel("Input SNRs (dB), $\gamma_1$ and $\gamma_2$"); \
   ...: plt.ylabel(r"Composite SNR (dB), $\gamma$"); \
   ...: plt.title("Composite SNR of two signals with equal SNRs");
   ...: 
../../_images/sdr_composite_snr_1.png

Calculate the composite SNR of two signals with different SNRs. Notice the knee of the curve is located at max(0, snr2). Left of the knee, the composite SNR is linear with slope 1 and intercept snr2. Right of the knee, the composite SNR is linear with slope 0 and intercept snr2.

In [3]: snr1 = np.linspace(-60, 60, 101)

In [4]: plt.figure();

In [5]: for snr2 in np.arange(-40, 40 + 10, 10):
   ...:     plt.plot(snr1, sdr.composite_snr(snr1, snr2), label=snr2)
   ...: 

In [6]: plt.legend(title="SNR of signal 2 (dB), $\gamma_2$"); \
   ...: plt.xlim(-60, 60); \
   ...: plt.ylim(-60, 60); \
   ...: plt.xlabel("SNR of signal 1 (dB), $\gamma_1$"); \
   ...: plt.ylabel(r"Composite SNR (dB), $\gamma$"); \
   ...: plt.title("Composite SNR of two signals with different SNRs");
   ...: 
../../_images/sdr_composite_snr_2.png