Измерение EVM 5G формы волны NR-TM

Этот пример измеряет величину вектора ошибок (EVM) тестовой модели NR (NR-TM) форма волны с фазой шумовые и нарушения нелинейности без памяти.

Введение

3GPP 5G стандарт NR задает набор нисходящих форм волны, известных как тестовые модели (NR-TM), в целях базовой станции тестирование РФ. NR-TM для частотного диапазона 1 (FR1) задан в TS 38.141-1, и NR-TM для частотного диапазона 2 (FR2) задан в TS 38.141-2.

В этом примере показано, как сгенерировать форму волны NR-TM и добавить нарушения в нее. Здесь, мы считаем фазу шумовой и нелинейностью без памяти. Мы затем вычисляем EVM получившегося сигнала. RMS и пиковый EVM построены на символ OFDM, паз и поднесущую. Полный EVM также вычисляется. Фигура ниже показов цепь обработки реализована в этом примере.

Параметры симуляции

Каждая форма волны NR-TM задана комбинацией:

  • Имя ТМ NR

  • Пропускная способность канала

  • Интервал поднесущей

  • Режим Duplexing

% Release 15 NR-TM test models for FR1 and FR2
% Select one of the NR-TMs among:
% "NR-FR1-TM1.1","NR-FR1-TM1.2","NR-FR1-TM2",...
% "NR-FR1-TM2a","NR-FR1-TM3.1","NR-FR1-TM3.1a",...
% "NR-FR1-TM3.2","NR-FR1-TM3.3","NR-FR2-TM1.1",...
% "NR-FR2-TM2","NR-FR2-TM3.1"
nrtm = "NR-FR1-TM3.2";

% Select the NR-TM waveform parameters
bw   = "10MHz"; % Channel bandwidth
scs  = "30kHz"; % Subcarrier spacing
dm   = "FDD";   % Duplexing mode

fprintf('TM = %s\n', nrtm);
TM = NR-FR1-TM3.2

Сгенерируйте форму волны TM

Пропускная способность канала и комбинация разрядки поднесущей должны быть допустимой парой из связанной таблицы настройки пропускной способности FR. Технические требования (TS 38.141-2) задают NR-TM FR2 для TDD только, но этот пример также позволяет формам волны FDD быть созданными.

Создайте объект генератора для выбранного NR-TM.

tmwavegen = hNRReferenceWaveformGenerator(nrtm,bw,scs,dm);

Сгенерируйте форму волны txWaveform. По умолчанию одна система координат создается для FDD и два для TDD. tmwaveinfo выведите содержит информацию о сгенерированном сигнале. resourcesInfo выведите содержит информацию о ресурсах, выделенных PDSCH и PDSCH DM-RS в сгенерированном сигнале. Мы генерируем три графика:

  • Местоположение канала в сетках ресурса

  • Заполнение пропускной способности и график защитных полос

  • Сетки ресурса уровней мощности

[txWaveform,tmwaveinfo,resourcesinfo] = generateWaveform(tmwavegen);

% Visualize the associated PRB and subcarrier resource grids
displayResourceGrid(tmwavegen);

Сгенерированная форма волны TM может содержать больше чем один PDSCH. Функциональный hListTargetPDSCHs() выбирает целевой PDSCHs, чтобы проанализировать. Это основано на RNTI. По умолчанию следующие RNTIs рассматриваются для вычисления EVM:

  • NR-FR1-TM2: RNTI = 2 (64QAM EVM)

  • NR-FR1-TM2a: RNTI = 2 (256QAM EVM)

  • NR-FR1-TM3.1: RNTI = 0 и 2 (64QAM EVM)

  • NR-FR1-TM3.1a: RNTI = 0 и 2 (256QAM EVM)

  • NR-FR1-TM3.2: RNTI = 2 (16QAM EVM)

  • NR-FR1-TM3.3: RNTI = 1 (QPSK EVM)

  • NR-FR2-TM2: RNTI = 2 (64QAM EVM)

  • NR-FR2-TM3.1: RNTI = 0 и 2 (64QAM EVM)

