5G создание отчетов CSI нисходящего канала NR

Пример показывает, как вычислить нисходящие параметры информации о состоянии канала (CSI), такие как качественная характеристика канала (CQI) и предварительное кодирование матричного индикатора (PMI) для сценариев нескольких вводят несколько выходов (MIMO), считая тип 1 одной книгами шифров панели, как задано в Разделе TS 38.214 5.2.2, по каналу коснувшейся линии задержки (TDL).

Введение

Параметры CSI являются количествами, связанными с состоянием канала, о которых сообщает оборудование пользователя (UE) узлу сети доступа (gNB) как обратная связь. Обратная связь CSI включает несколько параметров, таких как CQI, PMI с различными наборами книги шифров и индикатор ранга (RI). Опорный сигнал информации о состоянии канала (CSI-RS) используется, чтобы измерить обратную связь CSI. Когда gNB получит параметры CSI, он может запланировать нисходящие передачи данных (такие как схема модуляции, уровень кода, количество слоев передачи и предварительное кодирование MIMO) соответственно. Рисунок показывает обзор передачи CSI-RS, расчета CSI и обратной связи и передачи нисходящих данных, которые планируются на основе параметров CSI.

Выбор RI

RI задает количество возможных слоев передачи для нисходящей передачи при определенных условиях канала. Это также называют как максимальное количество некоррелированых путей, которые могут использоваться для нисходящей передачи. Другие параметры CSI как PMI и CQI вычисляются на основе ранга, обеспеченного RI. Текущий пример не поддерживает расчет RI. CQI и параметры PMI вычисляются в примере, принимающем известный ранг.

Выбор PMI

PMI является набором индексов, соответствующих матрице перед кодированием, которая может использоваться для нисходящей передачи данных. Книга шифров выбрана из набора возможных книг шифров, заданных в таблицах 5.2.2.2.1-1 TS 38.214 к 5.2.2.2.1-12, на основе возможного количества слоев передачи для нисходящей передачи и CSI, сообщив о параметрах конфигурации, таких как размерности панели антенны и режим книги шифров. Книга шифров состоит из набора предварительного кодирования матриц. Для данных условий канала сигнал к интерференционному и шумовому отношению (SINR) вычисляется в стороне приемника путем рассмотрения всех матриц перед кодированием из выбранной книги шифров. Об индексах матрицы перед кодированием, которая дает максимальный SINR, сообщают как PMI (составляющий эти два набора индексов i1,i2, как задано в Разделе TS 38.214 5.2.2.2.1). Рисунок показывает процедуру для выбора PMI.

Выбор CQI

CQI является индикатором качества канала. Индекс CQI является скалярным значением от 0 до 15. Это предоставляет информацию о самой высокой схеме модуляции и уровне кода (MCS), подходящий для нисходящей передачи, чтобы достигнуть необходимой частоты появления ошибочных блоков (BLER) для данного канала условия. Самый высокий индекс CQI выбран, когда один физический нисходящий канал совместно использовал канал (PDSCH) транспортный блок с комбинацией схемы модуляции, целевой уровень кода и транспортный размер блока, которые соответствуют индексу CQI и которые занимают группу нисходящих физических блоков ресурса, назвали ресурс ссылки CSI, может быть получен с транспортной вероятностью блочной ошибки, не превышающей:

  • 0.1 для 'cqi-таблицы' как 'table1' или 'table2'

  • 0.00001 для 'cqi-таблицы' как 'table3'

'Cqi-таблица' является более высоким параметром слоя, который соответствует CQI по сравнению с таблицей MCS, и интерполяционная таблица SINR вычисляется для этой таблицы. Этот пример использует 0,1 BLER (соответствующий 90-процентной пропускной способности) и 'cqi-таблица' как 'table1' (таблица 5.2.2.1-2 TS 38.214). Отношение между индексами CQI, схемой модуляции и уровнем кода (из которого выведен транспортный размер блока) описано в таблицах 5.2.2.1-2 TS 38.214 к 5.2.2.1-4. Ресурс ссылки CSI задан в Разделе TS 38.214 5.2.2.5.

Значение CQI вычисляется путем рассмотрения значений SINR, которые соответствуют PMI, о которой сообщают, с помощью предрасчетной интерполяционной таблицы индекса CQI по сравнению с SINRi, как ссылка. Значения SINR через все слои (соответствующий PMI, о которой сообщают) сопоставлены с каждой кодовой комбинацией. Для каждой кодовой комбинации соответствующий SINR по сравнению с SINRi выбраны значения из таблицы и затем, значение CQI против максимального SINR, который меньше кодовой комбинации SINR. Значение CQI выбрано таким образом, что BLER меньше чем или равен 0,1, когда управляется с SINRi. Если индекс CQI 1 не удовлетворяет условию BLER, то индекс CQI рассматривается как 0. Рисунок показывает процедуру для выбора CQI.

