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).
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
The Error Magnitude for all given symbols is given by
For the RMS EVM, the transmitted signal’s magnitude is taken as the normalization reference.
Then the RMS EVM is given by
If EVM is expressed as percentage, multiply the above EVM by 100. To express EVM in decibels,
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")