TDD основанный на взаимности PDSCH MU-MIMO Используя SRS

Этот пример, который реализации передают в нисходящем направлении многопользовательский несколько - ввел, несколько - выводят (MU-MIMO) путем использования взаимности канала в сценарии дуплекса деления времени (TDD). Пример показывает, как определить beamforming веса для физического нисходящего канала совместно использованный канал (PDSCH) передача при помощи оценок канала на основе восходящего звучания опорными сигналами (SRS), переданного для каждого пользователя, и как запланировать PDSCHs для многого пользователя в то же время и ресурсы частоты.

Введение

Системы TDD используют тот же диапазон частот для восходящего канала (UL) и передают в нисходящем направлении передачи (DL). Радио-канал является обратной величиной, потому что это имеет те же характеристики и в UL и в направлениях DL. Используя эту взаимность, можно использовать передачу UL, чтобы получить оценку канала и затем использовать эту оценку канала, чтобы вычислить параметры, включая beamforming, для передачи DL. Этот метод известен как основанный на взаимности beamforming.

Этот пример реализации передает в нисходящем направлении MU-MIMO путем вычисления оценки канала для многого пользователя на основе их передач SRS. Принимая взаимность, пример затем использует эти оценки канала, чтобы выбрать группу пользователей, чтобы быть запланированным для передачи PDSCH и вычисленным DL beamforming веса для передач PDSCH тем пользователям. Когда базовая станция имеет достаточное число антенн, это возможно к beamform, которую передачи PDSCH для группы пользователей в то же время и частоту снабжают таким образом, что пользователи переносят мало интерференции друг от друга.

Этот пример планирует передачи SRS для всего UEs в части UL специального паза и планирует передачи PDSCH для UEs, выбранного пользовательским алгоритмом выбора в пазах DL и части DL специальных пазов.

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

Предположения симуляции

Пример использует эти предположения.

  • Настройка SRS позволяет, чтобы были запланированы до 16 UEs.

  • Количество слоев, присвоенных данному UE, случайно (или 1, 2, или 4) и фиксируется на время симуляции.

  • Количество портов антенны SRS равно количеству присвоенных слоев.

  • Количество портов антенны SRS равно количеству физических антенн, то есть, никакой пространственной фильтрации портов SRS на больший набор физических антенн.

  • Количество передающих антенн UE равно количеству портов антенны SRS, то есть, полное звучание канала используется.

  • Группа блока ресурса перед кодированием (PRG) размер пакета является тем же самым для всего UEs.

  • PDSCH не планируется в нисходящих пазах первой системы координат, происходящей до первого специального паза, потому что никакая оценка канала еще не доступна.

  • Опорный сигнал Demodulaton (DM-RS), тип настройки является типом 1 и длиной DM-RS, равняется 2, то есть, 8 ортогональных портов DM-RS могут быть запланированы. Для планирования большего количества пользователей пример использует неортогональный DM-RSs путем изменения борющейся идентичности.

  • HARQ не поддерживается.

  • Все UEs синхронизируются с в длине циклического префикса посредством начального захвата и передачи, синхронизирующей процедуры корректировки, видят Разделы TS 38.213 8 и 4.2 [1] для получения дополнительной информации. Смещение синхронизации в рамках деклараций длины циклического префикса как фаза переключает частотный диапазон на нижний регистр, и компенсируется оценкой канала и эквализацией.

Параметры симуляции

Задайте количество UEs, количество кадров, чтобы симулировать, и ОСШ для нисходящего канала и восходящего канала, приняв, что ОСШ является тем же самым для всех пользователей. Для объяснения определения ОСШ, что этот пример использует, см. Определение ОСШ, Используемое в Симуляциях Ссылки.

numUEs = 12;        % Total number of UEs served by the base station
numFrames = 1;      % Total number of frames to simulate
SNRdBDL = 25;       % Downlink SNR in dB
SNRdBUL = 20;       % Uplink SNR in dB

Настройка базовой станции

Настройка несущей

Установите параметры несущей, задав 51 блок ресурса в расстоянии между поднесущими на 30 кГц, которое соответствует полосе пропускания канала 20 МГц.

carrier = nrCarrierConfig;
carrier.NSizeGrid = 51;
carrier.SubcarrierSpacing = 30;

Настройка TDD