CQI по сравнению с таблицей SINR

Интерполяционные таблицы могут быть созданы путем обновления NewRadioPDSCHThroughputExample сконфигурировать ресурс ссылки CSI, как задано в Разделе TS 38.214 5.2.2.5. Симуляции для пропускной способности PDSCH выполняются путем рассмотрения уровня схемы и кода модуляции, соответствующего каждому CQI, рассматривая определенные условия канала и через конечную область значений значений SINR с нулевой интерференцией. Значение SINR, наблюдаемое в приемнике, где целевой BLER достигается, сопоставлено против каждого индекса CQI. Рисунок показывает процедуру для CQI по сравнению с созданием таблицы SINR.

Схема примера

В этом примере показано, как вычислить CQI, и индексы PMI для сценария MIMO 4 на 4 по каналу TDL с задержкой профилируют TDL-C, распространение задержки 300e-9 секунд и максимальный эффект Доплера 50 Гц. Это сравнивает временной интервал и изменения частотного диапазона значений CQI против временного интервала и изменения частотного диапазона значений SINR и для практических и для совершенных сценариев оценки канала. Пример также подсвечивает изменения значений PMI через временной интервал и частотный диапазон для практических и совершенных сценариев оценки канала.

Продолжительность симуляции и точка ОСШ

Установите продолжительность симуляции в терминах количества систем координат на 10 мс. ОСШ (SINR с нулевой интерференцией) задан на элемент ресурса (RE) и применяется, каждый получает антенну.

nFrames = 5; % Number of 10 ms frames
SNRdB = 0;   % SNR in dB

Поставщик услуг, часть пропускной способности и настройка CSI-RS

Создайте объект настройки поставщика услуг представление поставщика услуг на 10 МГц с интервалом поднесущей 15 кГц.

carrier = nrCarrierConfig;
carrier.SubcarrierSpacing = 15;
carrier.NSizeGrid = 52;

Сконфигурируйте размер части пропускной способности (BWP) и запуска BWP относительно общего блока 0 ресурса (CRB 0).

NStartBWP = 0;
NSizeBWP = 52;

Создайте объект настройки CSI-RS представление CSI-RS "не нулевая степень" (NZP-CSI-RS) набор ресурсов с набором ресурсов NZP-CSI-RS. Убедитесь, что ресурсы NZP-CSI-RS, которые сконфигурированы в этом примере, имеют те же типы мультиплексирования кодового разделения (CDM) и то же количество портов CSI-RS, как задано в Разделе TS 38.214 5.2.2.3.1.

csirs = nrCSIRSConfig;
csirs.CSIRSType = {'nzp','nzp','nzp'};
csirs.RowNumber = [4 4 4];
csirs.NumRB = 52;
csirs.RBOffset = 0;
csirs.CSIRSPeriod = [4 0];
csirs.SymbolLocations = {0, 0, 0};
csirs.SubcarrierLocations = {0, 4, 8};
csirs.Density = {'one','one','one'};

Другие параметры всей симуляции

Сконфигурируйте количество передающих и приемных антенн. Количество антенн передачи должно быть больше или быть равно количеству портов CSI-RS.

nTxAnts = 4;
nRxAnts = 4;

Подтвердите объект настройки CSI-RS.

validateCSIRSConfig(carrier,csirs,nTxAnts);

Сконфигурируйте количество слоев передачи. Количество слоев от 1 до 4 соответствует одной кодовой комбинации, и количество слоев от 5 до 8 соответствует двум кодовым комбинациям. Количество слоев передачи должно быть меньше чем или равно минимуму nTxAnts и nRxAnts.

numLayers = 4;

Настройка создания отчетов CSI

Они - параметры, требуемые для CQI и расчета PMI, и заданы как структура с полями:

  • NSizeBWP: Размер BWP в терминах количества физических блоков ресурса (PRBs)

  • NStartBWP: Запуск индекс PRB BWP относительно CRB 0

  • PanelDimensions: размерности панели антенны как [N1 N2] согласно таблице 5.2.2.2-2 TS 38.214, как показано на рисунке

  • CQIMode: режим CQI, сообщающего ('Поддиапазон', 'Широкополосный')

  • PMIMode: режим создания отчетов PMI ('Поддиапазон', 'Широкополосный')

  • SubbandSize: размер поддиапазона, как задано в таблице 5.2.1.4-2 TS 38.214 (потребовал только, когда CQIMode или PMIMode является 'Поддиапазон'),

  • PRGSize: группа блока ресурса перед кодированием (PRG) размер для вычисления CQI (потребовал только, когда создание отчетов должно быть сделано для количества отчета 'cri RI i1 CQI', как задано в Разделе TS 38.214 5.2.1.4.2),

  • CodebookMode: режим книги шифров (потребовал только, когда количество слоев передачи равняется 1 или 2 и количество портов CSI-RS, больше 2),

  • CodebookSubsetRestriction: параметр Ограничения, имеющий отношение к индексу книги шифров, устанавливается i1, то есть, vlm или vbarlm параметр ограничения, как задано в Разделе TS 38.214 5.2.2.2.1. Это поле обозначает набор i1 индексы (i1 три вектора элемента из формы [i11,i12,i13]) это ограничивается в факторе для расчета PMI.

  • i2Restriction: параметр Ограничения, имеющий отношение к индексу книги шифров i2. Это поле обозначает набор i2 индексы, которые ограничиваются в факторе для расчета PMI.

