Этот пример измеряет величину вектора ошибок (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
Пропускная способность канала и комбинация разрядки поднесущей должны быть допустимой парой из связанной таблицы настройки пропускной способности 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 (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