Skip to Main Content Skip to Search
Home |   Select Country  Choose Country  |  Contact Us  |  Cart Store 
Create Account | Log In
Products & Services Solutions Academia Support User Community Company
spacer spacer spacer spacer spacer spacer

 

Communications Toolbox 4.4

EVM Measurements for an EDGE System

This demonstration shows how to use the COMMMEASURE.EVM object to measure the error vector magnitude (EVM) of a simulated EDGE [ 1 ] transmitter.

Contents

Error Vector Magnitude (EVM)

The error vector magnitude (EVM) is a measure of the difference between a reference waveform, which is the error-free modulated signal, and the actual transmitted waveform. EVM is used to quantify the modulation accuracy of a transmitter. [ 2 ] requires that a mobile EDGE transmitter shall not have an RMS EVM value worse than 10% for any burst. It also specifies that the peak EVM, which is defined as the average of burst maximum EVMs, shall be less than or equal to 30%, and that the 95th percentile value shall be less than or equal to 15%.

System Parameters

An EDGE system has the following system parameters.

Tnormal = 6/1625000;     % Normal symbol duration in seconds
M = 8;                   % Modulation order (8-PSK)

[ 2 ] specifies that the measurements are performed during the useful part of the burst, excluding tail bits, over at least 200 bursts. To account for filter delays, we include 9 more symbols in the simulation of the transmitted symbol. We chose to oversample the transmitted signal by four. We assume an SNR of 60 dB to account for transmitter and test hardware imperfections.

burstLen1 = 174+78+174;  % Number of symbols in the useful part of the burst
burstLen2 = burstLen1+9; % Number of symbols in the burst
numBursts = 200;         % Number of bursts
Nsamp  = 4;              % Number of samples that represents a symbol
Fs = Nsamp/Tnormal;      % Final sampling rate
SNR = 60;                % Simulated signal-to-noise ratio in dB

Initialization

Section 3.2 of [ 1 ] defines the constellation for the 8-PSK symbols. We use 'User-defined' symbol order for the MODEM.PSKMOD object to create the required symbol mapping. The 8-PSK symbols are continuously rotated with $$3\pi/8$ radians per symbol before pulse shaping.

Section 3.5 of [ 1 ] defines the pulse shape as a linearized GMSK pulse, i.e. the main component in a Laurent decomposition of the GMSK modulation [ 3 ]. We use a helper function to compute the filter coefficients and use a direct-form FIR digital filter, DFILT.DFFIR, to create the pulse shaping filter. We normalize the filter to obtain unity gain at the main tap.

We use a local random number stream to produce reproducible results.

% Create an 8-PSK modulator
hMod = modem.pskmod('M', 8, 'SymbolOrder', 'User-define', ...
    'SymbolMapping', [7 3 2 0 1 5 4 6]);

