sdr.shannon_limit_ebn0(rho: ArrayLike) NDArray[float64]

Calculates the Shannon limit on the bit energy-to-noise power spectral density ratio \(E_b/N_0\) in the AWGN channel.

Parameters:
rho: ArrayLike

The nominal spectral efficiency \(\rho\) of the modulation in bits/2D.

Returns:

The Shannon limit on \(E_b/N_0\) in dB.

Notes

\[C = \rho = \log_2\left(1 + \frac{S}{N}\right) = \log_2\left(1 + \rho\frac{E_b}{N_0}\right) \ \ \text{bits/2D}\]
\[\frac{E_b}{N_0} = \frac{2^{\rho} - 1}{\rho}\]

Examples

The absolute Shannon limit on power efficiency is -1.59 dB \(E_b/N_0\). This can only be achieved when the channel capacity approaches 0.

In [1]: sdr.shannon_limit_ebn0(0)
Out[1]: -1.591745389548616

The Shannon limit for various FEC code rates is shown below. The modulation is assumed to be binary.

In [2]: rate = np.array([1/8, 1/4, 1/3, 1/2, 2/3, 3/4, 7/8])  # Code rate, n/k

In [3]: rho = 2 * rate  # bits/2D

In [4]: sdr.shannon_limit_ebn0(rho)
Out[4]: 
array([-1.21002545, -0.8174569 , -0.54974021,  0.        ,  0.56859734,
        0.85986396,  1.30533298])

Plot the AWGN channel capacity as a function of \(E_b/N_0\).

In [5]: rho = np.logspace(-2, 1, 101)

In [6]: ebn0 = sdr.shannon_limit_ebn0(rho)

In [7]: plt.figure(); \
   ...: plt.semilogy(ebn0, rho); \
   ...: plt.xlabel("Bit energy-to-noise PSD ratio (dB), $E_b/N_0$"); \
   ...: plt.ylabel("Capacity (bits/2D), $C$"); \
   ...: plt.title("Capacity of the AWGN Channel");
   ...: 
../../_images/sdr_shannon_limit_ebn0_1.png