Трассировка балки NR SSB

Этот пример показывает, как использовать развертку луча как на концах передатчика (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 Нисходящая линия передачи - Уточнение пучка с использованием CSI-RS.

Этот пример генерирует пакет сигнала 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;

Для получения дополнительной информации о блоках и пакетах сигналов синхронизации см. учебное пособие «Блоки и пакеты сигналов синхронизации».

Строение канала

Сконфигурируйте пространственный рассеивающий канал 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.

Для измерения 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. Можно использовать эти процедуры для уточнения и регулировки балки в подключенном режиме, как только начальные ссылки пары балки установлены [5], [6].

Ссылки

  1. 3GPP TR 38.802. «Исследование по аспектам физического слоя новых технологий радиодоступа». Третья Генерация проект партнерства; Группа технических спецификаций Радиосеть доступ.

  2. Джордани, М., М. Полезе, А. Рой, Д. Кастор и М. Зорзи. «Учебное руководство по управлению лучами для 3GPP NR на частотах mmWave». IEEE Comm. Surveys & Tutorials, том 21, № 1, Q1 2019.

  3. 3GPP TS 38.211. "NR; Физические каналы и модуляция ". 3rd Генерация Partnership Project; Группа технических спецификаций Радиосеть доступ.

  4. 3GPP TS 38.215. "NR; Физический слой измерений ". 3-ья Генерация Партнерский проект; Группа технических спецификаций Радиосеть доступ.

  5. Джордани, М., М. Полезе, А. Рой, Д. Кастор и М. Зорзи. «Автономное и не автономное управление лучами для 3GPP NR на mmWaves». IEEE Comm. Mag., April 2019, pp. 123-129.

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

См. также

Объекты

Похожие темы