% Configure CSI reporting configuration parameters
reportConfig.NStartBWP = NStartBWP;
reportConfig.NSizeBWP = NSizeBWP;
reportConfig.PanelDimensions = [2 1];
reportConfig.CQIMode = 'Subband';
reportConfig.PMIMode = 'Subband';
reportConfig.SubbandSize = 4;
reportConfig.PRGSize = [];
reportConfig.CodebookMode = 1;
reportConfig.CodebookSubsetRestriction = [];
reportConfig.i2Restriction = [];

Настройка модели канала распространения

Полагайте, что канал TDL с задержкой профилирует TDL-C, распространение задержки 300e-9 секунд и максимальный эффект Доплера 50 Гц.

% Create channel object
channel = nrTDLChannel;
channel.NumTransmitAntennas = nTxAnts;
channel.NumReceiveAntennas = nRxAnts;
channel.DelayProfile = 'TDL-C';
channel.MaximumDopplerShift = 50;
channel.DelaySpread = 300e-9;

Установите частоту дискретизации для модели канала при помощи значения, возвращенного от nrOFDMInfo функция.

waveformInfo = nrOFDMInfo(carrier);
channel.SampleRate = waveformInfo.SampleRate;

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

chInfo = info(channel);
maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;

Обработка цикла

Для каждого паза CSI-RS сгенерирован, передан через канал, и затем обработан в стороне приемника, чтобы вычислить значения PMI и CQI. Передача, чтобы получить обработку конца для каждого паза выполняет эти шаги:

  1. Сгенерируйте сетку ресурса: Сгенерируйте сетку паза, которая заполняется с CSI-RS, и сопоставьте сетку паза от портов CSI-RS, чтобы передать антенны.

  2. Сгенерируйте форму волны: OFDM модулируют сгенерированную сетку при помощи nrOFDMModulate функция.

  3. Модель и применяет шумный канал: Передайте форму волны через TDL-C, исчезающий канал, и затем добавьте аддитивный белый Гауссов шум (AWGN). ОСШ задан на RE и применяется, каждый получает антенну.

  4. Выполните временную синхронизацию и демодуляцию OFDM: Для практической синхронизации коррелируйте полученную форму волны с CSI-RS. Для совершенной синхронизации используйте усиления пути, и фильтры пути канала используются. Синхронизируемым сигналом является затем OFDM, демодулируемый с nrOFDMDemodulate функция.

  5. Выполните оценку канала: Для практической оценки канала используйте CSI-RS. Для совершенной оценки канала используйте усиления пути, фильтры пути и шаги расчета снимков состояния канала.

  6. Вычислите значения PMI и CQI: Вычислите CQI и значения PMI с помощью практических и совершенных оценок канала.

% Initialize variables to store CQI, PMI, and subband SINR values for
% practical and perfect channel estimation scenarios
cqiPracticalPerSlot = [];
subbandCQIPractical = [];
pmiPracticalPerSlot = struct('i1',[],'i2',[]);
SINRPerSubbandPerCWPractical = [];
cqiPerfectPerSlot = [];
subbandCQIPerfect = [];
pmiPerfectPerSlot = struct('i1',[],'i2',[]);
SINRPerSubbandPerCWPerfect = [];

% Calculate total number of slots
totSlots = nFrames*carrier.SlotsPerFrame;

% Get number of CSI-RS ports
csirsPorts = csirs.NumCSIRSPorts(1);

% Get CDM lengths corresponding to configured CSI-RS resources
cdmLengths = getCDMLengths(csirs);