Пример считает настройку TDD, состоящую из многих нисходящих пазов (D), сопровождаемой специальным пазом (S), сопровождаемым многими восходящими пазами (U). Специальный паз представляет точку переключения от нисходящего канала до восходящей передачи и поэтому содержит нисходящие символы, сопровождаемые пустыми защитными символами, сопровождаемыми восходящими символами. Количество dowlink или восходящих символов в специальном пазе может быть нулем. Этот пример планирует передачи SRS в восходящей части специального паза и планирует передачи PDSCH в нисходящих пазах и в нисходящей части специальных пазов.

Представляйте шаблон паза TDD массивом строк, задающих тип слота.

tddPattern = ["D" "D" "D" "D" "D" "D" "D" "S" "U" "U"];

disp("Cyclic slot pattern:")
Cyclic slot pattern:
disp("Slot " + string((0:length(tddPattern)-1)') + ": " + tddPattern(:))
    "Slot 0: D"
    "Slot 1: D"
    "Slot 2: D"
    "Slot 3: D"
    "Slot 4: D"
    "Slot 5: D"
    "Slot 6: D"
    "Slot 7: S"
    "Slot 8: U"
    "Slot 9: U"

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

specialSlot = [6 4 4];

Общее количество символов в специальной конфигурации слота должно совпадать с количеством символов в пазе, данном carrier.SymbolsPerSlot.

if(sum(specialSlot)~=carrier.SymbolsPerSlot)
    error(['specialSlot must contain ' num2str(carrier.SymbolsPerSlot) ' symbols.']);
end

Размер антенной решетки

Задайте размер антенной решетки для базовой станции (BS). Примите прямоугольный массив. Размером антенной решетки является векторный [M N P], где M количество строк, N количество столбцов и P количество поляризации в антенной решетке.

bsAntSize = [2 8 2];

Настройка UE

Количество слоев и размеров антенной решетки

Случайным образом выберите количество слоев на UE (1, 2, или 4).

% Reset random generator for reproducibility
rng('default');

% Number of layers for each UE
numLayers = pow2(randi([0 2],[1 numUEs]))
numLayers = 1×12

     4     4     1     4     2     1     1     2     4     4     1     4

Количество слоев определяет размер антенной решетки для каждого UE согласно этой таблице.

Number из СлоиUE Антенна Массив Размер1[111]2[112]4[122]Таблица, показывающая отношение между размером антенной решетки для каждого UE и количеством слоев.

% Number of rows, columns and polarizations in rectangular array for each UE
ueAntSizes = 1 + (numLayers.' > [4 2 1])
ueAntSizes = 12×3

     1     2     2
     1     2     2
     1     1     1
     1     2     2
     1     1     2
     1     1     1
     1     1     1
     1     1     2
     1     2     2
     1     2     2
      ⋮

Настройка SRS

Сконфигурируйте параметры SRS для каждого UE. SRSs для всего UEs сконфигурированы, чтобы быть переданными в специальном пазе, или в восходящем пазе, если нет никакого специального паза (или если он не содержит восходящих символов). Пример выполняет мультиплексирование с разделением времени (TDM) SRSs при помощи различных чисел символа OFDM и мультиплексирование деления частоты (FDM) при помощи различных смещений расчески. Для каждого UE количество портов SRS сконфигурировано, чтобы быть равным количеству слоев для этого UE.

SRSs = hMultiUserSRS(tddPattern,specialSlot,carrier,numLayers);

Для получения дополнительной информации о параметризации SRS смотрите пример Настройки NR SRS.

PDSCH и настройка DL-SCH

Сконфигурируйте PDSCH и параметры DL-SCH для каждого UE этими параметрами.

  • Уровень 3/4 кодирование и квадратурная амплитудная (64-QAM) модуляция с 64 точками

  • Тип 1 настройки DM-RS и длина DM-RS 2, который обеспечивает 8 ортогональных портов DM-RS, видят таблицу 7.4.1.1.2-1 [5] TS 38.211

  • Размер пакета PRG 2, смотрите Раздел TS 38.214 5.1.2.3 [6]

Сконфигурируйте соответствующее количество слоев для каждого UE и установите RNTI, равный номеру UE (1...numUEs).

PDSCHs = hMultiUserPDSCH(numLayers);

Можно сконфигурировать далее параметры PDSCH для каждой передачи во время пользовательского процесса выбора при помощи hMultiUserSelection функция.

Для получения дополнительной информации о параметризации PDSCH смотрите Распределение ресурсов NR PDSCH и DM-RS и пример Опорных сигналов PT-RS.

Алгоритмические параметры

Метод MU-MIMO перед кодированием

Пример поддерживает эти методы перед кодированием.

  • 'BD': Блокируйте диагонализацию

  • 'ZF': Нулевое принуждение

  • 'RZF': Упорядоченное нулевое принуждение

Метод перед кодированием используется, чтобы определить beamforming веса для каждого PDSCH во время пользовательского выбора. Для получения дополнительной информации о методе Диагонализации Блока смотрите blkdiagbfweights функционируйте и [2]. Для получения дополнительной информации о принуждении нуля и упорядоченных обеспечивающих нуль методах, см. [3].

algParameters = struct;
algParameters.PrecodingMethod = 'RZF';

Сконфигурируйте количество слоев, которые пользовательский алгоритм выбора планирует в каждом PRG в каждом пазе. Это - общее количество слоев, запланированных через всех пользователей в любом данном PRG в этом пазе.

algParameters.ScheduledLayers = 8;

Настройка средства оценки канала

Логическая переменная PerfectChannelEstimator средства управления образовывают канал поведение оценки. Когда вы устанавливаете эту переменную на true, пример использует совершенную оценку канала для SRS и прием PDSCH. В противном случае пример использует практическую оценку канала на основе значений полученного SRS и PDSCH DM-RS.

algParameters.PerfectChannelEstimator = false;

Модели канала CDL

Сконфигурируйте модель канала распространения для каждого UE. hMultiUserChannels функционируйте использует nrCDLChannel объект сконфигурировать каналы кластеризованной линии задержки (CDL). Используйте эту функцию, чтобы создать начальный объект канала с профилем задержки CDL-A, распространением задержки на 100 нс и эффектом Доплера на 5 Гц. Функция затем конфигурирует различные каналы для каждого UE путем изменения начального объекта к:

  • Случайным образом выберите azmiuth и угол зенита и возместите углы отъезда в каждый кластер этими углами, который симулирует эффект различного UEs, находящегося в других местах в среде вокруг базовой станции.

  • Сконфигурируйте антенную решетку UE согласно размеру антенной решетки, выбранному в Количестве Размеров Антенной решетки и Слоев.

  • Установите различное значение Seed свойство. Это гарантирует, что канал для каждого UE имеет независимое быстрое исчезновение.

delayProfile = 'CDL-A';
delaySpread = 100e-9;
maximumDopplerShift = 5;
channels = hMultiUserChannels(delayProfile,delaySpread,maximumDopplerShift,bsAntSize,ueAntSizes);

Чтобы визуализировать настройку канала CDL, смотрите Визуализировать пример Характеристик Модели Канала CDL. Чтобы создать параметры модели канала CDL при помощи выхода анализа трассировки лучей, смотрите Индивидуальную настройку Модели Канала CDL с примером Трассировки лучей.

Симуляция пропускной способности MU-MIMO Используя основанный на взаимности Beamforming

Эта схема показывает структуру симуляции пропускной способности.

Для пазов, запланированных для SRS:

  • Передача UL: Сгенерируйте форму волны SRS для каждого UE.

  • Каналы CDL, AWGN: Для каждого UE отправьте форму волны через канал, объедините канал выходные параметры в базовой станции и добавьте шум.

  • UL получают: Для каждого UE выполните основанный на SRS канал и шумовую оценку. Для получения дополнительной информации смотрите, что Оценка информации о состоянии Канала Восходящего канала NR Использует пример SRS.

  • CSI обновления: Запишите канал и шумовые оценки для использования в последующих пазах.

Для пазов, запланированных для PDSCH:

  • Пользовательский выбор: Рассмотрение нового CSI для всего UEs, определите который UEs запланировать для PDSCH и сконфигурировать параметры PDSCH (выделенный RBS, beamforming, порты DM-RS, скремблируя идентичность).

  • Передача DL: Для каждого UE выполните кодирование DL-SCH данных и сгенерируйте и beamform PDSCH. Суммируйте beamformed PDSCHs, чтобы сформировать переданный сигнал.

  • Каналы CDL, AWGN: Отправьте переданный сигнал через канал для каждого UE и добавьте шум, чтобы создать принятую форму волны для каждого UE.

  • DL получают: Для каждого UE демодулируйте принятую форму волны, демодулируйте PDSCH и декодируйте DL-SCH.

  • Передача данных обновления: Запишите транспортный размер блока (TBS) и контроль циклическим избыточным кодом (CRC) на каждый UE, который использование в качестве примера вычислить итоговую пропускную способность заканчивается.

diagnosticsOn флаг управляет отображением диагностической информации во время симуляции. Когда установлено в true, пример отображает эту информацию:

  • Текущий номер слота и тип паза (D, S, или U)

  • Для пазов, содержащих SRS, список UEs, для которого SRS передан и получен

  • Для пазов, содержащих PDSCH, список UEs, для которого PDSCH планируется, количество выделенных блоков ресурса (NPRB), EVM для каждого слоя и результата CRC декодирования DL-SCH

% Set up record of data transfer and CSI
dataState = setupDataTransfer(carrier,numFrames,numLayers);
csi = setupCSI(carrier,bsAntSize,ueAntSizes);

diagnosticsOn = true;

% For each slot
for nSlot = 0:(carrier.SlotsPerFrame*numFrames)-1

    % Update the slot number
    carrier.NSlot = nSlot;

    % Display slot number and type (if diagnostics are enabled)
    if (diagnosticsOn)
        disp("Slot " + string(carrier.NSlot) + ": " + tddPattern(mod(carrier.NSlot,numel(tddPattern))+1));
    end

    % Schedule UEs for data transmission
    [schedule,PDSCHs] = hMultiUserSelection(csi,tddPattern,specialSlot,carrier,PDSCHs,bsAntSize,algParameters);
    
    % PDSCH transmissions for all UEs scheduled for data
    [txDL,txSymbols,singleLayerTBS] = hMultiDLTransmit(carrier,PDSCHs(schedule.PDSCH),bsAntSize);
    
    % SRS transmissions for all UEs scheduled for SRS
    [txUL,schedule.SRS] = hMultiULTransmit(carrier,SRSs);
    
    % Apply fading channels
    [channels,rxDL,rxUL] = hApplyMultiUserChannels(tddPattern,specialSlot,carrier,schedule,channels,txDL,txUL);
    
    % Apply AWGN
    rxDL = hApplyMultiUserAWGN(carrier,rxDL,SNRdBDL,CombineWaveforms=false);
    rxUL = hApplyMultiUserAWGN(carrier,rxUL,SNRdBUL,CombineWaveforms=true);
    
    % For all UEs scheduled for SRS, estimate CSI and record it
    [H,nVar] = hMultiULReceive(carrier,SRSs(schedule.SRS),rxUL,algParameters);
    csi = updateCSI(csi,carrier,schedule.SRS,H,nVar);
    
    % For all UEs scheduled for data, perform PDSCH reception and record the results
    [TBS,CRC,eqSymbols] = hMultiDLReceive(carrier,PDSCHs(schedule.PDSCH),rxDL,algParameters);
    dataState = updateDataTransfer(dataState,carrier,singleLayerTBS,schedule.PDSCH,TBS,CRC);

    % Display scheduled SRSs and PDSCHs, PDSCH EVM, and DL-SCH CRC (if diagnostics are enabled)
    if (diagnosticsOn)
        displayDiagnostics(schedule,PDSCHs,txSymbols,eqSymbols,CRC);
    end

end
Slot 0: D
Slot 1: D
Slot 2: D
Slot 3: D
Slot 4: D
Slot 5: D
Slot 6: D
Slot 7: S
SRS transmission
Slot 8: U
Slot 9: U
Slot 10: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 19  5  5  4  2  6  6 14 11  8  7 11 
       14  5     5  3        8  7  6     9 
       12  5    13              7  6     6 
       15  5     8              6  6     8 
  CRC:  1  0  0  0  0  0  0  0  0  0  0  0 
Slot 11: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 19  5  5  4  2  6  6 15 11  8  7 11 
       15  5     5  3        8  7  5     8 
       12  5    13              7  6     7 
       15  6     8              6  6     8 
  CRC:  1  0  0  0  0  0  0  0  0  0  0  0 
Slot 12: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 19  5  5  4  2  6  6 14 10  8  7 11 
       15  5     5  3        8  7  6     9 
       11  5    13              7  6     7 
       15  5     8              6  6     8 
  CRC:  1  0  0  0  0  0  0  0  0  0  0  0 
Slot 13: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 18  5  5  4  2  6  6 13 10  7  7 11 
       15  5     5  3        9  7  5     9 
       11  5    13              7  6     6 
       14  5     8              6  6     7 
  CRC:  1  0  0  0  0  0  0  0  0  0  0  0 
Slot 14: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 17  5  5  4  2  6  6 14 11  8  8 12 
       13  5     5  3        9  7  5     9 
       11  5    13              7  6     7 
       14  5     8              6  6     8 
  CRC:  0  0  0  0  0  0  0  0  0  0  0  0 
Slot 15: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 16  6  5  4  2  6  6 14 11  7  8 12 
       13  5     5  3        9  7  5     8 
       11  5    13              7  6     7 
       14  5     7              6  6     8 
  CRC:  0  0  0  0  0  0  0  0  0  0  0  0 
Slot 16: D
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 18  5  6  4  2  6  6 13 10  8  9 12 
       14  5     5  3        9  7  5     8 
       11  5    13              7  6     7 
       15  5     8              6  6     8 
  CRC:  1  0  0  0  0  0  0  0  0  0  0  0 
Slot 17: S
PDSCH:  1  2  3  4  5  6  7  8  9 10 11 12 
 NPRB:  7  8 43  6 43 41 24 10  8  6 30  6 
  EVM: 17  6  6  4  2  6  6 13 11  7  9 13 
       14  5     5  3       10  7  5     9 
       11  5    13              7  6     8 
       14  6     8              6  6     9 
  CRC:  0  0  0  0  0  0  0  0  0  0  0  0 
SRS transmission
Slot 18: U
Slot 19: U

Результаты пропускной способности

Отобразите сводную таблицу результатов пропускной способности, которая показывает частоту появления ошибочных блоков (BLER) и общая битная пропускная способность для каждого пользователя.

results = summarizeResults(dataState);
disp(results);
    User    BLER     Throughput (bits)
    ____    _____    _________________

      1     0.625            42880    
      2         0       1.5391e+05    
      3         0        2.064e+05    
      4         0       1.1462e+05    
      5         0       4.1301e+05    
      6         0       1.9539e+05    
      7         0       1.1462e+05    
      8         0            95800    
      9         0       1.5391e+05    
     10         0       1.1462e+05    
     11         0       1.4278e+05    
     12         0       1.1462e+05    

Отобразите общую пропускную способность через всех пользователей.

totalThroughput = sum(results.("Throughput (bits)"));
dataRate = totalThroughput / (numFrames * 0.01) / 1e6;
disp(['Total throughput across all users: ' num2str(dataRate,'%0.3f') ' Mbps']);
Total throughput across all users: 186.254 Mbps

Отобразите средний BLER через всех пользователей.

disp(['Average BLER across all users: ' num2str(mean(results.BLER,'omitnan'),'%0.3f')]);
Average BLER across all users: 0.052

Отобразите способность относительно одноуровневого пользователя, выделенного целой полосе пропускания несущей. Максимальная возможная способность равняется количеству запланированных слоев, данных algParameters.ScheduledLayers.

singleLayerThroughput = sum(dataState(1).SingleLayerTBS,'omitnan');
capacity = totalThroughput / singleLayerThroughput;
disp(['Capacity relative to a single-layer user: ' num2str(capacity,'%0.2f') 'x']);
Capacity relative to a single-layer user: 7.75x

Способность превышает количество слоев, сконфигурированных для UEs (4 максимума, ~2.6 средних значения), показывая, что планирование MU-MIMO и предварительное кодирование могут успешно увеличить способность ячейки по сравнению с созданием однопользовательских передач.

Ссылки

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

2. Спенсер, Q.H., и др. "Обеспечивающие нуль Методы для Нисходящего Пространственного Мультиплексирования в Многопользовательских Каналах MIMO". Транзакции IEEE на Обработке сигналов, Издании 52, № 2, февраль 2004, стр 461-471.

3. Очистите, C.B., и др. "Метод Векторного Возмущения для Почти полной Мультиантенны Многопользовательская Коммуникация — Первая часть: Инверсия Канала и Регуляризация". Транзакции IEEE на Обработке сигналов, Издании 53, № 1, февраль 2005, стр 195-202.

4. 3GPP TS 38.101-4. “NR; передача радио Оборудования пользователя (UE) и прием; Часть 4: Требования к производительности”. Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

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

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

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

function csi = setupCSI(carrier,bsAntSize,ueAntSizes)
% Set up record of CSI obtained via SRS
    
    NCRB = carrier.NSizeGrid + carrier.NStartGrid;
    numUEs = size(ueAntSizes,1);
    csi = repmat(struct('H',[],'nVar',[],'NSlot',[]),1,numUEs);
    P = prod(bsAntSize);
    
    for ue = 1:numUEs
        
        R = prod(ueAntSizes(ue,:));
        csi(ue).H = NaN([NCRB 1 P R]);
        csi(ue).nVar = NaN([NCRB 1 R]);
        csi(ue).NSlot = NaN([NCRB 1]);
        
    end
    
end

function dataState = setupDataTransfer(carrier,numFrames,numLayers)
% Set up record of PDSCH data transfer
    
    nSlots = carrier.SlotsPerFrame * numFrames;
    TBS = NaN(1,nSlots);
    CRC = NaN(1,nSlots);
    tput = zeros(1,nSlots);
    numUEs = numel(numLayers);
    dataState = repmat(struct('TBS',TBS,'SingleLayerTBS',TBS,'CRC',CRC,'Throughput',tput),1,numUEs);
    
end

function csi = updateCSI(csi,carrier,SRS,H,nVar)
% Update record of CSI obtained via SRS
    
    for ue = SRS
        
        H_ue = H{ue==SRS};
        nVar_ue = nVar{ue==SRS};        
        idx = find(all(~isnan(nVar_ue),3));
        csi(ue).H(idx,:,:,:) = H_ue(idx,:,:,:);
        csi(ue).nVar(idx,:,:) = nVar_ue(idx,:,:);
        csi(ue).NSlot(idx) = carrier.NSlot;
        
    end
    
end

function dataState = updateDataTransfer(dataState,carrier,singleLayerTBS,PDSCH,TBS,CRC)
% Update record of PDSCH data transfer

    nSlot = carrier.NSlot;

    for ue = PDSCH

        TBS_ue = TBS{ue==PDSCH};
        CRC_ue = CRC{ue==PDSCH};
        dataState(ue).SingleLayerTBS(nSlot + 1) = singleLayerTBS;
        dataState(ue).TBS(nSlot + 1) = TBS_ue;
        dataState(ue).CRC(nSlot + 1) = CRC_ue;
        dataState(ue).Throughput(nSlot + 1) = TBS_ue .* (1 - CRC_ue);

    end

end

function results = summarizeResults(dataState)
% Summarize simulation results
    
    numUEs = numel(dataState);
    BLER = zeros(numUEs,1);
    Throughput = zeros(numUEs,1);
    
    for ue = 1:numUEs
        
        CRC = dataState(ue).CRC;
        CRC = CRC(~isnan(CRC));
        BLER(ue) = sum(CRC) / numel(CRC);
        Throughput(ue) = sum(dataState(ue).Throughput);
        
    end
    
    User = (1:numUEs).';
    results = table(User,BLER,Throughput);
    results.Properties.VariableNames{3} = 'Throughput (bits)';
    
end

function displayDiagnostics(schedule,PDSCHs,txSymbols,eqSymbols,CRC)
% Display diagnostic information

    dispfn = @(x,y)disp([sprintf('%5s: ',x) sprintf('%2d ',y)]);

    if (~isempty(schedule.PDSCH))

        numUEs = numel(schedule.PDSCH);
        maxLayers = 4;
        EVM = NaN(maxLayers,numUEs);
        NPRB = zeros(1,numUEs);

        for i = 1:numUEs

            ue = schedule.PDSCH(i);
            pdsch = PDSCHs(ue).Config;
            NPRB(i) = numel(pdsch.PRBSet);
            evm = comm.EVM;
            EVM(1:pdsch.NumLayers,i) = evm(txSymbols{i},eqSymbols{i});

        end

        dispfn('PDSCH',schedule.PDSCH);
        dispfn('NPRB',NPRB);

        evmlabel = '  EVM: ';
        for i = 1:maxLayers
            if (i>1)
                evmlabel(:) = ' ';
            end
            if (~all(isnan(EVM(i,:))))
                disp([evmlabel strrep(sprintf('%2d ',round(EVM(i,:))),'NaN','  ')]);
            end
        end

        dispfn('CRC',[CRC{:}]);

    end

    if (~isempty(schedule.SRS))

        disp('SRS transmission');

    end

end

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

Функции

Объекты

Похожие темы

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