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

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

Введение

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

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

Длина симуляции и точка ОСШ

Установите длину симуляции в терминах количества систем координат 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, как определено в разделе 5.2.2.3.1 TS 38.214.

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

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

  • CQIMode: Режим отчетности CQI ('Subband', 'Wideband')

  • PMIMode: Режим отчетности PMI ('Subband', 'Wideband')

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

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

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

  • CodиSubsetRestriction: Параметр ограничения, относящийся к набору индексов кодовой книги 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). ОСШ определяется по RE и применяется к каждой приемной антенне.

  4. Выполните временную синхронизацию и демодуляцию OFDM: Для практической синхронизации коррелируйте принятую форму волны с 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 не сообщается.

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

% 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 сконфигурирован как 'Wideband'

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

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

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

См. также

Функции

Объекты

Похожие темы