% Loop over all slots
for slotIdx = 0:totSlots - 1
    % Create carrier resource grid for one slot
    csirsSlotGrid = nrResourceGrid(carrier,csirsPorts);

    % Update slot number in carrier configuration object
    carrier.NSlot = slotIdx;

    % Generate CSI-RS indices and symbols
    csirsInd = nrCSIRSIndices(carrier,csirs);
    csirsSym = nrCSIRS(carrier,csirs);

    % Map CSI-RS to slot grid
    csirsSlotGrid(csirsInd) = csirsSym;

    % Map CSI-RS ports to transmit antennas
    wtx = eye(csirsPorts,nTxAnts);
    txGrid = reshape(reshape(csirsSlotGrid,[],csirsPorts)*wtx,size(csirsSlotGrid,1),size(csirsSlotGrid,2),nTxAnts);

    % Perform OFDM modulation to generate time-domain waveform
    txWaveform = nrOFDMModulate(carrier,txGrid);

    % Append zeros at the end of the transmitted waveform to flush channel
    % content. These zeros take into account any delay introduced in the
    % channel. The channel delay is a mix of multipath delay and
    % implementation delay. This value may change depending on the sampling
    % rate, delay profile, and delay spread.
    txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))]; %#ok<AGROW> 

    % Transmit waveform through channel
    [rxWaveform,pathGains,sampleTimes] = channel(txWaveform);

    % Generate and add AWGN to received waveform
    SNR = 10^(SNRdB/20);                                                % Linear SNR value
    N0 = 1/(sqrt(2.0*nRxAnts*double(waveformInfo.Nfft))*SNR);           % Noise standard deviation
    rng('default');                                                     % Set RNG state for repeatability
    noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));
    rxWaveform = rxWaveform + noise;

    % Perform practical timing estimation
    offsetPractical = nrTimingEstimate(carrier,rxWaveform,csirsInd,csirsSym);
    if offsetPractical > maxChDelay
        offsetPractical = 0;
    end

    % Get path filters
    pathFilters = getPathFilters(channel);
    % Perform perfect timing estimation
    offsetPerfect = nrPerfectTimingEstimate(pathGains,pathFilters);

    % Perform time-domain offset correction for practical and
    % perfect timing estimation scenarios
    rxWaveformPractical = rxWaveform(1+offsetPractical:end,:);
    rxWaveformPerfect = rxWaveform(1+offsetPerfect:end,:);

    % Perform OFDM demodulation on previously synchronized waveforms
    rxGridPractical = nrOFDMDemodulate(carrier,rxWaveformPractical);
    rxGridPerfect = nrOFDMDemodulate(carrier,rxWaveformPerfect);

    % Consider only the NZP-CSI-RS symbols for channel estimation
    nzpCSIRSSym = csirsSym(csirsSym ~= 0);
    % Consider only the NZP-CSI-RS indices for channel estimation
    nzpCSIRSInd = csirsInd(csirsSym ~= 0);
    % Calculate practical channel estimate using 'AveragingWindow' as [5 1]
    [PracticalHest,nVarPractical] = nrChannelEstimate(carrier,rxGridPractical, ...
        nzpCSIRSInd,nzpCSIRSSym,'CDMLengths',cdmLengths,'AveragingWindow',[5 1]);

    % Perform perfect channel estimation
    PerfectHest = nrPerfectChannelEstimate(carrier,pathGains,pathFilters,offsetPerfect,sampleTimes);

    % Get perfect noise estimate value from noise realization
    noiseGrid = nrOFDMDemodulate(carrier,noise(1+offsetPerfect:end,:));
    nVarPerfect = var(noiseGrid(:));

    % Calculate CQI and PMI values using practical channel estimate
    [cqiPractical,pmiPractical,cqiInfoPractical] = hCQISelect(carrier,csirs, ...
        reportConfig,numLayers,PracticalHest,nVarPractical);

    % Store CQI, PMI, and subband SINR values of each slot for
    % practical channel estimation scenario
    cqiPracticalPerSlot(:,:,slotIdx+1) = cqiPractical; %#ok<SAGROW>
    pmiPracticalPerSlot(slotIdx+1) = pmiPractical;
    subbandCQIPractical(:,:,slotIdx+1) = cqiInfoPractical.SubbandCQI; %#ok<SAGROW>
    SINRPerSubbandPerCWPractical(:,:,slotIdx+1) = cqiInfoPractical.SINRPerSubbandPerCW; %#ok<SAGROW>

    % Calculate CQI and PMI values using perfect channel estimate
    [cqiPerfect,pmiPerfect,cqiInfoPerfect] = hCQISelect(carrier,csirs, ...
        reportConfig,numLayers,PerfectHest,nVarPerfect);

    % Store CQI, PMI, and subband SINR values of each slot for
    % perfect channel estimation scenario
    cqiPerfectPerSlot(:,:,slotIdx+1) = cqiPerfect; %#ok<SAGROW>
    subbandCQIPerfect(:,:,slotIdx+1) = cqiInfoPerfect.SubbandCQI; %#ok<SAGROW>
    pmiPerfectPerSlot(slotIdx+1) = pmiPerfect;
    SINRPerSubbandPerCWPerfect(:,:,slotIdx+1) = cqiInfoPerfect.SINRPerSubbandPerCW; %#ok<SAGROW>
end

Сравните CQI и значения PMI, о которых сообщают в практических и совершенных сценариях оценки канала