Обратите внимание на то, что, согласно техническим требованиям (TS 38.141-1, TS 38.141-2), следующие ТМ не спроектированы, чтобы выполнить измерения EVM: NR-FR1-TM1.1, NR-FR1-TM1.2, NR-FR2-TM1.1. Однако в этом примере, если эти ТМ сгенерированы, EVM измеряется для следующего RNTIs:

  • NR-FR1-TM1.1: RNTI = 0 (QPSK EVM)

  • NR-FR1-TM1.2: RNTI = 2 (QPSK EVM)

  • NR-FR2-TM1.1: RNTI = 0 (QPSK EVM)

Эти значения могут быть заменены. Функциональный hListTargetPDSCHs() также принимает, что третий параметр с набором RNTIs рассматривает для измерения EVM.

pdschArray массив конфигурационных структур PDSCH, чтобы проанализировать. Каждая структура содержит набор ресурсов, используемых в PDSCH и связанном DM-RS и PT-RS. Это также содержит набор параметров, чтобы сгенерировать PDSCH.

[pdschArray, targetRNTIs] = hListTargetPDSCHs(tmwavegen.Config,resourcesinfo.WaveformResources);

Нарушение: шум фазы и нелинейность

Этот пример рассматривает два нарушения: фаза шумовая и нелинейность без памяти. Нарушения могут быть включены или отключены путем переключения флагов phaseNoiseOn и nonLinearityModelOn.

phaseNoiseOn = true;
nonLinearityModelOn = true;

Нормируйте форму волны, чтобы соответствовать динамическому диапазону нелинейности.

txWaveform = txWaveform/max(abs(txWaveform));

Форма волны состоит из одной системы координат для FDD и два для TDD. Повторите сигнал дважды. Мы удалим первую половину получившейся формы волны, чтобы избежать переходного процесса, введенного моделью шума фазы.

txWaveform = repmat(txWaveform,2,1);

Введите искажение шума фазы. Сгенерированный рисунок показывает характеристику шума фазы. Рассмотренная несущая частота зависит от частотного диапазона. Мы используем значения 4 ГГц и 28 ГГц для FR1 и FR2 соответственно. Характеристика шума фазы сгенерирована с моделью полюса/нуля, описанной в R1-163984, "Обсуждение моделирования шума фазы".

if phaseNoiseOn
    sr = tmwaveinfo.Info.SamplingRate;

    % Carrier frequency
    if tmwavegen.Config.FrequencyRange == "FR1" % carrier frequency for FR1
        fc = 4e9;
    else % carrier frequency for FR2
        fc = 28e9;
    end

    % Phase noise level
    foffsetLog = (3:0.1:log10(sr/2)); % model offset from 1e3Hz to sr/2
    foffset = 10.^foffsetLog;    % linear freq offset
    PN_dBc_Hz = PNmodelPoleZero(foffset,fc);
    figure; semilogx(foffset,PN_dBc_Hz); xlabel('Frequency offset (Hz)'); ylabel('dBc/Hz'); title('Phase noise model'); grid on

    % Apply phase noise to waveform
    pnoise = comm.PhaseNoise('FrequencyOffset',foffset,'Level',PN_dBc_Hz,'SampleRate',sr);
    rxWaveform = pnoise(txWaveform);
else
    rxWaveform = txWaveform;
end

Введите нелинейное искажение. Мы используем модель Rapp в этом примере. Рисунок показывает введенную нелинейность. Параметры для модели Rapp выбраны, чтобы совпадать с характеристикой модели без памяти от TR 38.803 (Полиномиальная модель без памяти - Приложение A.1).

if nonLinearityModelOn
    rapp = comm.MemorylessNonlinearity('Method','Rapp model');
    rapp.Smoothness = 1.55;
    rapp.OutputSaturationLevel = 1;

    % Plot non-linear characteristic
     plotNonLinearCharacteristic(rapp);

    % Apply nonlinearity
    rxWaveform = rapp(rxWaveform);
end

Сигнал был ранее повторен дважды. Мы теперь удаляем первую половину этого сигнала. Это избегает любого переходного процесса, введенного моделями нарушения.

