Error vector magnitude (EVM) — definition, %RMS, and the link to SNR

Digital Modulations 101 — 5 lessons (same on every page in this path)

1. BPSK → 2. QPSK → 3. M-PSK sim → 4. QAM sim → 5. EVM (you are here)

Tools: BER vs Eb/N0 · EVM → SNR · Eb/N0 ↔ SNR

Lesson 5 of 5. You can draw BPSK/QPSK/QAM. EVM is how instruments and 3GPP-style tests judge a live modem. Pair this page with the EVM → SNR converter.

In one sentence: EVM is the RMS size of the error vectors between measured and ideal constellation points — a compact PHY quality metric closely tied to SNR.

Error Vector Magnitude (EVM) is a key performance metric in communication systems, particularly in digital modulation schemes. It quantifies the difference between the actual transmitted signal and the received signal, thereby measuring the quality of the transmitted signal. EVM is expressed as a percentage or in decibels (dB).

Applications of EVM

EVM is a crucial tool across various communication technologies, providing a quantitative measure of signal quality, which is essential for the development, testing, and maintenance of modern communication systems.

For example, in radar systems, EVM is used to evaluate the performance of such systems, particularly in digital signal processing stages where maintaining signal fidelity is essential for accurate target detection and characterization. During the development of new communication systems or modulation techniques or algorithms, EVM is used to evaluate and optimize prototypes before they are commercialized. EVM is also critical for monitoring the integrity of signals in satellite communication, where maintaining high signal quality is crucial due to long transmission distances and potential interference. In wireless communication standards like LTE, 5G, Wi-Fi, and others, EVM is used as a key metric to ensure that transmitters comply with the required signal quality standards. In broadband technologies like DOCSIS (cable modems) and DSL, EVM is utilized to measure and optimize the quality of the transmitted signals over cable or telephone lines.

How EVM is calculated

Error Vector Magnitude (EVM) is a measure of the difference between a transmitted signal and the ideal version of that signal in a digital communication system. It quantifies the distortion or error introduced during transmission by calculating the magnitude of the vector difference between the actual (measured) signal point and the ideal (reference) signal point in a constellation diagram.

EVM is expressed as a percentage or in decibels (dB) and is used as an indicator of signal quality, where a lower EVM value signifies a signal closer to the ideal, indicating better performance and less distortion. It is widely used in the evaluation and testing of digital modulation schemes, such as QAM (Quadrature Amplitude Modulation) and PSK (Phase Shift Keying), in various communication systems.

Error Vector Magnitude (EVM) is calculated on the IQ plane by comparing the actual transmitted signal to the ideal reference signal at each point in the constellation diagram (refer Figure 1).

Figure 1: Error Vector Magnitude (EVM) for one symbol

There are different flavors of EVM and the RMS (Root Mean Square) EVM is one among them which is widely used.

Let there be symbols that are being transmitted. Let (I_ref[i], Q_{ref}[i]) are the ideal constellation points for the transmitted symbols and (I_meas[i], Q_{meas}[i]) are the received/measured constellation points for the corresponding symbols.

The error vector for one symbol is computed as

\[\text{Error Vector} = Tx[i] – Rx[i] = \overbrace{ I_{ref}[i]-I_{meas}[i]}^{I_{err}[i]} +j \left( \overbrace{Q_{ref}[i]-Q_{meas}[i]}^{Q_{err}[i]} \right)\]

The Error Magnitude for all given symbols is given by

\[\text{Error magnitude} = |Tx – Rx| = \sqrt{ \frac{1}{N} \sum_{i=0}^{N-1}\left( I^2_{err}[i] + Q^2_{err}[i]\right) }\]

For the RMS EVM, the transmitted signal’s magnitude is taken as the normalization reference.

\[\text{Magnitude of Tx signal} = |Tx| = \sqrt{\frac{1}{N} \sum_{i=0}^{N-1} \left( I^2_{ref}[i] + Q^2_{ref}[i] \right)}\]

Then the RMS EVM is given by