Постройте индексы CQI

Постройте широкополосные значения SINR и широкополосные значения CQI для каждой кодовой комбинации для практических и совершенных сценариев оценки канала. График подсвечивает только пазы, в которых передается CSI-RS, или CQI вычисляется. Рисунок показывает, как SINR и соответствие сообщили, что CQI варьируются через пазы, должные образовывать канал, исчезая.

plotWidebandCQIAndSINR(cqiPracticalPerSlot,cqiPerfectPerSlot,SINRPerSubbandPerCWPractical,SINRPerSubbandPerCWPerfect);

Figure contains 2 axes. Axes 1 with title Estimated Wideband SINR Values for Codeword 1 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes 2 with title Wideband CQI Values for Codeword 1 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est..

Постройте поддиапазон значения SINR и поддиапазон значения CQI для каждой кодовой комбинации и для практических и для совершенных сценариев оценки канала. График подсвечивает изменения SINR и значений CQI через поддиапазоны для заданного номера слота (на основе 1), если о CQI сообщают в том пазе. В противном случае никакой график не сгенерирован, потому что о CQI не сообщают.

plotSubbandCQIAndSINR графики функций значения CQI через все поддиапазоны только, когда режим CQI сконфигурирован как 'Поддиапазон'.

% Provide slot number for which subband CQI values and PMI i2 indices must be plotted
slotNum = 1; % Consider slot number as 1 (1-based) here, because CSI (CQI and PMI) is
             % reported in that slot for the configured CSI-RS resource(s)
plotSubbandCQIAndSINR(subbandCQIPractical,subbandCQIPerfect,SINRPerSubbandPerCWPractical,SINRPerSubbandPerCWPerfect,slotNum);

Figure contains 2 axes. Axes 1 with title Estimated Subband SINR Values for Codeword 1 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes 2 with title Subband CQI Values for Codeword 1 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est..

Постройте индексы PMI

Этот раздел показывает графики индексов PMI (i1:[i1,1,i1,2,i1,3] и i2). График подсвечивает только пазы, в которых передается CSI-RS, или PMI вычисляется. График подсвечивает изменения i1 индексы через пазы, должные образовывать канал, исчезая. График также подсвечивает изменение i2 индексы через:

  • Пазы, если PMIMode сконфигурирован как 'Широкополосный'

  • Поддиапазоны в заданном пазе, если PMIMode сконфигурирован как 'Поддиапазон'

plotPMI(pmiPracticalPerSlot,pmiPerfectPerSlot,slotNum);

Figure contains 4 axes. Axes 1 with title PMI: i11 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes 2 with title PMI: i12 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes 3 with title PMI: i13 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes 4 with title PMI: i2 Indices for All Subbands in Slot 1 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est..

Итоговое и дальнейшее исследование

Пример показывает, как вычислить нисходящие параметры CSI, такие как CQI и PMI от типа 1 одна книги шифров панели для сценария MIMO с каналом TDL.

Можно изменить поставщика услуг, канал, настройки ресурса CSI-RS и CSI, сообщив о параметрах конфигурации (таких как режим CQI и создания отчетов PMI и размера поддиапазона) и наблюдать изменения вычисленного CQI и значений PMI через время (пазы) и частота (поддиапазоны).

Ссылки

  1. 3GPP TS 38.214. "NR; процедуры Физического уровня для данных". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

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

Пример использует эти локальные функции, чтобы подтвердить объект настройки CSI-RS и построить вычисленный CQI и значения PMI

