exponenta event banner

5G Отчеты CSI прямого канала NR

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

Введение

Параметры 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 представляет собой набор индексов, соответствующих матрице предварительного кодирования, которая может использоваться для передачи данных нисходящей линии связи. Кодовая книга выбирается из набора возможных кодовых книг, определенных в таблицах TS 38.214 с 5.2.2.2.1-1 по 5.2.2.2.1-12, на основе возможного количества уровней передачи для параметров конфигурации передачи нисходящей линии связи и сообщения CSI, таких как размеры антенной панели и режим кодовой книги. Кодовая книга состоит из набора матриц предварительного кодирования. Для заданных условий канала отношение сигнала к помехе и шуму (SINR) вычисляется на стороне приемника путем рассмотрения всех матриц предварительного кодирования из выбранной кодовой книги. Индексы матрицы предварительного кодирования, которая дает максимальное SINR, сообщаются как PMI (составляющий два набора индексов i1, i2, как определено в TS 38,214 Section 5,2,2,2,1). На рисунке показана процедура выбора PMI.

Выбор CQI

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

  • 0,1 для «cqi-Table» как «table1» или «table2»

  • 0,00001 для 'cqi-Table' как 'table' 3 '

«Таблица cqi-Table» является параметром более высокого уровня, который соответствует таблице CQI по сравнению с MCS, и таблица поиска SINR вычисляется для этой таблицы. В этом примере используется 0.1 BLER (соответствующий 90-процентной пропускной способности) и «cqi-Table» в качестве «table1» (TS 38.214, таблица 5.2.2.1-2). Взаимосвязь между индексами CQI, схемой модуляции и кодовой скоростью (из которой получен размер транспортного блока) описана в таблицах TS 38.214 5.2.2.1-2-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 во временной и частотной областях для практических и совершенных сценариев оценки канала.

Длина моделирования и точка SNR

Задайте длину моделирования в терминах количества кадров 10 мс. SNR (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 с точки зрения количества блоков физических ресурсов (PRB)

  • NStartBWP: начальный индекс PRB BWP относительно CRB 0

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

  • CQIMode: Режим отчетности CQI («поддиапазон», «широкополосный»)

  • PMIMode: Режим отчетов PMI («поддиапазон», «широкополосный»)

  • Размер поддиапазона: размер поддиапазона, определенный в таблице 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)

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

  • Параметр ограничения, относящийся к набору индексов кодовой книги 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 генерируется, передается по каналу и затем обрабатывается на стороне приемника для вычисления значений CQI и PMI. Обработка окончания передачи для приема для каждого слота выполняется следующим образом:

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

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

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

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

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

  6. Вычислите значения CQI и PMI: вычислите значения 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 сконфигурирован как Subband

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. "НР; Процедуры физического уровня для данных. "Проект партнерства третьего поколения; Техническая спецификация на сеть радиодоступа группы.

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

Пример использует эти локальные функции для проверки объекта конфигурации 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

См. также

Функции

Объекты

Связанные темы