def ber_vs_evm_qam(evm_dB, M): """Calculate the bit-error-rate for a M-QAM signal as a function of EVM. Taken from _[1]. Note that here we miss the square in the definition to match the plots given in the paper. Parameters ---------- evm_dB : array_like Error-Vector Magnitude in dB M : integer order of M-QAM Returns ------- ber : array_like bit error rate in linear units References ---------- ...[1] Shafik, R. (2006). On the extended relationships among EVM, BER and SNR as performance metrics. In Conference on Electrical and Computer Engineering (p. 408). Retrieved from http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4178493 Note ---- The EVM in dB is defined as $EVM(dB) = 10 \log_{10}{P_{error}/P_{reference}}$ (see e.g. Wikipedia) this is different to the percentage EVM which is defined as the RMS value i.e. $EVM(\%)=\sqrt{1/N \sum^N_{j=1} [(I_j-I_{j,0})^2 + (Q_j -Q_{j,0})^2]} $ so there is a difference of a power 2. So to get the same plot as in _[1] we need to enter the log of EVM^2 """ L = np.sqrt(M) evm = dB2lin(evm_dB) ber = 2 * (1-1/L) / np.log2(L) * q_function(np.sqrt(3 * np.log2(L) / (L ** 2 - 1) * (2 / (evm * np.log2(M))))) return ber
def test_dB2lin(self, nmodes): s = signals.SignalQAMGrayCoded(64, 2**12, nmodes=nmodes) s2 = helpers.dB2lin(s) assert s.shape == s2.shape
def test_dB2lin(self): s = signals.SignalQAMGrayCoded(64, 2**12) s2 = helpers.dB2lin(s) assert type(s) is type(s2)