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

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

Введение

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

Выбор RI

RI задает количество возможных слоев передачи для нисходящей передачи при определенных условиях канала. Это также называют как максимальное количество некоррелированых путей, которые могут использоваться для нисходящей передачи. Другие параметры CSI как PMI и CQI вычисляются на основе ранга, обеспеченного RI. Для данных условий канала, hRISelect вычисляет сигнал к интерференционному и шумовому отношению (SINR) наряду с PMI для всего возможного верного номера слоев передачи. Функция сообщает о количестве слоев передачи с максимальным общим SINR как ранг.

Выбор PMI

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

Выбор CQI

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

Ссылочный CSI ресурс является группой нисходящего частотного диапазона и ресурсов временного интервала, которые сконфигурированы, как задано в Разделе TS 38.214 5.2.2.5. gNB передает один физический нисходящий канал совместно использованный канал (PDSCH) транспортный блок, занимающий блоки ресурса, которые называют как ресурс ссылки CSI с комбинацией схемы модуляции и целевой скорости кода, которые соответствуют каждому индексу CQI. UE выбирает самый высокий индекс как CQI, когда упомянутый транспортный блок PDSCH может быть получен с транспортной вероятностью блочной ошибки, не превышающей:

  • 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.

hCQISelect функция вычисляет значение 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 = 10;  % 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);

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

Задайте параметры, требуемые для CQI, PMI и расчета RI как структура с полями:

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

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

  • CodebookType: Тип книг шифров, согласно которым должны быть вычислены параметры CSI ('Type1SinglePanel', 'Type1MultiPanel')

  • PanelDimensions: Размерности панели антенны, соответствующие CodebookType поле .

Если CodebookType сконфигурирован как 'Type1SinglePanel', размерности панели сконфигурированы как [N1 N2] согласно таблице 5.2.2.2.1-2 TS 38.214, как показано на рисунке

Если CodebookType сконфигурирован как 'Type1MultiPanel', размерности панели сконфигурированы как [Ng N1 N2] согласно таблице 5.2.2.2.2-1 TS 38.214, как показано на рисунке

  • CQIMode: Режим CQI, сообщающего ('Subband', 'Wideband')

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

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

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

  • CodebookMode: Режим книги шифров, согласно которому выведены книги шифров. Когда CodebookType сконфигурирован как 'Type1SinglePanel', это поле требуется только, когда количество слоев передачи равняется 1 или 2, и количество портов CSI-RS больше 2.

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

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

  • RIRestriction: Параметр ограничения, имеющий отношение к индикатору ранга, который подразумевает набор рангов, которые ограничиваются в использовании для расчета RI.

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

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

Полагайте, что канал 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 и значения RI. Выполните шаги для передачи, чтобы получить обработку конца для каждого паза.

  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 и значения RI: Вычислите CQI, PMI и значения RI с помощью практических и совершенных оценок канала.

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

% Initialize variables to store CQI, PMI, RI, 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 = [];
riPracticalPerSlot = [];
riPerfectPerSlot = [];

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

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

% Initialize the practical timing offset as zero. It is updated in the
% slots when the correlation is strong for practical synchronization.
offsetPractical = 0;

% Initialize a variable to store the slot numbers (0-based) where CSI-RS
% resources are present
activeSlots = [];