function validateCSIRSConfig(carrier,csirs,nTxAnts)
%   validateCSIRSPorts(CARRIER,CSIRS,NTXANTS) validates the CSI-RS
%   configuration, given the carrier specific configuration object CARRIER,
%   CSI-RS configuration object CSIRS, and the number of transmit antennas
%   NTXANTS.

    % Validate the number of CSI-RS ports
    if ~isscalar(unique(csirs.NumCSIRSPorts))
        error('nr5g:InvalidCSIRSPorts',...
            'All the CSI-RS resources must be configured to have the same number of CSI-RS ports.');
    end

    % Validate the CDM lengths
    if ~iscell(csirs.CDMType)
        cdmType = {csirs.CDMType};
    else
        cdmType = csirs.CDMType;
    end
    if (~all(strcmpi(cdmType,cdmType{1})))
        error('nr5g:InvalidCSIRSCDMTypes',...
            'All the CSI-RS resources must be configured to have the same CDM lengths.');
    end
    if nTxAnts < csirs.NumCSIRSPorts(1)
        error('nr5g:InvalidNumTxAnts',['Number of transmit antennas (' num2str(nTxAnts)...
            ') must be greater than or equal to the number of CSI-RS ports (' num2str(csirs.NumCSIRSPorts(1)) ').']);
    end

    % Check for the overlap between the CSI-RS indices
    csirsInd = nrCSIRSIndices(carrier,csirs,"OutputResourceFormat",'cell');
    numRes = numel(csirsInd);
    csirsIndAll = cell(1,numRes);
    ratioVal = csirs.NumCSIRSPorts(1)/prod(getCDMLengths(csirs));
    for resIdx = 1:numRes
        if ~isempty(csirsInd{resIdx})
            grid = nrResourceGrid(carrier,csirs.NumCSIRSPorts(1));
            [~,tempInd] = nrExtractResources(csirsInd{resIdx},grid);
            if numel(tempInd)/numel(csirsInd{resIdx}) ~= ratioVal
                error('nr5g:OverlappedCSIRSREsSingleResource',['CSI-RS indices of resource '...
                    num2str(resIdx) ' must be unique. Try changing the symbol or subcarrier locations.']);
            end
            csirsIndAll{resIdx} = tempInd(:);
            for idx = 1:resIdx-1
                overlappedInd = ismember(csirsIndAll{idx},csirsIndAll{resIdx});
                if any(overlappedInd)
                    error('nr5g:OverlappedCSIRSREsMultipleResources',['The resource elements of the '...
                        'configured CSI-RS resources must not overlap. Try changing the symbol or '...
                        'subcarrier locations of CSI-RS resource ' num2str(idx) ' and resource ' num2str(resIdx) '.']);
                end
            end
        end
    end
end

function cdmLengths = getCDMLengths(csirs)
%   CDMLENGTHS = getCDMLengths(CSIRS) returns the CDM lengths given the
%   CSI-RS configuration object CSIRS.

    CDMType = csirs.CDMType;
    if ~iscell(csirs.CDMType)
        CDMType = {csirs.CDMType};
    end
    CDMTypeOpts = {'noCDM','fd-CDM2','CDM4','CDM8'};
    CDMLengthOpts = {[1 1],[2 1],[2 2],[2 4]};
    cdmLengths = CDMLengthOpts{strcmpi(CDMTypeOpts,CDMType{1})};
end

function plotWidebandCQIAndSINR(cqiPracticalPerSlot,cqiPerfectPerSlot,SINRPerSubbandPerCWPractical,SINRPerSubbandPerCWPerfect)
%   plotWidebandCQIAndSINR(CQIPRACTICALPERSLOT,CQIPERFECTPERSLOT,SINRPERSUBBANDPERCWPRACTICAL,SINRPERSUBBANDPERCWPERFECT)
%   plots the wideband SINR and wideband CQI values for each codeword
%   across all active slots (in which the CQI is reported as other
%   than NaN) for practical and perfect channel estimation cases.

    numCW = size(cqiPracticalPerSlot,2);
    % Plot wideband CQI values
    for cwIdx = 1:numCW
        cqiPracticalPerCW = permute(cqiPracticalPerSlot(1,cwIdx,:),[1 3 2]);
        cqiPerfectPerCW = permute(cqiPerfectPerSlot(1,cwIdx,:),[1 3 2]);
        SINRPerCWPractical = permute(SINRPerSubbandPerCWPractical(1,cwIdx,:),[1 3 2]);
        SINRPerCWPerfect = permute(SINRPerSubbandPerCWPerfect(1,cwIdx,:),[1 3 2]);

        % Get logical array to represent active slots in which CQI is
        % reported
        activeSlotsLogAry = ~isnan(cqiPracticalPerCW);

        % Get slot numbers (0-based) in which CQI is reported
        activeSlotNum = find(activeSlotsLogAry)-1;

        % Extract wideband CQI indices for slots where CQI is reported
        % as other than NaN
        cqiPracticalPerCWActiveSlots = cqiPracticalPerCW(activeSlotsLogAry);
        cqiPerfectPerCWActiveSlots = cqiPerfectPerCW(activeSlotsLogAry);
        widebandSINRPractical = 10*log10(SINRPerCWPractical(1,activeSlotsLogAry));
        widebandSINRPerfect = 10*log10(SINRPerCWPerfect(1,activeSlotsLogAry));
        xTickLables = num2cell(activeSlotNum(:));

        if isempty(cqiPracticalPerCWActiveSlots)
            disp('No CQI data to plot, because all CQI values are NaNs.');
            return;
        end

        figure();
        subplot(211)
        plot(widebandSINRPerfect,'r^-')
        hold on;
        plot(widebandSINRPractical,'b^-')
        title(['Estimated Wideband SINR Values for Codeword ' num2str(cwIdx)]);
        xlabel('Slots');
        ylabel('Wideband SINR Values in dB');
        xticks(1:numel(cqiPracticalPerCWActiveSlots));
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([widebandSINRPractical(:);widebandSINRPerfect(:)]);
        ylim([lowerBound-1 upperBound+3.5]);
        legend({'Perfect channel est.','Practical channel est.'});

        subplot(212)
        plot(cqiPerfectPerCWActiveSlots,'r-o');
        hold on;
        plot(cqiPracticalPerCWActiveSlots,'b-*');
        xlabel('Slots');
        xticks(1:numel(cqiPracticalPerCWActiveSlots));
        xticklabels(xTickLables);
        ylabel('Wideband CQI');
        [lowerBound,upperBound] = bounds([cqiPracticalPerCWActiveSlots(:);cqiPerfectPerCWActiveSlots(:)]);
        ylim([lowerBound-1 upperBound+3.5]);
        title(['Wideband CQI Values for Codeword ' num2str(cwIdx)]);
        legend({'Perfect channel est.','Practical channel est.'});
    end
