EVM in radial and circumferential directions?

4 ビュー (過去 30 日間)
Jerry Malone
Jerry Malone 2023 年 10 月 8 日
コメント済み: Jerry Malone 2023 年 10 月 22 日
Can comm.EVM measure EVM in the radial and circumferential (i.e., along the unit circle) directions separately?
  2 件のコメント
Image Analyst
Image Analyst 2023 年 10 月 8 日
What is EVM? I don't know that acronymn.
Jerry Malone
Jerry Malone 2023 年 10 月 8 日
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.

サインインしてコメントする。

採用された回答

Abhimenyu
Abhimenyu 2023 年 10 月 18 日
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 件のコメント
Jerry Malone
Jerry Malone 2023 年 10 月 22 日
That is very good, clear, well-documented code. Thanks.
I wish everyone wrote Matlab code like this.
Jerry Malone
Jerry Malone 2023 年 10 月 22 日
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)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangePHY Components についてさらに検索

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by