% 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. Correlate the received waveform
    % with the CSI-RS to obtain the timing offset estimate and the
    % correlation magnitude. Use the function hSkipWeakTimingOffset to
    % update the receiver timing offset. If the correlation peak is weak,
    % the current timing estimate is ignored and the previous offset is
    % used.
    [t,mag] = nrTimingEstimate(carrier,rxWaveform,csirsInd,csirsSym);
    offsetPractical = hSkipWeakTimingOffset(offsetPractical,t,mag);

    % 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);

    % Append zeros in the event where the timing synchronization results in
    % an incomplete slot
    symbPerSlot = carrier.SymbolsPerSlot;
    K = size(rxGridPractical,1);
    LPractical = size(rxGridPractical,2);
    LPerfect = size(rxGridPerfect,2);
    if LPractical < symbPerSlot
        rxGridPractical = cat(2,rxGridPractical,zeros(K,symbPerSlot-LPractical,nRxAnts));
    end
    if LPerfect < symbPerSlot
        rxGridPerfect = cat(2,rxGridPerfect,zeros(K,symbPerSlot-LPerfect,nRxAnts));
    end
    rxGridPractical = rxGridPractical(:,1:symbPerSlot,:);
    rxGridPerfect = rxGridPerfect(:,1:symbPerSlot,:);

    % Consider only the NZP-CSI-RS symbols and indices for channel estimation
    nzpCSIRSSym = csirsSym(csirsSym ~= 0);
    nzpCSIRSInd = csirsInd(csirsSym ~= 0);

    % Calculate practical channel estimate. Use a time-averaging window
    % that covers all of the transmitted CSI-RS symbols.
    [PracticalHest,nVarPractical] = nrChannelEstimate(carrier,rxGridPractical, ...
        nzpCSIRSInd,nzpCSIRSSym,'CDMLengths',cdmLengths,'AveragingWindow',[0 5]);

    % 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(:));
    if ~isempty(nzpCSIRSInd)
        activeSlots = [activeSlots slotIdx]; %#ok<AGROW>

        % Calculate the RI value using practical channel estimate
        numLayersPractical = hRISelect(carrier,csirs,reportConfig,PracticalHest,nVarPractical);

        % Calculate CQI and PMI values using practical channel estimate
        [cqiPractical,pmiPractical,cqiInfoPractical] = hCQISelect(carrier,csirs, ...
            reportConfig,numLayersPractical,PracticalHest,nVarPractical);
        numCodeWordsPr = size(cqiPractical,2);
        numSBs = size(cqiPractical,1);

        % Store CQI, PMI, RI, and subband SINR values of each slot for the
        % practical channel estimation scenario. Because the number of
        % codewords can vary based on the rank, append NaNs to the
        % CQI-related variables to account for the second codeword
        % information in the slots where only one codeword is present.
        riPracticalPerSlot(1,slotIdx+1) = numLayersPractical; %#ok<SAGROW> 
        cqiPracticalPerSlot(:,:,slotIdx+1) = [cqiPractical NaN(numSBs,2-numCodeWordsPr)]; %#ok<SAGROW> 
        pmiPracticalPerSlot(slotIdx+1) = pmiPractical;
        subbandCQIPractical(:,:,slotIdx+1) = [cqiInfoPractical.SubbandCQI NaN(numSBs,2-numCodeWordsPr)]; %#ok<SAGROW> 
        SINRPerSubbandPerCWPractical(:,:,slotIdx+1) = [cqiInfoPractical.SINRPerSubbandPerCW NaN(numSBs,2-numCodeWordsPr)]; %#ok<SAGROW> 

        % Calculate the RI value using perfect channel estimate
        numLayersPerfect = hRISelect(carrier,csirs,reportConfig,PerfectHest,nVarPerfect);

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

        % Store CQI, PMI, RI, and subband SINR values of each slot for the
        % perfect channel estimation scenario. Because the number of
        % codewords can vary based on the rank, append NaNs to the
        % CQI-related variables to account for the second codeword
        % information in the slots where only one codeword is present.
        riPerfectPerSlot(1,slotIdx+1) = numLayersPerfect; %#ok<SAGROW> 
        cqiPerfectPerSlot(:,:,slotIdx+1) = [cqiPerfect NaN(numSBs,2-numCodeWordsPe)]; %#ok<SAGROW> 
        subbandCQIPerfect(:,:,slotIdx+1) = [cqiInfoPerfect.SubbandCQI NaN(numSBs,2-numCodeWordsPe)]; %#ok<SAGROW> 
        pmiPerfectPerSlot(slotIdx+1) = pmiPerfect;
        SINRPerSubbandPerCWPerfect(:,:,slotIdx+1) = [cqiInfoPerfect.SINRPerSubbandPerCW NaN(numSBs,2-numCodeWordsPe)]; %#ok<SAGROW> 
    end