end

function plotSubbandCQIAndSINR(subbandCQIPractical,subbandCQIPerfect,SINRPerCWPractical,SINRPerCWPerfect,nslot)
%   plotSUBBANDCQIAndSINR(SUBBANDCQIPRACTICAL,SUBBANDCQIPERFECT,SINRPERCWPRACTICAL,SINRPERCWPERFECT,NSLOT)
%   plots the SINR and CQI values for each codeword across all subbands
%   for practical and perfect channel estimation cases for the given slot
%   NSLOT. The function does not plot the values if CQIMode is
%   'Wideband' or if the CQI and SINR values are all NaNs.

    numCW = size(subbandCQIPractical,2);
    numSubbands = size(subbandCQIPractical,1);
    if numSubbands > 1
        Mode = 'Subband';
    else
        Mode = 'Wideband';
    end

    % Plot subband CQI values
    if strcmpi(Mode,'subband')
        for cwIdx = 1:numCW
            subbandCQIPerCWPractical = subbandCQIPractical(2:end,cwIdx,nslot);
            subbandCQIPerCWPerfect = subbandCQIPerfect(2:end,cwIdx,nslot);
            subbandSINRPerCWPractical = 10*log10(SINRPerCWPractical(2:end,cwIdx,nslot));
            subbandSINRPerCWPerfect = 10*log10(SINRPerCWPerfect(2:end,cwIdx,nslot));

            xTickLables = num2cell(1:numel(subbandCQIPerfect(2:end,cwIdx,1)));
            if all(isnan(subbandCQIPerCWPractical))
                disp(['For the specified slot (' num2str(nslot) '), CQI values are not reported. Please choose another slot number.'])
            else
                figure();
                subplot(211)
                plot(subbandSINRPerCWPerfect,'r^-')
                hold on;
                plot(subbandSINRPerCWPractical,'b^-')
                title(['Estimated Subband SINR Values for Codeword ' num2str(cwIdx)]);
                xlabel('Subbands');
                ylabel('Subband SINR Values in dB');
                xticks(1:numSubbands);
                xticklabels(xTickLables);
                xlim([0 numSubbands+1]);
                [lowerBound,upperBound] = bounds([subbandSINRPerCWPerfect;subbandSINRPerCWPractical]);
                ylim([lowerBound-1 upperBound+3.5]);
                legend({'Perfect channel est.','Practical channel est.'});

                subplot(212)
                plot(subbandCQIPerCWPerfect,'r-o');
                hold on;
                plot(subbandCQIPerCWPractical,'b-*');
                title(['Subband CQI Values for Codeword ' num2str(cwIdx)]);
                xlabel('Subbands');
                ylabel('Subbands CQI');
                xticks(1:numSubbands);
                xticklabels(xTickLables);
                xlim([0 numSubbands+1]);
                [lowerBound,upperBound] = bounds([subbandCQIPerCWPerfect(:,1);subbandCQIPerCWPractical(:,1)]);
                ylim([lowerBound-1 upperBound+3.5]);
                legend({'Perfect channel est.','Practical channel est.'});
            end
        end
    end
end