if dm == "FDD"
    nFrames = 1;
else % TDD
    nFrames = 2;
end
rxWaveform(1:nFrames*tmwaveinfo.Info.SamplesPerSubframe*10) = [];

Получатель

Получатель в этом примере выполняет следующие шаги:

  • Синхронизация с помощью DM-RS по одной системе координат для FDD (две системы координат для TDD)

  • Демодуляция OFDM полученной формы волны

  • Оценка канала

  • Коррекция

Получите параметры формы волны для синхронизации и демодуляции OFDM

gnb.NRB = tmwavegen.Config.Carriers.NRB;
gnb.CyclicPrefix = tmwavegen.Config.BWP.CyclicPrefix;
gnb.SubcarrierSpacing = tmwavegen.Config.Carriers.SubcarrierSpacing;

Сгенерируйте координатную сетку, охватывающую 10 мс (одна система координат). Эта сетка содержит только DM-RS и используется в синхронизации.

refGrid = referenceGrid(tmwaveinfo,pdschArray);
NSlot = 0;
[offset,mag] = nrTimingEstimate(rxWaveform,gnb.NRB,gnb.SubcarrierSpacing,NSlot,refGrid);
tmWaveformSync = rxWaveform(1+offset:end,:);

Демодуляция OFDM.

rxGrid = hOFDMDemodulate(gnb, tmWaveformSync);

Для всех пазов получите PDSCH и ресурсы DM-RS (местоположения элемента ресурса). Эта информация присутствует в pdschArray. Затем выполните оценку канала и эквализацию. Получившиеся данные хранятся, чтобы вычислить EVM.

% Get total number of slots and the number of subcarriers and symbols per
% slot
symbolsPerSlot = tmwaveinfo.Info.SymbolsPerSlot;
totalNrSlots = floor(size(rxGrid,2)/symbolsPerSlot);
noSubcarriers = size(rxGrid,1);

% Declare storage variables
constellationSymbols = [];  % equalized symbols for constellation plot
constellationRef = [];      % reference symbols for constellation plot
refSqGrid = []; % Grid with magnitude square of reference symbols
evSqGrid = [];  % Grid with magnitude square of error vector (symbols - reference)

for NSlot=0:totalNrSlots-1
    % Extract grid for current slot
    currentGrid = rxGrid(:,NSlot*symbolsPerSlot+(1:symbolsPerSlot),:);

    % Retrieve resources
    [pdschIndices,refSymbols,dmrsIndices,dmrsSymbols] = hSlotResources(pdschArray,NSlot);

    % Do not include first two slot symbols for PDSCH EVM (used for control
    % TS 38.141-1 table 4.9.2.2-2)
    idx = pdschIndices <= 2*noSubcarriers;
    pdschIndices(idx) = [];
    refSymbols(idx) = [];

    % Channel estimation
    [estChannelGrid,~] = nrChannelEstimate(currentGrid,dmrsIndices,dmrsSymbols);

    % Get PDSCH resource elements from the received grid
    [pdschRx,pdschHest] = nrExtractResources(pdschIndices,currentGrid,estChannelGrid);

    % Equalization: set noiseEst to 0 for zero-forcing equalization
    noiseEst = 0;
    [pdschEq,csi] = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst);

    refSqGridSlot = zeros(size(currentGrid)); % slot grid magnitude square of reference symbols
    evSqGridSlot = zeros(size(currentGrid));  % slot grid magnitude square of error vector
    if ~isempty(refSymbols) % for slots with data

        % Error vector magnitude square
        evSq = abs(refSymbols-pdschEq).^2;
        % Reference symbols magnitude square
        refSymSq = abs(refSymbols).^2;

        % Store constellation symbols, reference symbols and square error vector
        constellationSymbols = [constellationSymbols; pdschEq];
        constellationRef = [constellationRef; refSymbols];
        evSqGridSlot(pdschIndices) = evSq;
        refSqGridSlot(pdschIndices) = refSymSq;

    end
    refSqGrid = [refSqGrid refSqGridSlot];
    evSqGrid = [evSqGrid evSqGridSlot];