end

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

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

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

plotWidebandCQIAndSINR(cqiPracticalPerSlot,cqiPerfectPerSlot,SINRPerSubbandPerCWPractical,SINRPerSubbandPerCWPerfect,activeSlots);

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

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

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

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

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

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

Этот раздел показывает графики, которые подсвечивают изменения PMI и индексов RI, должных образовывать канал, исчезая условия, и для практической оценки канала и для совершенных сценариев оценки канала. Графики показывают только пазы, в которых передается CSI-RS или в котором вычисляются PMI и RI.

Когда тип книги шифров является типом 1 одна панель

Индексы PMI (i1:[i1,1,i1,2,i1,3] и i2).

Первый график показывает ранг и соответствующую PMI i1 изменение индексов через несколько пазов.

Второй график подсвечивает изменение i2 индексы через:

  • Пазы - Когда PMIMode сконфигурирован как 'Wideband'

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

Когда тип книги шифров является мультипанелью типа 1

Индексы PMI (i1:[i1,1,i1,2,i1,3,i1,4,1,i1,4,2,i1,4,3] и i2:[i2,0,i2,1,i2,2]).

В этом случае первые два графика показывают ранг и соответствующую PMI i1 индексы (i1,1 к i1,4,3) изменение через несколько пазов.

Третий график подсвечивает изменение каждого из i2 индекс (i2,0 к i2,2) через:

  • Пазы - Когда PMIMode сконфигурирован как 'Wideband'

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

% Set the showPMIandRIPlots flag to true, if you want to see the plots for
% the PMI and RI 
showPMIandRIPlots = true;
if showPMIandRIPlots
    plotPMIAndRI(pmiPracticalPerSlot,pmiPerfectPerSlot,riPracticalPerSlot,riPerfectPerSlot,activeSlots,slotNum);
end

Figure contains 4 axes objects. Axes object 1 with title RI Values contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes object 2 with title PMI: i11 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes object 3 with title PMI: i12 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est.. Axes object 4 with title PMI: i13 Indices contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est..

Figure contains an axes object. The axes object with title PMI: i2 Indices for All Subbands in Slot 0 contains 2 objects of type line. These objects represent Perfect channel est., Practical channel est..

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

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

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

Ссылки

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

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

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