function plotPMI(pmiPracticalPerSlot,pmiPerfectPerSlot,nslot)
%   plotPMI(PMIPRACTICALPERSLOT,PMIPERFECTPERSLOT,NSLOT) plots the PMI i1
%   indices across all active slots for practical and perfect
%   channel estimation scenarios. The function also plots the i2 indices of
%   practical and perfect channel estimation scenarios across all
%   active slots, when the PMI mode is 'Wideband' or plots i2 indices
%   across all subbands for the specified slot number NSLOT when the
%   PMI mode is 'Subband'.

    % Extract i1 values for slots where PMI is reported as other
    % than NaN
    i1PerfectVals = reshape([pmiPerfectPerSlot(:).i1],3,[])';
    i1PracticalVals = reshape([pmiPracticalPerSlot(:).i1],3,[])';

    % Get logical array to represent active slots in which PMI is
    % reported
    activeSlotsLogAry = ~isnan(i1PerfectVals(:,1));

    % Get slot numbers (0-based) in which PMI is reported
    activeSlotNum = find(activeSlotsLogAry)-1;

    % Get number of active slots
    numActiveSlots = numel(activeSlotNum);

    % Extract wideband PMI indices for slots where PMI is reported
    % as other than NaN
    i1PerfectValsActiveSlots = i1PerfectVals(activeSlotsLogAry,:);
    i1PracticalValsActiveSlots = i1PracticalVals(activeSlotsLogAry,:);

    if isempty(i1PerfectValsActiveSlots)
        disp('No PMI data to plot, because all PMI values are NaNs.');
        return;
    end
    % Get i11 indices
    i11PerfectVals = i1PerfectValsActiveSlots(:,1);
    i11PracticalVals = i1PracticalValsActiveSlots(:,1);

    % Plot i11 values
    figure;
    subplot(411)
    plot(i11PerfectVals,'r-o');
    hold on;
    plot(i11PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i11 Indices');
    xticks(1:numActiveSlots);
    xTickLables = num2cell(activeSlotNum(:));
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i11PerfectVals; i11PracticalVals]);
    ylim([lowerBound-2 upperBound+2]);
    title('PMI: i11 Indices')
    legend({'Perfect channel est.','Practical channel est.'});

    % Get i12 indices
    i12PerfectVals = i1PerfectValsActiveSlots(:,2);
    i12PracticalVals = i1PracticalValsActiveSlots(:,2);

    % Plot i12 values
    subplot(412)
    plot(i12PerfectVals,'r-o');
    hold on;
    plot(i12PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i12 Indices');
    xticks(1:numActiveSlots);
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i12PerfectVals; i12PracticalVals]);
    ylim([lowerBound-2 upperBound+2]);
    title('PMI: i12 Indices')
    legend({'Perfect channel est.','Practical channel est.'});

    % Get i13 indices
    i13PerfectVals = i1PerfectValsActiveSlots(:,3);
    i13PracticalVals = i1PracticalValsActiveSlots(:,3);

    % Plot i13 values
    subplot(413)
    plot(i13PerfectVals,'r-o');
    hold on;
    plot(i13PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i13 Indices');
    xticks(1:numActiveSlots);
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i13PerfectVals; i13PracticalVals]);
    ylim([lowerBound-2 upperBound+2]);
    title('PMI: i13 Indices')
    legend({'Perfect channel est.','Practical channel est.'});

    % Extract i2 values
    numSlots = numel(pmiPracticalPerSlot);
    i2PerfectVals = reshape([pmiPerfectPerSlot(:).i2],[],numSlots)';     % Of size NumSlots-by-NumSubbands
    i2PracticalVals = reshape([pmiPracticalPerSlot(:).i2],[],numSlots)'; % Of size NumSlots-by-NumSubbands

    % Extract i2 values for all active slots where PMI is reported as other than
    % NaN
    i2PerfectValsActiveSlots = i2PerfectVals(activeSlotsLogAry,:);
    i2PracticalValsActiveSlots = i2PracticalVals(activeSlotsLogAry,:);

    numSubbands = size(i2PracticalVals,2);
    if numSubbands > 1
        mode = 'Subband';
    else
        mode = 'Wideband';
    end

    % Plot i2 values
    if strcmpi(mode,'Wideband')
        subplot(414);
        plot(i2PerfectValsActiveSlots,'r-o');
        hold on;
        plot(i2PracticalValsActiveSlots,'b-*');
        title('PMI: i2 Indices')
        xlabel('Slots')
        ylabel('i2 Indices');
        xticks(1:numActiveSlots);
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([i2PerfectValsActiveSlots; i2PracticalValsActiveSlots]);
        ylim([lowerBound-2 upperBound+2]);
        legend({'Perfect channel est.','Practical channel est.'});
    else
        if ~all(isnan(i2PerfectVals(nslot,:)))
            subplot(414);
            plot(i2PerfectVals(nslot,:),'r-o');
            hold on;
            plot(i2PracticalVals(nslot,:),'b-*');
            title(['PMI: i2 Indices for All Subbands in Slot ' num2str(nslot)]);
            xlabel('Subbands')
            ylabel('i2 Indices');
            xticks(1:numSubbands);
            xticklabels(num2cell(1:numSubbands));
            [lowerBound,upperBound] = bounds([i2PerfectVals(nslot,:) i2PracticalVals(nslot,:)]);
            yticks(lowerBound:upperBound);
            yticklabels(num2cell(lowerBound:upperBound));
            xlim([0 size(i2PerfectVals,2)+1])
            ylim([lowerBound-2 upperBound+2]);
            legend({'Perfect channel est.','Practical channel est.'});
        else
            disp(['For the specified slot (' num2str(nslot) '), PMI i2 indices are not reported. Please choose another slot number.'])
        end
    end
end

Смотрите также

Функции

Объекты

Похожие темы