end

Отобразите схему созвездия.

figure
plot(constellationSymbols,'.'); hold on
plot(constellationRef,'+')
title('Equalized symbols constellation')
grid on; xlabel('In-Phase'); ylabel('Quadrature');

Вычисление EVM

Вычислите следующий EVM (RMS и максимум) значения:

  • EVM на символ OFDM

  • EVM на паз

  • EVM на поднесущую

  • Общий EVM для целого сигнала

Показанные значения EVM нормированы степенью ссылочных символов. Эта степень вычисляется для рассмотренного интервала измерения. Например, при вычислении EVM на паз, все ссылочные символы в том пазе используются, чтобы вычислить степень, используемую в нормализации. В случае EVM на поднесущую интервал измерения является одной системой координат для FDD и двумя системами координат для TDD. Общий EVM измеряется по одной системе координат для FDD и двум системам координат для TDD.

Отобразите EVM на символ OFDM, паз и поднесущую.

% EVM per symbol
[evmPerSymbol, evmMaxSymbol] = evm(evSqGrid,refSqGrid);

figure; subplot(3,1,1)
plot(0:length(evmPerSymbol)-1,evmPerSymbol,'.-',0:length(evmPerSymbol)-1,evmMaxSymbol,'.:');
title('EVM vs OFDM symbol')
grid on; xlabel('Symbol number'); ylabel('EVM (%)'); legend('rms EVM','peak EVM','Location','bestoutside')

% EVM per slot
% reshape grids to one column per slot
evSqGridSlot = reshape(evSqGrid,size(evSqGrid).*symbolsPerSlot.^[1 -1]);
refSqGridSlot = reshape(refSqGrid,size(refSqGrid).*symbolsPerSlot.^[1 -1]);

[evmPerSlot, evmMaxSlot] = evm(evSqGridSlot,refSqGridSlot);

subplot(3,1,2)
slotNo = 0:length(evmPerSlot)-1;
plot(slotNo,evmPerSlot,'.-',slotNo,evmMaxSlot,'.:');
title('EVM vs slot')
grid on; xlabel('Slot number'); ylabel('EVM (%)'); legend('rms EVM','peak EVM','Location','bestoutside')

% EVM per subcarrier
[evmPerSubcarrier, evmMaxSubcarrier] = evm(evSqGrid.',refSqGrid.');

subplot(3,1,3)
subcarrierNo = 0:length(evmPerSubcarrier)-1;
plot(subcarrierNo,evmPerSubcarrier,'.-',subcarrierNo,evmMaxSubcarrier,'.:')
title('EVM vs subcarrier')
grid on; xlabel('Subcarrier number'); ylabel('EVM (%)'); legend('rms EVM','max EVM','Location','bestoutside')

Вычислите полный EVM.

[evmRMS, evmMax] = evm(evSqGrid(:),refSqGrid(:));
disp("PDSCH RNTIs: " + mat2str(targetRNTIs))
disp("RMS EVM = " + string(evmRMS) + "%");
disp("Max EVM = " + string(evmMax) + "%");

Локальные функции

function [evmRMS, evmMax] = evm(evSqGrid,refSqGrid)
% Calculates the evm per column of the input matrix
% inputs (both of the same size):
%   - evSqGrid = matrix of error vector magnitude square |refSymb-rxSymb|.^2
%   - refSqGrid = matrix of ref symbols magnitude square |refSymb|.^2

    if size(evSqGrid)~=size(refSqGrid)
        error('Input matrices must have the same size');
    end

    % RMS EVM (%)
    evmRMS = rmsEVM(sum(evSqGrid,1),sum(refSqGrid,1));

    % max EVM (%)
    evmMax = zeros(1,size(refSqGrid,2));
    % find non zero REs in reference grid
    nonZeroREs = (refSqGrid~=0);
    for ncol = 1:length(evmMax)
        % remove reference symbols with value zero
        nzEvSqREsSlot = evSqGrid(nonZeroREs(:,ncol),ncol);
        nzRefSqREsSlot = refSqGrid(nonZeroREs(:,ncol),ncol);
        evmMax(ncol) = maxEVM(nzEvSqREsSlot,nzRefSqREsSlot);
    end
