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:
constellation = [-1-1i, -1+1i, 1-1i, 1+1i];
refSignal = constellation(randi([1, 4], 1000, 1));
modSignal = awgn(refSignal, SNR_dB, 'measured');
modSignal = modSignal + 0.1 * exp(1i * pi / 4);
modSignal = modSignal .* (1 + 0.2 * (randn(size(modSignal)))) + 1i * randn(size(modSignal));
errorVector = modSignal - refSignal;
radialErrorVector = abs(errorVector);
circumferentialErrorVector = angle(errorVector);
rmsRadialError = rms(radialErrorVector);
rmsCircumferentialError = rms(circumferentialErrorVector);
evmRadial = 100 * rmsRadialError / mean(abs(refSignal))
evmCircumferential = 100 * rmsCircumferentialError / mean(abs(refSignal))
evmCircumferential = 107.1628
Please follow the MATLAB documentation link below to learn more about the ‘comm.EVM’ object:
I hope this helps!
Thanks,
Abhimenyu