Этот пример, который реализации передают в нисходящем направлении многопользовательский несколько - ввел, несколько - выводят (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, состоящую из многих нисходящих пазов (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 (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 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 для каждого UE. SRSs для всего UEs сконфигурированы, чтобы быть переданными в специальном пазе, или в восходящем пазе, если нет никакого специального паза (или если он не содержит восходящих символов). Пример выполняет мультиплексирование с разделением времени (TDM) SRSs при помощи различных чисел символа OFDM и мультиплексирование деления частоты (FDM) при помощи различных смещений расчески. Для каждого UE количество портов SRS сконфигурировано, чтобы быть равным количеству слоев для этого UE.
SRSs = hMultiUserSRS(tddPattern,specialSlot,carrier,numLayers);
Для получения дополнительной информации о параметризации SRS смотрите пример Настройки NR SRS.
Сконфигурируйте 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.
Пример поддерживает эти методы перед кодированием.
'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;
Сконфигурируйте модель канала распространения для каждого 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 с примером Трассировки лучей.
Эта схема показывает структуру симуляции пропускной способности.
Для пазов, запланированных для 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