% Calculate the phase rotation vector
phaseRotation1 = exp(1i*(0:burstLen2-1)'*3*pi/8);
phaseRotation2 = exp(1i*(0:burstLen1-1)'*3*pi/8);

% Create a linearized GMSK pulse shaping filter
c0 = commEDGE_getLinearizedGMSKPulse(Nsamp);
hLinGMSK = dfilt.dffir(c0/max(c0));

% Create a local random stream to be used by random number generators
hStr = RandStream('mt19937ar', 'Seed', 55408);

Measurement filter

Section 4.6.2 of [ 2 ] defines the measurement filter as a raised cosine filter with a roll-off factor of 0.25. We use the FDESIGN.PULSESHAPING object to create this filter. Since the window is defined over 7.5 symbol durations, we design the filter to be eight symbols long. The measurement filter is windowed by multiplying its impulse response by a raised cosine window. We use a helper function to create the window.

% Design a raised cosine filter with roll off factor 0.25
Nsym = 8;       % Filter order in symbols
beta = 0.25;    % Roll-off factor
measFiltDef = fdesign.pulseshaping(Nsamp, 'Raised Cosine', ...
    'Nsym,Beta', Nsym, beta, Nsamp/Tnormal);
hMeasFilt = design(measFiltDef);

% Apply the window and normalize the filter gain
w = commEDGE_getRaisedCosineWindow(Nsamp);
hMeasFilt.Numerator = hMeasFilt.Numerator.*w;

EVM Measurements Object

The Communications Toolbox™ provides COMMMEASURE.EVM object to calculate RMS EVM, Maximum EVM, and Xth percentile EVM values. By default, the object calculates the 95th percentile EVM value.

hEVM = commmeasure.EVM
hEVM =

                   Type: 'EVM Measurements'
    NormalizationOption: 'Average reference signal power'
                 RMSEVM: NaN
             MaximumEVM: 0
             Percentile: 95
          PercentileEVM: NaN
        NumberOfSymbols: 0

Simulation

We first generate random symbols, modulate these symbols, and apply symbol rotation. We then pulse shape the rotated symbols and add white Gaussian noise. Before EVM measurements, we pass these signals through the measurement filter. The EVM object assumes that received symbols, sd, and reference symbols, xd, are synchronized, and sampled at the same rate. Also, the measurements should be performed on the useful part of the burst. For our simulation, the useful part starts after the filter delay and extends burstLen1 symbols. We downsample the received signal, s, and transmitted signal, xUp, and synchronize them given the filter delays.

[ 2 ] requires the RMS EVM and the peak EVM measurements to be performed over a burst. Since, the EVM object calculates the RMS EVM and Maximum EVM continuously, we need to reset the RMS EVM and Maximum EVM measurement after processing each burst. We calculate the worst case RMS EVM and average maximum EVM outside the EVM object.

We ran the simulation for 200 bursts. We see that the simulated transmitter meets the criteria mentioned in Error Vector Magnitude section above.

% Calculate delays
refSigDelay = (length(hLinGMSK.Numerator) - 1) / 2;
delayXUptoS = (length(hMeasFilt.Numerator) - 1)/2;
rcvSigDelay = refSigDelay + delayXUptoS;

% Initialize total peak EVM
totalMaxEVM = 0;
maxRMSEVM = 0;

% Loop over bursts
for p=1:numBursts
    % Generate random data
    d = randi(hStr, [0 hMod.M-1], burstLen2, 1);
    % Modulate
    x = modulate(hMod, d);
    % Rotate phase
    x = x .* phaseRotation1;
    % Pulse shape
    xUp = filter(hLinGMSK, upsample(x, Nsamp));
    % Add noise
    r = awgn(xUp, SNR, 'measured', hStr);
    % Pass through the measurement filter
    s = filter(hMeasFilt, r);
    % Downsample both received and reference signals.  Account for the filte
r
    % delays
    sd = s(rcvSigDelay+1:Nsamp:end);
    xd = xUp(refSigDelay+1:Nsamp:end);
    % Reset EVM object
    reset(hEVM, 'RMSEVM', 'MaximumEVM')
    % Update the EVM object
    update(hEVM, sd(1:burstLen1), xd(1:burstLen1))
    % Update maximum RMS EVM
    maxRMSEVM = max([maxRMSEVM hEVM.RMSEVM]);
    % Update maximum EVM sum
    totalMaxEVM = totalMaxEVM + hEVM.MaximumEVM;
end

% Calculate peak EVM
peakEVM = totalMaxEVM / numBursts;

% Display results
fprintf(' Worst case RMS EVM (%%): %f\n', maxRMSEVM)
fprintf('           Peak EVM (%%): %f\n', peakEVM)
fprintf('95th percentile EVM (%%): %f\n', hEVM.PercentileEVM)
 Worst case RMS EVM (%): 9.249154
           Peak EVM (%): 17.743179
95th percentile EVM (%): 13.865667

Selected Bibliography

  1. 3GPP TS 45.004, "Radio Access Network; Modulation," Release 7, v7.2.0, 2008-02
  2. 3GPP TS 45.005, "Radio Access Network; Radio transmission and reception," Release 8, v8.1.0, 2008-05
  3. Laurent, Pierre, "Exact and Approximate Construction of Digital Phase Modulations by Superposition of Amplitude Modulated Pulses (AMP)," IEEE® Trans. Comm., Vol. COM-34, No. 2, Feb. 1986, pp. 150-160.
Contact sales
Trial software
E-mail this page

Get Pricing and
Licensing Options