Этот пример показывает, как использовать развертку луча как на концах передатчика (gNB), так и на концах приемника (UE) 5G системы NR. Используя блоки сигнала синхронизации (SSB), этот пример иллюстрирует некоторые процедуры управления лучом, используемые во время начального доступа. Чтобы выполнить протягивание луча, в примере используется несколько компонентов из Phased Array System Toolbox™.
Поддержка частот миллиметровой волны (mmWave) требует направленных ссылок, что привело к спецификации процедур управления лучом для начального доступа в NR. Управление лучом является набором процедур слоя 1 (физический) и слоя 2 (управление доступом к среде), чтобы получить и сохранить набор ссылок пары луча (луч, используемый в gNB в паре с лучом, используемым в UE). Процедуры управления лучом применяются как для нисходящей, так и для восходящей передачи и приема [1], [2]. Эти процедуры включают:
Стреловидность
Измерение луча
Определение луча
Отчетность по лучам
Восстановление луча
Этот пример фокусируется на начальных процедурах доступа для незанятых пользователей, когда устанавливается соединение между пользовательским оборудованием (UE) и узлом сети доступа (gNB). На физическом слое, используя блоки сигнала синхронизации (SSB), переданные в виде пакета в нисходящем направлении (gNB - UE), в примере подсвечиваются как развертка луча точки передачи/приема (TRP), так и развертка луча UE, чтобы установить ссылку пары луча. Среди процедур управления несколькими лучами TR 38.802 определяет этот сдвоенный свип как процедуру P-1 [1].
После соединения для последующих передач может использоваться одна и та же ссылка пары лучей. При необходимости лучи дополнительно уточняются с использованием CSI-RS (для нисходящей линии связи) и SRS (для восходящей линии связи). В случае отказа балки эти парные ссылки могут быть восстановлены. Для примера уточнения пары пучков смотрите NR Nownlink Transmit-End Beam Refinement Using CSI-RS (5G Toolbox).
Этот пример генерирует пакет сигнала NR синхронизации, направляет каждый из SSB в пакете для прохождения по направлениям азимута и повышения, передает этот сигнал луча по пространственному каналу рассеяния и обрабатывает этот принятый сигнал по множеству лучей приемного конца. Пример измеряет мощность приемника опорного сигнала (RSRP) для каждой из пар луча приема и передачи (в двойном цикле) и определяет ссылку пары луча с максимальным RSRP. Эта ссылка пары луча, таким образом, означает лучшую пару луча на концах передачи и приема для моделируемого пространственного сценария. Этот рисунок показывает основные шаги обработки с таковыми управления лучами, подсвеченными цветом.
rng(211); % Set RNG state for repeatability
Задайте системные параметры для примера. Измените эти параметры, чтобы исследовать их влияние на систему.
prm.NCellID = 1; % Cell ID prm.FreqRange = 'FR1'; % Frequency range: 'FR1' or 'FR2' prm.CenterFreq = 3.5e9; % Hz prm.SSBlockPattern = 'Case B'; % Case A/B/C/D/E prm.SSBTransmitted = [ones(1,8) zeros(1,0)]; % 4/8 or 64 in length prm.TxArraySize = [8 8]; % Transmit array size, [rows cols] prm.TxAZlim = [-60 60]; % Transmit azimuthal sweep limits prm.TxELlim = [-90 0]; % Transmit elevation sweep limits prm.RxArraySize = [2 2]; % Receive array size, [rows cols] prm.RxAZlim = [-180 180]; % Receive azimuthal sweep limits prm.RxELlim = [0 90]; % Receive elevation sweep limits prm.ElevationSweep = false; % Enable/disable elevation sweep prm.SNRdB = 30; % SNR, dB prm.RSRPMode = 'SSSwDMRS'; % {'SSSwDMRS', 'SSSonly'}
В примере используются следующие параметры:
Идентификатор камеры для сценария с одной ячейкой с одной BS и UE
Частотная область значений, как строка для обозначения FR1 или FR2 операции
Центральная частота, в Гц, зависимая от частотной области значений
Шаблон блока сигнала синхронизации как один из случаев A/B/C для FR1 и случай D/E для FR2. Это также выбирает интервал между поднесущими.
Переданные SSB в шаблоне, как двоичный вектор длины 4 или 8 для FR1 и длины 64 для FR2. Количество переданных SSB устанавливает количество пучков как на передающем, так и на приемном концах.
Передайте массив размер, как двухэлементный вектор-строка, задающий количество антенных элементов в строках и столбцах передающего массива, соответственно. Равномерный прямоугольный массив (URA) используется, когда оба значения больше единицы.
Передайте пределы азимутального сдвига в степенях, чтобы задать начальный и конечный углы азимута для сдвига
Передайте пределы сдвига по повышению в степенях, чтобы задать начальный и конечный углы возвышения для сдвига
Размер массива приема, как двухэлементный вектор-строка с указанием количества антенных элементов в строках и столбцах приемного массива, соответственно. Равномерный прямоугольный массив (URA) используется, когда оба значения больше единицы.
Получите пределы азимутального сдвига в степенях, чтобы задать начальный и конечный углы азимута для сдвига
Получите пределы сдвига по повышению в степенях, чтобы задать начальный и конечный углы возвышения для сдвига
Включите или отключите смещение повышения как для передающего, так и для приемного концов. Включите протягивание повышения для FR2 и/или URA
Отношение сигнал/шум в дБ
Режим измерения для SSB, чтобы указать использование только вторичных сигналов синхронизации ('SSSonly') или использование PBCH DM-RS наряду с вторичными сигналами синхронизации ('SSSwDMRS')
prm = validateParams(prm);
Настройте параметры пакета сигнала синхронизации с помощью заданных системных параметров. Для начального доступа установите периодичность SSB в 20 мс.
txBurst.BlockPattern = prm.SSBlockPattern; txBurst.SSBTransmitted = prm.SSBTransmitted; txBurst.NCellID = prm.NCellID; txBurst.SSBPeriodicity = 20; txBurst.NFrame = 0; txBurst.Windowing = 0; txBurst.DisplayBurst = true; % Assume same subcarrier spacing for carrier as the burst carrier = nrCarrierConfig('NCellID',prm.NCellID,'NFrame',txBurst.NFrame); carrier.SubcarrierSpacing = prm.SCS; carrierInfo = nrOFDMInfo(carrier); txBurst.SampleRate = carrierInfo.SampleRate;
Для получения дополнительной информации о блоках и пакетах сигнала синхронизации см. учебное пособие «Блоки и пакеты сигнала синхронизации (5G Toolbox)».
Сконфигурируйте пространственный рассеивающий канал MIMO channel
. Эта модель канала применяет потери при распространении в свободном пространстве и, опционально, другие атмосферные ослабления к входу. Укажите местоположения для BS и UE следующим [x,y,z]
координаты в декартовой системе. В зависимости от заданных размеров массивов используйте либо равномерные линейные массивы (ULA), либо равномерные прямоугольные массивы (URA). Используйте изотропные антенные элементы для массивов.
c = physconst('LightSpeed'); % Propagation speed lambda = c/prm.CenterFreq; % Wavelength prm.posTx = [0;0;0]; % Transmit array position, [x;y;z], meters prm.posRx = [100;50;0]; % Receive array position, [x;y;z], meters toRxRange = rangeangle(prm.posTx,prm.posRx); spLoss = fspl(toRxRange,lambda); % Free space path loss % Transmit array if prm.IsTxURA % Uniform rectangular array arrayTx = phased.URA(prm.TxArraySize,0.5*lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); else % Uniform linear array arrayTx = phased.ULA(prm.NumTx, ... 'ElementSpacing',0.5*lambda, ... 'Element',phased.IsotropicAntennaElement('BackBaffled',true)); end % Receive array if prm.IsRxURA % Uniform rectangular array arrayRx = phased.URA(prm.RxArraySize,0.5*lambda, ... 'Element',phased.IsotropicAntennaElement); else % Uniform linear array arrayRx = phased.ULA(prm.NumRx, ... 'ElementSpacing',0.5*lambda, ... 'Element',phased.IsotropicAntennaElement); end % Scatterer locations prm.FixedScatMode = true; if prm.FixedScatMode % Fixed single scatterer location prm.ScatPos = [50; 80; 0]; else % Generate scatterers at random positions Nscat = 10; % Number of scatterers azRange = -180:180; elRange = -90:90; randAzOrder = randperm(length(azRange)); randElOrder = randperm(length(elRange)); azAngInSph = azRange(randAzOrder(1:Nscat)); elAngInSph = elRange(randElOrder(1:Nscat)); r = 20; % radius [x,y,z] = sph2cart(deg2rad(azAngInSph),deg2rad(elAngInSph),r); prm.ScatPos = [x;y;z] + (prm.posTx + prm.posRx)/2; end % Configure channel channel = phased.ScatteringMIMOChannel; channel.PropagationSpeed = c; channel.CarrierFrequency = prm.CenterFreq; channel.SampleRate = txBurst.SampleRate; channel.SimulateDirectPath = false; channel.ChannelResponseOutputPort = true; channel.Polarization = 'None'; channel.TransmitArray = arrayTx; channel.TransmitArrayPosition = prm.posTx; channel.ReceiveArray = arrayRx; channel.ReceiveArrayPosition = prm.posRx; channel.ScattererSpecificationSource = 'Property'; channel.ScattererPosition = prm.ScatPos; channel.ScattererCoefficient = ones(1,size(prm.ScatPos,2)); % Get maximum channel delay [~,~,tau] = channel(complex(randn(txBurst.SampleRate*1e-3,prm.NumTx), ... randn(txBurst.SampleRate*1e-3,prm.NumTx))); maxChDelay = ceil(max(tau)*txBurst.SampleRate);
Создайте сигнал всплеска SS [3] путем вызова hSSBurst
вспомогательная функция. Сгенерированная форма волны еще не сформирована лучом.
% Create and display burst information txBurstInfo = hSSBurstInfo(txBurst); disp(txBurstInfo); % Generate burst waveform and grid [burstWaveform,txBurstGrid] = hSSBurst(txBurst);
SubcarrierSpacing: 30 NCRB_SSB: -20 k_SSB: 0 FrequencyOffsetSSB: 0 MIB: [24x1 double] L: 8 SSBIndex: [0 1 2 3 4 5 6 7] i_SSB: [0 1 2 3 4 5 6 7] ibar_SSB: [0 1 2 3 4 5 6 7] SampleRate: 30720000 Nfft: 1024 NRB: 72 CyclicPrefix: 'Normal' OccupiedSubcarriers: [240x1 double] OccupiedSymbols: [8x4 double] Windowing: 0
Для достижения развертки пучка TRP, лучи каждого из блоков SS в сгенерированном пакете с помощью аналогового формирования пучка. Основываясь на количестве блоков SS в заданных пакетных и разверточных областях значений, определите и азимут, и направление по повышению для различных балок. Затем сформируйте отдельные блоки в пакете в каждое из этих направлений.
% Number of beams at both transmit and receive ends numBeams = sum(txBurst.SSBTransmitted); % Transmit beam angles in azimuth and elevation, equi-spaced azBW = beamwidth(arrayTx,prm.CenterFreq,'Cut','Azimuth'); elBW = beamwidth(arrayTx,prm.CenterFreq,'Cut','Elevation'); txBeamAng = hGetBeamSweepAngles(numBeams,prm.TxAZlim,prm.TxELlim, ... azBW,elBW,prm.ElevationSweep); % For evaluating transmit-side steering weights SteerVecTx = phased.SteeringVector('SensorArray',arrayTx, ... 'PropagationSpeed',c); % Apply steering per OFDM symbol for each SSB carrier.NSizeGrid = txBurstInfo.NRB; ofdmInfo = nrOFDMInfo(carrier); gridSymLengths = repmat(ofdmInfo.SymbolLengths,1, ... size(txBurstGrid,2)/length(ofdmInfo.SymbolLengths)); % repeat burst over numTx to prepare for steering strTxWaveform = repmat(burstWaveform,1,prm.NumTx)./sqrt(prm.NumTx); for ssb = 1:length(txBurstInfo.SSBIndex) % Extract SSB waveform from burst blockSymbols = txBurstInfo.OccupiedSymbols(ssb,:); startSSBInd = sum(gridSymLengths(1:blockSymbols(1)-1))+1; endSSBInd = sum(gridSymLengths(1:blockSymbols(4))); ssbWaveform = strTxWaveform(startSSBInd:endSSBInd,1); % Generate weights for steered direction wT = SteerVecTx(prm.CenterFreq,txBeamAng(:,ssb)); % Apply weights per transmit element to SSB strTxWaveform(startSSBInd:endSSBInd,:) = ssbWaveform.*(wT'); end
Затем по пространственно информированному рассеивающему каналу передается сигнал формирования луча.
Для развертки луча на приемном конце переданный сигнал пучка принимается последовательно по каждому приемному лучу. Для N
передающие лучи и M
принимайте лучи в процедуре P-1, каждый из N
лучи передаются M
время от gNB так, чтобы каждый передающий луч принимался по M
приемные лучи.
Пример принимает оба N
и M
равен количеству SSB в пакете. Для простоты пример генерирует только один пакет, но для имитации приема пакета по воздуху M
раз, приемник обрабатывает этот один пакет M
времени.
Этот рисунок показывает основанную на луче схему для разверток в gNB и UE для N = M = 4
, в азимутальной плоскости. Схема показывает время, затраченное на сдвоенную развертку, где каждый интервал в gNB соответствует SSB, и каждый интервал в UE соответствует пакету SS. Для изображенного сценария, балки S3
и U2
подсвечиваются как выбранная ссылка балка-пара условно. Пример реализует двойную развертку в течение временной длительности N*M
моменты времени.
Обработка приема переданного пакета включает в себя
Применение пространственно-осведомленного затухающего канала
Получите коэффициент усиления для компенсации вызванных потерь пути и AWGN
Формирование луча приемника
Коррекция времени
Демодуляция OFDM
Извлечение известной сетки SSB
Измерение RSRP на основе заданного режима измерения
Обработка повторяет эти шаги для каждого из приемных лучей, затем выбирает лучную пару на основе полного набора выполненных измерений.
Чтобы подсветить развертку луча, пример принимает известную информацию SSB в приемнике. Для получения дополнительной информации об обработке восстановления смотрите Поиск камеры NR и Восстановление MIB и SIB1 (5G Toolbox).
Для измерения SS-RSRP в режиме ожидания используйте либо только вторичные сигналы синхронизации (SSS), либо опорные сигналы демодуляции физического широковещательного канала (PBCH) (DM-RS) в дополнение к SSS (раздел 5.1.1. [4]). Задайте это по RSRPMode
параметр примера. Для FR2 измерение RSRP основано на объединенном сигнале от антенных элементов, в то время как измерение соответствует антенному элементу для FR1.
% Receive beam angles in azimuth and elevation, equi-spaced azBW = beamwidth(arrayRx,prm.CenterFreq,'Cut','Azimuth'); elBW = beamwidth(arrayRx,prm.CenterFreq,'Cut','Elevation'); rxBeamAng = hGetBeamSweepAngles(numBeams,prm.RxAZlim,prm.RxELlim, ... azBW,elBW,prm.ElevationSweep); % For evaluating receive-side steering weights SteerVecRx = phased.SteeringVector('SensorArray',arrayRx, ... 'PropagationSpeed',c); % AWGN level SNR = 10^(prm.SNRdB/20); % Convert to linear gain N0 = 1/(sqrt(2.0*prm.NumRx*double(ofdmInfo.Nfft))*SNR); % Noise Std. Dev. % Receive gain in linear terms, to compensate for the path loss rxGain = 10^(spLoss/20); % Generate a reference grid for timing correction % assumes an SSB in first slot pssRef = nrPSS(carrier.NCellID); pssInd = nrPSSIndices; pbchdmrsRef = nrPBCHDMRS(carrier.NCellID,txBurstInfo.ibar_SSB(1)); pbchDMRSInd = nrPBCHDMRSIndices(carrier.NCellID); pssGrid = zeros([240 4]); pssGrid(pssInd) = pssRef; pssGrid(pbchDMRSInd) = pbchdmrsRef; refGrid = zeros([12*carrier.NSizeGrid ofdmInfo.SymbolsPerSlot]); refGrid(txBurstInfo.OccupiedSubcarriers, ... txBurstInfo.OccupiedSymbols(1,:)) = pssGrid; % Loop over all receive beams rsrp = zeros(numBeams,numBeams); for rIdx = 1:numBeams % Fading channel, with path loss txWave = [strTxWaveform; zeros(maxChDelay,size(strTxWaveform,2))]; fadWave = channel(txWave); % Receive gain, to compensate for the path loss fadWaveG = fadWave*rxGain; % Add WGN noise = N0*complex(randn(size(fadWaveG)),randn(size(fadWaveG))); rxWaveform = fadWaveG + noise; % Generate weights for steered direction wR = SteerVecRx(prm.CenterFreq,rxBeamAng(:,rIdx)); % Apply weights per receive element if strcmp(prm.FreqRange, 'FR1') strRxWaveform = rxWaveform.*(wR'); else % for FR2, combine signal from antenna elements strRxWaveform = rxWaveform*conj(wR); end % Correct timing offset = nrTimingEstimate(carrier, ... strRxWaveform(1:ofdmInfo.SampleRate*1e-3,:),refGrid*wR(1)'); if offset > maxChDelay offset = 0; end strRxWaveformS = strRxWaveform(1+offset:end,:); % OFDM Demodulate rxGrid = nrOFDMDemodulate(carrier,strRxWaveformS); % Loop over all SSBs in rxGrid (transmit end) for tIdx = 1:numBeams % Get each SSB grid rxSSBGrid = rxGrid(txBurstInfo.OccupiedSubcarriers, ... txBurstInfo.OccupiedSymbols(tIdx,:),:); % Make measurements, store per receive, transmit beam rsrp(rIdx,tIdx) = measureSSB(rxSSBGrid,prm.RSRPMode,txBurst.NCellID); end end
После того, как свип с двумя концами и измерения будут завершены, определите лучшую ссылку с парой пучков на основе измерения RSRP.
[m,i] = max(rsrp,[],'all','linear'); % First occurence is output % i is column-down first (for receive), then across columns (for transmit) [rxBeamID,txBeamID] = ind2sub([numBeams numBeams],i(1)); % Display the selected beam pair disp(['Selected Beam pair with RSRP: ' num2str(10*log10(rsrp(rxBeamID, ... txBeamID))+30) ' dBm', 13 ' Transmit #' num2str(txBeamID) ... ' (Azimuth: ' num2str(txBeamAng(1,txBeamID)) ', Elevation: ' ... num2str(txBeamAng(2,txBeamID)) ')' 13 ' Receive #' num2str(rxBeamID) ... ' (Azimuth: ' num2str(rxBeamAng(1,rxBeamID)) ', Elevation: ' ... num2str(rxBeamAng(2,rxBeamID)) ')' ]); % Display final beam pair patterns h = figure('Position',figposition([32 55 32 40]),'MenuBar','none'); h.Name = 'Selected Transmit Array Response Pattern'; wT = SteerVecTx(prm.CenterFreq,txBeamAng(:,txBeamID)); pattern(arrayTx,prm.CenterFreq,'PropagationSpeed',c,'Weights',wT); h = figure('Position',figposition([32 55 32 40]),'MenuBar','none'); h.Name = 'Selected Receive Array Response Pattern'; wR = SteerVecRx(prm.CenterFreq,rxBeamAng(:,rxBeamID)); pattern(arrayRx,prm.CenterFreq,'PropagationSpeed',c,'Weights',wR); % Plot MIMO scenario with tx, rx, scatterers, and determined beams prmScene = struct(); prmScene.txArraySize = prm.TxArraySize; prmScene.rxArraySize = prm.RxArraySize; prmScene.txElemPos = getElementPosition(arrayTx); % meters prmScene.rxElemPos = getElementPosition(arrayRx); % meters prmScene.txArrayPos = prm.posTx; prmScene.rxArrayPos = prm.posRx; prmScene.txAzAngles = -90:90; prmScene.rxAzAngles = [90:180 -179:-90]; prmScene.scatPos = prm.ScatPos; prmScene.lambda = lambda; prmScene.arrayScaling = 1; hPlotSpatialMIMOScene(prmScene,wT,wR); if ~prm.ElevationSweep view(2); end
Selected Beam pair with RSRP: 45.1516 dBm Transmit #8 (Azimuth: 60, Elevation: 0) Receive #6 (Azimuth: 90, Elevation: 0)
Эти графики подсвечивают шаблон направленности передачи, шаблон направленности приема и пространственную сцену, соответственно. Результаты зависят от отдельных направлений балки, используемых для сдвигов. Пространственная сцена предлагает комбинированное представление передающих и приёмных массивов и соответствующих определенных лучей вместе с рассеивателями.
В этом примере описывается процедура управления P-1 лучом при помощи блоков сигнала синхронизации для развертки луча конца и конца приема. Путем измерения мощности приемника опорного сигнала для SSB, можно идентифицировать лучшую ссылку пары луча для выбранного пространственного окружения.
Пример позволяет изменять частотную область значений, шаблон блока SSB, количество SSB, размеры передающих и приёмных массивов, области значений развертки передачи и приема и режим измерения. Чтобы увидеть влияние параметров на выбор луча, экспериментируйте с различными значениями. Обработка приема упрощается, чтобы выделить аспекты формирования луча для примера.
Для примера P-2 процедур развертки луча передающего конца с использованием сигналов CSI-RS для нисходящей линии связи, см. NR Усовершенствование луча передающего конца нисходящего канала с использованием CSI-RS (5G Toolbox). Можно использовать эти процедуры для уточнения и регулировки балки в подключенном режиме, как только начальные ссылки пары балки установлены [5], [6].
3GPP TR 38.802. «Исследование по аспектам физического слоя новых технологий радиодоступа». Третья Генерация проект партнерства; Группа технических спецификаций Радиосеть доступ.
Джордани, М., М. Полезе, А. Рой, Д. Кастор и М. Зорзи. «Учебное руководство по управлению лучами для 3GPP NR на частотах mmWave». IEEE Comm. Surveys & Tutorials, том 21, № 1, Q1 2019.
3GPP TS 38.211. "NR; Физические каналы и модуляция ". 3rd Генерация Partnership Project; Группа технических спецификаций Радиосеть доступ.
3GPP TS 38.215. "NR; Физический слой измерений ". 3-ья Генерация Партнерский проект; Группа технических спецификаций Радиосеть доступ.
Джордани, М., М. Полезе, А. Рой, Д. Кастор и М. Зорзи. «Автономное и не автономное управление лучами для 3GPP NR на mmWaves». IEEE Comm. Mag., April 2019, pp. 123-129.
Onggosanusi, E., S. Md. Rahman, et al. «Модульная и высокоразрешающая информация о состоянии канала и управление лучом для 5G NR». IEEE Comm. Mag., март 2018, с. 48-55.
function prm = validateParams(prm) % Validate user specified parameters and return updated parameters % % Only cross-dependent checks are made for parameter consistency. if strcmpi(prm.FreqRange,'FR1') if prm.CenterFreq > 7.125e9 || prm.CenterFreq < 410e6 error(['Specified center frequency is outside the FR1 ', ... 'frequency range (410 MHz - 7.125 GHz).']); end if strcmpi(prm.SSBlockPattern,'Case D') || ... strcmpi(prm.SSBlockPattern,'Case E') error(['Invalid SSBlockPattern for selected FR1 frequency ' ... 'range. SSBlockPattern must be one of ''Case A'' or ' ... '''Case B'' or ''Case C'' for FR1.']); end if ~((length(prm.SSBTransmitted)==4) || ... (length(prm.SSBTransmitted)==8)) error(['SSBTransmitted must be a vector of length 4 or 8', ... 'for FR1 frequency range.']); end if (prm.CenterFreq <= 3e9) && (length(prm.SSBTransmitted)~=4) error(['SSBTransmitted must be a vector of length 4 for ' ... 'center frequency less than or equal to 3GHz.']); end if (prm.CenterFreq > 3e9) && (length(prm.SSBTransmitted)~=8) error(['SSBTransmitted must be a vector of length 8 for ', ... 'center frequency greater than 3GHz and less than ', ... 'or equal to 7.125GHz.']); end else % 'FR2' if prm.CenterFreq > 52.6e9 || prm.CenterFreq < 24.25e9 error(['Specified center frequency is outside the FR2 ', ... 'frequency range (24.25 GHz - 52.6 GHz).']); end if ~(strcmpi(prm.SSBlockPattern,'Case D') || ... strcmpi(prm.SSBlockPattern,'Case E')) error(['Invalid SSBlockPattern for selected FR2 frequency ' ... 'range. SSBlockPattern must be either ''Case D'' or ' ... '''Case E'' for FR2.']); end if length(prm.SSBTransmitted)~=64 error(['SSBTransmitted must be a vector of length 64 for ', ... 'FR2 frequency range.']); end end prm.NumTx = prod(prm.TxArraySize); prm.NumRx = prod(prm.RxArraySize); if prm.NumTx==1 || prm.NumRx==1 error(['Number of transmit or receive antenna elements must be', ... ' greater than 1.']); end prm.IsTxURA = (prm.TxArraySize(1)>1) && (prm.TxArraySize(2)>1); prm.IsRxURA = (prm.RxArraySize(1)>1) && (prm.RxArraySize(2)>1); if ~( strcmpi(prm.RSRPMode,'SSSonly') || ... strcmpi(prm.RSRPMode,'SSSwDMRS') ) error(['Invalid RSRP measuring mode. Specify either ', ... '''SSSonly'' or ''SSSwDMRS'' as the mode.']); end % Select SCS based on SSBlockPattern switch lower(prm.SSBlockPattern) case 'case a' scs = 15; case {'case b', 'case c'} scs = 30; case 'case d' scs = 120; case 'case e' scs = 240; end prm.SCS = scs; end function rsrp = measureSSB(rxSSBGrid,mode,NCellID) % Compute the reference signal received power (RSRP) based on SSS, and if % selected, also PBCH DM-RS. sssInd = nrSSSIndices; % SSS indices numRx = size(rxSSBGrid,3); rsrpSSS = zeros(numRx,1); for rxIdx = 1:numRx % Extract signals per rx element rxSSBGridperRx = rxSSBGrid(:,:,rxIdx); rxSSS = rxSSBGridperRx(sssInd); % Average power contributions over all REs for RS rsrpSSS(rxIdx) = mean(rxSSS.*conj(rxSSS)); end if strcmpi(mode,'SSSwDMRS') pbchDMRSInd = nrPBCHDMRSIndices(NCellID); % PBCH DM-RS indices rsrpDMRS = zeros(numRx,1); for rxIdx = 1:numRx % Extract signals per rx element rxSSBGridperRx = rxSSBGrid(:,:,rxIdx); rxPBCHDMRS = rxSSBGridperRx(pbchDMRSInd); % Average power contributions over all REs for RS rsrpDMRS(rxIdx) = mean(rxPBCHDMRS.*conj(rxPBCHDMRS)); end end switch lower(mode) case 'sssonly' % Only SSS rsrp = max(rsrpSSS); % max over receive elements case 'ssswdmrs' % Both SSS and PBCH-DMRS, accounting for REs per RS rsrp = max((rsrpSSS*127+rsrpDMRS*144)/271); % max over receive elements end end