end

function evmRMS = rmsEVM(evSq,refSq)
% Calcuates RMS EVM. Inputs
%   - evSq = matrix of error vector magnitude square
%   - refSq = matrix of ref symbols magnitude square
% They have the same size or refSq can be a scalar.
    evmRMS = 100*sqrt(evSq./refSq);
end

function evmMax = maxEVM(evSq,refSq)
% inputs (both of the same size):
%   - evSq = array of error vector magnitude square
%   - refSq = array of ref symbols magnitude square
    if ~isempty(evSq) && ~isempty(refSq)
        evmMax = max(100*sqrt(evSq./mean(refSq)));
    else
        evmMax = NaN;
    end
end

function refGrid = referenceGrid(tmwaveinfo,pdschArray)
% Create a reference grid for synchronization. This should span a whole
% frame, starting in slot 0. It contains the DM-RSs specified in
% pdschArray.

    L = tmwaveinfo.Info.SymbolsPerSubframe*10; % symbols in a frame
    refGrid = zeros(tmwaveinfo.Info.NSubcarriers,L); % empty grid
    rbsPerSlot = tmwaveinfo.Info.NSubcarriers*tmwaveinfo.Info.SymbolsPerSlot;
    % Polpulate the DM-RSs in the reference grid for all slots
    for NSlot=0:(10*tmwaveinfo.Info.SlotsPerSubframe)-1 % 1 frame worth of subframes
        [~,~,dmrsIndices,dmrsSymbols] = hSlotResources(pdschArray,NSlot);
        refGrid(dmrsIndices+NSlot*rbsPerSlot) = dmrsSymbols;
    end

end

function PN_dBC_Hz = PNmodelPoleZero(f,fc)
% Generate the phase noise characteristic in dBc/Hz for the frequency
% offset values specified by vector f for the carrier frequency fc.
%
% The model used here is the multi-pole/zero model as proposed in:
% Yinan Qi et al. "On the Phase Tracking Reference Signal (PT-RS) Design
% for 5G New Radio (NR)". Vehicular Technology Conference (VTC-Fall), Aug
% 2018.

% Pole/zeros and PSD0 as specified in the paper mentioned above and in 3GPP
% R1-163984, "Discussion on phase noise modeling". This corresponds to
% "parameter set A" for a base frequency of 30GHz.
fcBase = 30e9;
fz= [1.8 2.2 40]*1e6;
fp = [0.1 0.2 8]*1e6;
PSD0 = -79.4;

% Compute numerator
num = ones(size(f));
for ii=1:numel(fz)
    num = num.* ( 1 +(f./fz(ii)).^2);
end

% Compute denominator
den = ones(size(f));
for ii=1:numel(fz)
    den = den.* ( 1 +(f./fp(ii)).^2);
end

% Compute phase noise and apply a shift for carrier frequencies different
% from the base frequency.
PN_dBC_Hz = 10*log10(num./den) + PSD0 + 20*log10(fc/fcBase);

end

function plotNonLinearCharacteristic(memoryLessNonlinearity)
% Plot the non linear characteristic of the PA impairment represented by
% memoryLessNonlinearity system object. This input parameter is a
% comm.MemorylessNonlinearity system object.

% input samples
x = complex((1/sqrt(2))*(-1+2*rand(1000,1)),(1/sqrt(2))*(-1+2*rand(1000,1)));

% Non linearity
yRapp = memoryLessNonlinearity(x);
% release object so we can feed it different number of samples
release(memoryLessNonlinearity);

% Plot characteristic
figure; plot(10*log10(abs(x).^2),10*log10(abs(x).^2)); hold on; grid on
plot(10*log10(abs(x).^2),10*log10(abs(yRapp).^2),'.');
xlabel('Input power (dBW)'); ylabel('Output power (dBW)'); title('nonlinearity impairment')
legend('Linear characteristic', 'Rapp nonlinearity','Location','Northwest');

end

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте