EVM in radial and circumferential directions?

1 view (last 30 days)
Can comm.EVM measure EVM in the radial and circumferential (i.e., along the unit circle) directions separately?
  2 Comments
Image Analyst
Image Analyst on 8 Oct 2023
What is EVM? I don't know that acronymn.
Jerry Malone
Jerry Malone on 8 Oct 2023
EVM means error vector magnitude. It's a measure of performance in digital communications systems. It's the distance from the ideal constellation point to the actual (noise+distortion) point as a percentage of the distance from the origin to the ideal point. The RMS value of all such percentages gives you a measure of comms system performance. Lower is better. The Matlab comms package has a function for computing EVM.

Sign in to comment.

Accepted Answer

Abhimenyu
Abhimenyu on 18 Oct 2023
Hi Jerry,
I understand that you want to measure EVM in radial and circumferential direction separately. comm.EVM object measures the root mean squared (RMS) EVM, maximum EVM, and percentile EVM of a received signal. It gives overall EVM as a percentage of distance from the origin to ideal point. It does not separate the radial and circumferential components.
Please follow the example code below to understand the EVM measurements in different directions:
% Generate a reference signal (QPSK)
constellation = [-1-1i, -1+1i, 1-1i, 1+1i];
refSignal = constellation(randi([1, 4], 1000, 1));
% Generate a modulated signal with noise and distortion
SNR_dB = 20; % Signal-to-noise ratio in decibels
modSignal = awgn(refSignal, SNR_dB, 'measured'); % Add white Gaussian noise
modSignal = modSignal + 0.1 * exp(1i * pi / 4); % Add constant phase offset
modSignal = modSignal .* (1 + 0.2 * (randn(size(modSignal)))) + 1i * randn(size(modSignal)); % Add random amplitude and phase variation
% Compute the error vector
errorVector = modSignal - refSignal;
% Compute the radial component of the error vector
radialErrorVector = abs(errorVector);
% Compute the circumferential component of the error vector
circumferentialErrorVector = angle(errorVector);
% Calculate the RMS values of the radial and circumferential errors
rmsRadialError = rms(radialErrorVector);
rmsCircumferentialError = rms(circumferentialErrorVector);
% Normalize the error values by the magnitude of the reference signal to obtain the EVM in each direction
evmRadial = 100 * rmsRadialError / mean(abs(refSignal))
evmRadial = 74.3216
evmCircumferential = 100 * rmsCircumferentialError / mean(abs(refSignal))
evmCircumferential = 107.1628
Please follow the MATLAB documentation link below to learn more about the comm.EVMobject:
I hope this helps!
Thanks,
Abhimenyu
  2 Comments
Jerry Malone
Jerry Malone on 22 Oct 2023
That is very good, clear, well-documented code. Thanks.
I wish everyone wrote Matlab code like this.
Jerry Malone
Jerry Malone on 22 Oct 2023
Here's how I did it:
% Generate a reference constellation (QPSK)
constellation = [-1-1i, -1+1i, 1-1i, 1+1i]/sqrt(2);
refSignal = constellation(randi([1, 4], 1000, 1));
% Generate a modulated constellation with noise and phase rotation:
SNR_dB = 20; % Signal-to-noise ratio in decibels
modSignal = awgn(refSignal, SNR_dB, 'measured'); % Add white Gaussian noise
modSignal = modSignal*.exp(1i*pi/8); % Constant phase rotation of 22.5 deg.
% Compute radial error vector as a % of reference:
radialErrorVector = 100*(abs(modSignal)-abs(refSignal))./abs(refSignal);
% Compute circumferential error vector as % of reference:
circumferentialErrorVector = 100*(abs(refSignal).*(angle(modSignal)-angle(refSignal)))./abs(refSignal);
mean(radialErrorVector)
mean(circumferentialErrorVector)
rms(radialErrorVector)
rms(circumferentialErrorVector)

Sign in to comment.

More Answers (0)

Products


Release

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!