\[\boxed{ \text{EVM}_{\text{RMS}} =\sqrt{ \frac{\displaystyle{\frac{1}{N} \sum_{i=0}^{N-1}\left( I^2_{err}[i] + Q^2_{err}[i]\right) }}{ \displaystyle{\frac{1}{N} \sum_{i=0}^{N-1} \left( I^2_{ref}[i] + Q^2_{ref}[i] \right)}}} }\]

If EVM is expressed as percentage, multiply the above EVM by 100. To express EVM in decibels,

\[\boxed{\text{EVM(dB)} = 20 \cdot log_{10} \left( \text{EVM}_{\text{RMS}} \right)}\]

Python code

The following python code can be used for computing the EVM for given transmitted and received signal sequences.

import numpy as np

def calculate_evm(transmitted_signal, received_signal):
    """
    Calculate the Error Vector Magnitude (EVM) between transmitted and received signals.

    Parameters:
    transmitted_signal (list of complex): List of transmitted signal values.
    received_signal (list of complex): List of received signal values.

    Returns:
    float: EVM in dB.
    """
    # Convert lists to numpy arrays for easier calculations
    tx = np.array(transmitted_signal)
    rx = np.array(received_signal)

    # Ensure the transmitted and received signals have the same length
    if len(tx) != len(rx):
        raise ValueError("Transmitted and received signal sequences must have the same length")

    # Calculate the root mean square (RMS) value of the error vector
    rms_error = np.sqrt(np.mean(np.abs((tx-rx))**2))

    # Calculate the RMS value of the transmitted signal
    rms_tx = np.sqrt(np.mean(np.abs(tx)**2))

    # Calculate EVM in dB
    print(rms_error)
    print(rms_tx)
    evm = 20 * np.log10(rms_error / rms_tx)

    return evm

# Example usage
transmitted_signal = [1+1j, 0-1j, -1+0j, 0+1j]  # Example transmitted signal
received_signal = [0.9+1.1j, -0.1-1.2j, -1.1+0.1j, 0+0.9j]  # Example received signal

evm_dB = calculate_evm(transmitted_signal, received_signal)
print(f"EVM: {evm_dB:.2f} dB")

What the error vector looks like on QPSK

RMS EVM is the root-mean-square length of those orange error vectors, normalized by the reference constellation energy. The figure makes the definition geometric; the short Python below reproduces the usual percent-EVM estimate for unit-energy QPSK in AWGN.

EVM error vectors on QPSK constellation
Black: ideal QPSK references. Blue: measured symbols. Orange: error vectors used in EVM.

Python: RMS EVM for unit-energy QPSK

import numpy as np

def rms_evm_percent(reference, measured):
    """EVM_rms (%) = 100 * sqrt(E[|e|^2] / E[|ref|^2])."""
    e = measured - reference
    return 100 * np.sqrt(np.mean(np.abs(e)**2) / np.mean(np.abs(reference)**2))

const = np.array([1+1j, -1+1j, -1-1j, 1-1j]) / np.sqrt(2)
idx = np.random.randint(0, 4, 5000)
ref = const[idx]
snr_db = 20
sig = ref + (10**(-snr_db/20)/np.sqrt(2))*(np.random.randn(5000)+1j*np.random.randn(5000))
evm = rms_evm_percent(ref, sig)
# For AWGN-only impairment, EVM% ≈ 100/10^(SNR_db/20)
print(f'EVM ≈ {evm:.2f}%  (rule-of-thumb {100/10**(snr_db/20):.2f}%)')

Convert EVM to SNR with the EVM → SNR calculator.

← Previous: QAM sim End of path — try the tools above

FAQ

What is the recommended reading order? Follow the five lessons at the top: BPSK → QPSK → M-PSK → QAM → EVM. Use the BER and EVM calculators to check numbers as you go.

EVM percent or EVM in dB? Both appear in standards. This article and the converter keep them consistent so you can jump to a BER operating point.

Similar articles

Leave a Comment