function validateCSIRSConfig(carrier,csirs,nTxAnts)
%   validateCSIRSConfig(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,activeSlots)
%   plotWidebandCQIAndSINR(CQIPRACTICALPERSLOT,CQIPERFECTPERSLOT,SINRPERSUBBANDPERCWPRACTICAL,SINRPERSUBBANDPERCWPERFECT,ACTIVESLOTS)
%   plots the wideband SINR and wideband CQI values for each codeword
%   across all specified active slots ACTIVESLOTS (0-based) (in which the
%   CQI is reported as other than NaN) for practical and perfect channel
%   estimation cases.

    % Check if there are no slots in which CSI-RS is present
    if isempty(activeSlots)
        disp('No CQI data to plot, because there are no slots in which CSI-RS is present.');
        return;
    end

    % Get slot numbers (1-based) in which CQI is reported
    activeSlotNum = activeSlots + 1;

    if all(isnan(cqiPracticalPerSlot(1,2,activeSlotNum)))
        numCW = 1;
    else
        numCW = 2;
    end
    cqiPracticalPerCW = permute(cqiPracticalPerSlot(1,:,:),[1 3 2]);
    cqiPerfectPerCW = permute(cqiPerfectPerSlot(1,:,:),[1 3 2]);
    SINRPerCWPractical = permute(SINRPerSubbandPerCWPractical(1,:,:),[1 3 2]);
    SINRPerCWPerfect = permute(SINRPerSubbandPerCWPerfect(1,:,:),[1 3 2]);

    % Extract wideband CQI indices for slots where CSI-RS is present
    cqiPracticalPerCWActiveSlots = cqiPracticalPerCW(1,activeSlotNum,:);
    cqiPerfectPerCWActiveSlots = cqiPerfectPerCW(1,activeSlotNum,:);
    widebandSINRPractical = 10*log10(SINRPerCWPractical(1,activeSlotNum,:));
    widebandSINRPerfect = 10*log10(SINRPerCWPerfect(1,activeSlotNum,:));
    xTickLables = num2cell(activeSlots(:));

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

    figure();
    subplot(211)
    plot(widebandSINRPerfect(:,:,1),'ro-')
    hold on;
    plot(widebandSINRPractical(:,:,1),'b*-')
    if numCW == 2
        hold on;
        plot(widebandSINRPerfect(:,:,2),'rs:')
        hold on;
        plot(widebandSINRPractical(:,:,2),'bd:')
        title('Estimated Wideband SINR Values for Codeword 1&2');
        xlabel('Slots');
        ylabel('Wideband SINR Values in dB');
        xticks(1:size(cqiPracticalPerCWActiveSlots,2));
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([widebandSINRPractical(:);widebandSINRPerfect(:)],'omitnan');
        ylim([lowerBound-1 upperBound+3.5]);
        legend({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.','Codeword 2:Perfect channel est.','Codeword 2:Practical channel est.'});
    else
        title('Estimated Wideband SINR Values for Codeword 1');
        xlabel('Slots');
        ylabel('Wideband SINR Values in dB');
        xticks(1:size(cqiPracticalPerCWActiveSlots,2));
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([widebandSINRPractical(:);widebandSINRPerfect(:)]);
        ylim([lowerBound-1 upperBound+3.5]);
        legend({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.'});
    end

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

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

    % Check if there are no slots in which CSI-RS is present
    if isempty(activeSlots)
        disp('No CQI data to plot, because there are no slots in which CSI-RS is present.');
        return;
    end

    if all(isnan(subbandCQIPractical(:,2,activeSlots+1)))
        numCW = 1;
    else
        numCW = 2;
    end
    numSubbands = size(subbandCQIPractical,1);
    if numSubbands > 1
        Mode = 'Subband';
    else
        Mode = 'Wideband';
    end

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

        xTickLables = num2cell(1:size(subbandCQIPerfect,1)-1); % Excluding the value of wideband
        if ~any(nslot == activeSlots)
            disp(['For the specified slot (' num2str(nslot) '), CQI values are not reported. Please choose another slot number.'])
        else
            figure();
            subplot(211)
            plot(subbandSINRPerCWPerfect(:,1),'ro-')
            hold on;
            plot(subbandSINRPerCWPractical(:,1),'b*-')
            if numCW == 2
                hold on;
                plot(subbandSINRPerCWPerfect(:,2),'rs:')
                hold on;
                plot(subbandSINRPerCWPractical(:,2),'bd:')
                title(['Estimated Subband SINR Values for Codeword 1&2 in Slot ' num2str(nslot)]);
                xlabel('Subbands');
                ylabel('Subband SINR Values in dB');
                xticks(1:numSubbands);
                xticklabels(xTickLables);
                xlim([0 numSubbands+1]);
                [lowerBound,upperBound] = bounds([subbandSINRPerCWPerfect(:);subbandSINRPerCWPractical(:)],'omitnan');
                ylim([lowerBound-1 upperBound+3.5]);
                legend({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.','Codeword 2:Perfect channel est.','Codeword 2:Practical channel est.'});
            else
                title(['Estimated Subband SINR Values for Codeword 1 in Slot ' num2str(nslot)]);
                xlabel('Subbands');
                ylabel('Subband SINR Values in dB');
                xticks(1:numSubbands);
                xticklabels(xTickLables);
                xlim([0 numSubbands+1]);
                [lowerBound,upperBound] = bounds([subbandSINRPerCWPerfect(:,1);subbandSINRPerCWPractical(:,1)]);
                ylim([lowerBound-1 upperBound+3.5]);
                legend({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.'});
            end

            subplot(212)
            plot(subbandCQIPerCWPerfect(:,1),'r-o');
            hold on;
            plot(subbandCQIPerCWPractical(:,1),'b-*');
            if numCW == 2
                hold on;
                plot(subbandCQIPerCWPerfect(:,2),'r:s');
                hold on;
                plot(subbandCQIPerCWPractical(:,2),'b:d');
                title(['Subband CQI Values for Codeword 1&2 in Slot ' num2str(nslot)]);
                xlabel('Subbands');
                ylabel('Subbands CQI');
                xticks(1:numSubbands);
                xticklabels(xTickLables);
                xlim([0 numSubbands+1]);
                [lowerBound,upperBound] = bounds([subbandCQIPerCWPerfect(:);subbandCQIPerCWPractical(:)],'omitnan');
                ylim([lowerBound-1 upperBound+3.5]);
                legend({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.','Codeword 2:Perfect channel est.','Codeword 2:Practical channel est.'});
            else
                title(['Subband CQI Values for Codeword 1 in Slot ' num2str(nslot)]);
                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({'Codeword 1:Perfect channel est.','Codeword 1:Practical channel est.'});
            end
        end
    end
end

function plotPMIAndRI(pmiPracticalPerSlot,pmiPerfectPerSlot,riPracticalPerSlot,riPerfectPerSlot,activeSlots,nslot)
%   plotPMIAndRI(PMIPRACTICALPERSLOT,PMIPERFECTPERSLOT,RIPRACTICALPERSLOT,RIPERFECTPERSLOT,ACTIVESLOTS,NSLOT)
%   plots the RI and PMI i1 indices across all specified active slots
%   ACTIVESLOTS (0-based), for practical and perfect channel estimation
%   scenarios. The function also plots the i2 indices of practical and
%   perfect channel estimation scenarios across all specified active slots
%   when the PMI mode is 'Wideband' or plots i2 indices across all of the
%   subbands for the specified slot number NSLOT (0-based) when the PMI
%   mode is 'Subband'.

    % Check if there are no slots in which CSI-RS is present
    if isempty(activeSlots)
        disp('No PMI and RI data to plot, because there are no slots in which CSI-RS is present.');
        return;
    end

    % Get slot numbers (1-based) in which PMI is reported
    activeSlotNum = activeSlots+1;
    
    % Get number of active slots
    numActiveSlots = numel(activeSlotNum);
    
    numi1Indices = numel(pmiPracticalPerSlot(activeSlotNum(1)).i1);
    
    if numi1Indices == 6
        codebookType = 'Type1MultiPanel';
    else
        codebookType = 'Type1SinglePanel';
    end
    
    % Extract wideband PMI indices (i1 values) for slots where CSI-RS is
    % present
    i1PerfectValsActiveSlots = reshape([pmiPerfectPerSlot(activeSlotNum).i1],numi1Indices,[])';
    i1PracticalValsActiveSlots = reshape([pmiPracticalPerSlot(activeSlotNum).i1],numi1Indices,[])';
    
    % Extract RI values for slots where CSI-RS is present
    RIPerfectValsActiveSlots = riPerfectPerSlot(activeSlotNum)';
    RIPracticalValsActiveSlots = riPracticalPerSlot(activeSlotNum)';
    
    if isempty(i1PerfectValsActiveSlots)
        disp('No PMI and RI data to plot, because all PMI and RI values are NaNs.');
        return;
    end
    
    figure;
    subplot(4,1,1)
    plot(RIPerfectValsActiveSlots,'r-o');
    hold on;
    plot(RIPracticalValsActiveSlots,'b-*');
    xlabel('Slots')
    ylabel('RI Values');
    xticks(1:numActiveSlots);
    xTickLables = num2cell(activeSlots(:));
    xticklabels(xTickLables);
    [~,upperBound] = bounds([RIPerfectValsActiveSlots; RIPracticalValsActiveSlots]);
    xlim([0 numActiveSlots+8]);
    ylim([0 upperBound+2]);
    yticks(0:upperBound+2);
    title('RI Values')
    legend({'Perfect channel est.','Practical channel est.'});
    
    % Get i11 indices
    i11PerfectVals = i1PerfectValsActiveSlots(:,1);
    i11PracticalVals = i1PracticalValsActiveSlots(:,1);
    
    % Plot i11 values
    subplot(4,1,2)
    plot(i11PerfectVals,'r-o');
    hold on;
    plot(i11PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i11 Indices');
    xticks(1:numActiveSlots);
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i11PerfectVals; i11PracticalVals]);
    xlim([0 numActiveSlots+8]);
    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(4,1,3)
    plot(i12PerfectVals,'r-o');
    hold on;
    plot(i12PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i12 Indices');
    xticks(1:numActiveSlots);
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i12PerfectVals; i12PracticalVals]);
    xlim([0 numActiveSlots+8]);
    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(4,1,4)
    plot(i13PerfectVals,'r-o');
    hold on;
    plot(i13PracticalVals,'b-*');
    xlabel('Slots')
    ylabel('i13 Indices');
    xticks(1:numActiveSlots);
    xticklabels(xTickLables);
    [lowerBound,upperBound] = bounds([i13PerfectVals; i13PracticalVals]);
    xlim([0 numActiveSlots+8]);
    ylim([lowerBound-2 upperBound+2]);
    title('PMI: i13 Indices')
    legend({'Perfect channel est.','Practical channel est.'});
    
    % Plot the i141, i142 and i143 indices in type 1 multipanel case
    if strcmpi(codebookType,'Type1MultiPanel')
        figure()
        % Get i141 indices
        i141PerfectVals = i1PerfectValsActiveSlots(:,4);
        i141PracticalVals = i1PracticalValsActiveSlots(:,4);
    
        % Plot i141 values
        subplot(3,1,1)
        plot(i141PerfectVals,'r-o');
        hold on;
        plot(i141PracticalVals,'b-*');
        xlabel('Slots')
        ylabel('i141 Indices');
        xticks(1:numActiveSlots);
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([i141PerfectVals; i141PracticalVals]);
        xlim([0 numActiveSlots+8]);
        ylim([lowerBound-2 upperBound+2]);
        title('PMI: i141 Indices')
        legend({'Perfect channel est.','Practical channel est.'});
    
        % Get i142 indices
        i142PerfectVals = i1PerfectValsActiveSlots(:,5);
        i142PracticalVals = i1PracticalValsActiveSlots(:,5);
    
        % Plot i142 values
        subplot(3,1,2)
        plot(i142PerfectVals,'r-o');
        hold on;
        plot(i142PracticalVals,'b-*');
        xlabel('Slots')
        ylabel('i142 Indices');
        xticks(1:numActiveSlots);
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([i142PerfectVals; i142PracticalVals]);
        xlim([0 numActiveSlots+8]);
        ylim([lowerBound-2 upperBound+2]);
        title('PMI: i142 Indices')
        legend({'Perfect channel est.','Practical channel est.'});
    
        % Get i143 indices
        i143PerfectVals = i1PerfectValsActiveSlots(:,6);
        i143PracticalVals = i1PracticalValsActiveSlots(:,6);
    
        % Plot i143 values
        subplot(3,1,3)
        plot(i143PerfectVals,'r-o');
        hold on;
        plot(i143PracticalVals,'b-*');
        xlabel('Slots')
        ylabel('i143 Indices');
        xticks(1:numActiveSlots);
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([i143PerfectVals; i143PracticalVals]);
        xlim([0 numActiveSlots+8]);
        ylim([lowerBound-2 upperBound+2]);
        title('PMI: i143 Indices')
        legend({'Perfect channel est.','Practical channel est.'});
    end
    
    numSubbands = size(pmiPracticalPerSlot(activeSlotNum(1)).i2,2);
    
    % Get the number of i2 indices according to codebook type
    numi2Indices = 1;
    if strcmpi(codebookType,'Type1MultiPanel')
        numi2Indices = 3;
    end
    
    % Extract i2 values
    i2PerfectVals = reshape([pmiPerfectPerSlot(activeSlotNum).i2],[numSubbands,numi2Indices,numActiveSlots]);     % Of size numActiveSlots-by-numi2Indices-numSubbands
    i2PracticalVals = reshape([pmiPracticalPerSlot(activeSlotNum).i2],[numSubbands,numi2Indices,numActiveSlots]); % Of size numActiveSlots-by-numi2Indices-numSubbands
    
    
    if numSubbands > 1
        mode = 'Subband';
    else
        mode = 'Wideband';
    end
    
    % Plot i2 values
    if strcmpi(mode,'Wideband')
        figure;
    
        % In type 1 single panel case, there is only one i2 index. The
        % first column of i2PerfectVals and i2PracticalVals corresponds to
        % i2 index. In type 1 multipanel case, there i2 values are a set
        % of three indices i20, i21 and i22. The first column of in this
        % case i2PerfectVals and i2PracticalVals corresponds to i20 index.
        % Extract the respective index values
        i20PerfectVals = reshape(i2PerfectVals(:,1,:),[],numActiveSlots).';
        i20PracticalVals = reshape(i2PracticalVals(:,1,:),[],numActiveSlots).';
    
        % Plot i2 values or i20 values respectively
        subplot(numi2Indices,1,1)
        plot(i20PerfectVals,'r-o');
        hold on;
        plot(i20PracticalVals,'b-*');
        if strcmpi(codebookType,'Type1SinglePanel')
            title('PMI: i2 Indices')
            xlabel('Slots')
            ylabel('i2 Indices');
        else
            title('PMI: i20 Indices')
            xlabel('Slots')
            ylabel('i20 Indices');
        end
        xticks(1:numActiveSlots);
        xticklabels(xTickLables);
        [lowerBound,upperBound] = bounds([i20PerfectVals; i20PracticalVals]);
        xlim([0 numActiveSlots+8]);
        ylim([lowerBound-1 upperBound+1]);
        legend({'Perfect channel est.','Practical channel est.'});
    
        if strcmpi(codebookType,'Type1MultiPanel')
            % Get i21 values in each slot
            i21PerfectVals = reshape(i2PerfectVals(:,2,:),[],numActiveSlots).';
            i21PracticalVals = reshape(i2PracticalVals(:,2,:),[],numActiveSlots).';
    
            % Plot i21 values
            subplot(numi2Indices,1,2)
            plot(i21PerfectVals,'r-o');
            hold on;
            plot(i21PracticalVals,'b-*');
            title('PMI: i21 Indices')
            xlabel('Slots')
            ylabel('i21 Indices');
            xticks(1:numActiveSlots);
            xticklabels(xTickLables);
            [lowerBound,upperBound] = bounds([i21PerfectVals; i21PracticalVals]);
            xlim([0 numActiveSlots+8]);
            ylim([lowerBound-1 upperBound+1]);
            legend({'Perfect channel est.','Practical channel est.'});
    
            % Get i22 values in each slot
            i22PerfectVals = reshape(i2PerfectVals(:,3,:),[],numActiveSlots).';
            i22PracticalVals = reshape(i2PracticalVals(:,3,:),[],numActiveSlots).';
    
            % Plot i22 values
            subplot(numi2Indices,1,3)
            plot(i22PerfectVals,'r-o');
            hold on;
            plot(i22PracticalVals,'b-*');
            title('PMI: i22 Indices')
            xlabel('Slots')
            ylabel('i22 Indices');
            xticks(1:numActiveSlots);
            xticklabels(xTickLables);
            [lowerBound,upperBound] = bounds([i22PerfectVals; i22PracticalVals]);
            xlim([0 numActiveSlots+8]);
            ylim([lowerBound-1 upperBound+1]);
            legend({'Perfect channel est.','Practical channel est.'});
        end
    else
        if any(nslot == activeSlots)
    
            % In subband mode, plot the PMI i2 indices corresponding to the
            % specified slot number
            figure;
            % Plot i20 values
            subplot(numi2Indices,1,1)
            plot(pmiPerfectPerSlot(nslot+1).i2(1,:),'r-o');
            hold on;
            plot(pmiPracticalPerSlot(nslot+1).i2(1,:),'b-*');
            if strcmpi(codebookType,'Type1SinglePanel')
                title(['PMI: i2 Indices for All Subbands in Slot ' num2str(nslot)]);
                xlabel('Subbands')
                ylabel('i2 Indices');
            else
                title(['PMI: i20 Indices for All Subbands in Slot ' num2str(nslot)]);
                xlabel('Subbands')
                ylabel('i20 Indices');
            end
            xticks(1:numSubbands);
            xticklabels(num2cell(1:numSubbands));
            [lowerBound,upperBound] = bounds([pmiPerfectPerSlot(nslot+1).i2(1,:) pmiPracticalPerSlot(nslot+1).i2(1,:)]);
            yticks(lowerBound:upperBound);
            yticklabels(num2cell(lowerBound:upperBound));
            xlim([0 numSubbands+1])
            ylim([lowerBound-1 upperBound+1]);
            legend({'Perfect channel est.','Practical channel est.'});
    
            if strcmpi(codebookType,'Type1MultiPanel')
                % Plot i21 values
                subplot(numi2Indices,1,2)
                plot(pmiPerfectPerSlot(nslot+1).i2(2,:),'r-o');
                hold on;
                plot(pmiPracticalPerSlot(nslot+1).i2(2,:),'b-*');
                title(['PMI: i21 Indices for All Subbands in Slot ' num2str(nslot)]);
                xlabel('Subbands')
                ylabel('i21 Indices');
                xticks(1:numSubbands);
                xticklabels(num2cell(1:numSubbands));
                [lowerBound,upperBound] = bounds([pmiPerfectPerSlot(nslot+1).i2(2,:) pmiPracticalPerSlot(nslot+1).i2(2,:)]);
                yticks(lowerBound:upperBound);
                yticklabels(num2cell(lowerBound:upperBound));
                xlim([0 numSubbands+1])
                ylim([lowerBound-1 upperBound+1]);
                legend({'Perfect channel est.','Practical channel est.'});
    
                % Plot i22 values
                subplot(numi2Indices,1,3)
                plot(pmiPerfectPerSlot(nslot+1).i2(3,:),'r-o');
                hold on;
                plot(pmiPracticalPerSlot(nslot+1).i2(3,:),'b-*');
                title(['PMI: i22 Indices for All Subbands in Slot ' num2str(nslot)]);
                xlabel('Subbands')
                ylabel('i22 Indices');
                xticks(1:numSubbands);
                xticklabels(num2cell(1:numSubbands));
                [lowerBound,upperBound] = bounds([pmiPerfectPerSlot(nslot+1).i2(3,:) pmiPracticalPerSlot(nslot+1).i2(3,:)]);
                yticks(lowerBound:upperBound);
                yticklabels(num2cell(lowerBound:upperBound));
                xlim([0 numSubbands+1])
                ylim([lowerBound-1 upperBound+1]);
                legend({'Perfect channel est.','Practical channel est.'});
            end
        else
            disp(['For the specified slot (' num2str(nslot) '), PMI i2 indices are not reported. Please choose another slot number.'])
        end
    end
end

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

Функции

Объекты

Похожие темы

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