Main Content

NR SSB のビーム スイーピング

この例では、5G NR システムの送信機側 (gNB) と受信機側 (UE) の両方でビーム スイーピングを使用する方法を示します。この例では、同期信号ブロック (SSB) を使用し、初期アクセス時に使用されるいくつかのビーム管理手続きを示します。ビーム スイーピングを実現するため、この例では Phased Array System Toolbox™ のいくつかのコンポーネントを使用します。

はじめに

ミリメートル波 (mmWave) の周波数をサポートするには、指向性リンクが必要となります。そのため、NR の初期アクセスのためのビーム管理手続きの仕様が定められています。ビームの管理は、ビーム ペア リンクのセット (gNB で使用されるビームと UE で使用されるビームのペア) を取得して維持するためのレイヤー 1 (物理) の手続きとレイヤー 2 (メディア アクセス制御) の手続きのセットになります。ビーム管理手続きは、ダウンリンクとアップリンクの送信と受信に適用されます [ 1 ]、[ 2 ]。この手続きはには次が含まれます。

  • ビーム スイーピング

  • ビームの測定

  • ビームの決定

  • ビームの報告

  • ビームの復元

この例では、ユーザー端末 (UE) とアクセス ネットワーク ノード (gNB) との間で接続を確立したときの、アイドル ユーザーに対する初期アクセス手続きを取り上げます。この例では、ダウンリンク方向 (gNB から UE) にバーストとして送信される同期信号ブロック (SSB) を使用し、物理レイヤーで送受信ポイント (TRP) のビーム スイーピングと UE のビーム スイーピングの両方を行ってビーム ペア リンクを確立する方法について説明します。TR 38.802 では、いくつかあるビーム管理手続きのうち、この両端でのスイープが手続き P-1 [ 1 ] として定義されています。

接続されると、その後の送信で同じビーム ペア リンクを使用できます。必要に応じ、CSI-RS (ダウンリンクの場合) および SRS (アップリンクの場合) を使用してビームをさらに調整できます。ビームに障害が発生した場合、このペア リンクが再度確立されます。ビーム ペアの調整の例については、CSI-RS を使用した NR ダウンリンク送信側のビーム調整を参照してください。

この例では、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 = [-90 90];             % Transmit azimuthal sweep limits
prm.TxELlim = [-90 0];              % Transmit elevation sweep limits

prm.RxArraySize = [2 2];            % Receive array size, [rows cols]
prm.RxAZlim = [-90 90];             % Receive azimuthal sweep limits
prm.RxELlim = [-45 45];             % Receive elevation sweep limits

prm.ElevationSweep = false;         % Enable/disable elevation sweep
prm.SNRdB = 30;                     % SNR, dB
prm.RSRPMode = 'SSSwDMRS';          % {'SSSwDMRS', 'SSSonly'}

この例では、次のパラメーターを使用します。

  • 単一の BS と UE から成る単一セルのシナリオのセル ID

  • 周波数範囲。FR1 と FR2 のどちらで運用するかを文字列として指定します。

  • 中心周波数 (Hz)。周波数範囲によって異なります。

  • 同期信号ブロックのパターン。FR1 の場合は Case A/B/C のいずれか。FR2 の場合は Case D/E のいずれか。これによりサブキャリア間隔も選択されます。

  • パターンで送信される SSB。FR1 の場合は長さ 4 または 8、FR2 の場合は長さ 64 のバイナリ ベクトルとして指定します。送信される SSB の数により、送信側と受信側のビームの数が設定されます。

  • 送信アレイのサイズ。送信アレイの行と列に含まれるアンテナ素子の数をそれぞれ指定する 2 要素行ベクトルとして指定します。どちらの値も 1 より大きい場合は等間隔矩形アレイ (URA) を使用します。

  • 送信側の方位角方向のスイープ範囲 (度)。スイープの始点と終点の方位角を指定します。

  • 送信側の仰角方向のスイープ範囲 (度)。スイープの始点と終点の仰角を指定します。

  • 受信アレイのサイズ。受信アレイの行と列に含まれるアンテナ素子の数をそれぞれ指定する 2 要素行ベクトルとして指定します。どちらの値も 1 より大きい場合は等間隔矩形アレイ (URA) を使用します。

  • 受信側の方位角方向のスイープ範囲 (度)。スイープの始点と終点の方位角を指定します。

  • 受信側の仰角方向のスイープ範囲 (度)。スイープの始点と終点の仰角を指定します。

  • 送信と受信の両側の仰角方向のスイープの有効化または無効化。FR2 および/または URA では仰角方向のスイープを有効にします。

  • S/N 比 (dB)

  • SSB の測定モード。セカンダリ同期信号のみを使用する ('SSSonly') か、セカンダリ同期信号と PBCH DM-RS を使用する ('SSSwDMRS') かを指定します。

prm = validateParams(prm);

同期信号バーストの構成

指定されたシステム パラメーターを使用し、同期信号バースト パラメーターを設定します。初期アクセスの場合、SSB の周期を 20 ms に設定します。

txBurst = nrWavegenSSBurstConfig;
txBurst.BlockPattern = prm.SSBlockPattern;
txBurst.TransmittedBlocks = prm.SSBTransmitted;
txBurst.Period = 20;
txBurst.SubcarrierSpacingCommon = prm.SubcarrierSpacingCommon;

% Configure an nrDLCarrierConfig object to use the synchronization signal
% burst parameters and to disable other channels. This object will be used
% by nrWaveformGenerator to generate the SS burst waveform.

cfgDL = configureWaveformGenerator(prm,txBurst);

同期信号ブロックと同期信号バーストの詳細については、チュートリアル同期信号ブロックと同期信号バーストを参照してください。

バーストの生成

関数 nrWaveformGenerator を呼び出し、SS バースト波形 [ 3 ] を作成します。生成された波形は、まだビームフォーミングされていません。

burstWaveform = nrWaveformGenerator(cfgDL);

% Display spectrogram of SS burst waveform
figure;
ofdmInfo = nrOFDMInfo(cfgDL.SCSCarriers{1}.NSizeGrid,prm.SCS);
nfft = ofdmInfo.Nfft;
spectrogram(burstWaveform,ones(nfft,1),0,nfft,'centered',ofdmInfo.SampleRate,'yaxis','MinThreshold',-130);
title('Spectrogram of SS burst waveform')

チャネル構成

空間散乱 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;-20;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; 50; 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 = ofdmInfo.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(ofdmInfo.SampleRate*1e-3,prm.NumTx), ...
    randn(ofdmInfo.SampleRate*1e-3,prm.NumTx)));
maxChDelay = ceil(max(tau)*ofdmInfo.SampleRate);

送信側のビーム スイーピング

TRP のビーム スイーピングを実現するには、生成したバースト内の各 SS ブロックをアナログ ビームフォーミングでビームフォーミングします。バースト内の SS ブロックの数、および指定したスイープ範囲に基づき、各ビームの方位角方向と仰角方向を決定します。その後、それらの各方向に向け、バースト内の各ブロックをビームフォーミングします。

% Number of beams at both transmit and receive ends
numBeams = sum(txBurst.TransmittedBlocks);

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

% Get the set of OFDM symbols occupied by each SSB
numBlocks = length(txBurst.TransmittedBlocks);
burstStartSymbols = ssBurstStartSymbols(txBurst.BlockPattern,numBlocks);
burstStartSymbols = burstStartSymbols(txBurst.TransmittedBlocks==1);
burstOccupiedSymbols = burstStartSymbols.' + (1:4);

% Apply steering per OFDM symbol for each SSB
gridSymLengths = repmat(ofdmInfo.SymbolLengths,1,cfgDL.NumSubframes);
%   repeat burst over numTx to prepare for steering
strTxWaveform = repmat(burstWaveform,1,prm.NumTx)./sqrt(prm.NumTx);
for ssb = 1:numBeams

    % Extract SSB waveform from burst
    blockSymbols = burstOccupiedSymbols(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 の場合、gNB から N 個のビームがそれぞれ M 回ずつ送信され、各送信ビームが M 個の受信ビームによって受信されます。

この例では、NM の両方がバースト内の SSB の数に等しいと仮定しています。簡略化のため、この例ではバーストを 1 つだけ生成しますが、無線によってバーストを M 回受信する状態を再現するため、受信機はこの 1 つのバーストを M 回処理します。

次の図では、N = M = 4 のときの gNB と UE の両方における方位角面内のスイープをビームごとに示しています。この図では、デュアル スイープにかかる時間を示しています。ここで、gNB の各区間は SSB に対応し、UE の各区間は SS バーストに対応します。ここに示されているシナリオでは、理論上選択されるビームペア リンクとしてビーム S3U2 が強調表示されています。この例では、N*M 個の時点から成る期間だけ実行されるデュアル スイープを実装します。

送信されたバーストの受信処理は次のとおりです。

  • 空間フェージング チャネルの適用

  • 発生したパス損失と AWGN を補正するための受信ゲイン

  • 受信側のビームフォーミング

  • タイミング補正

  • OFDM 復調

  • 既知の SSB グリッドの抽出

  • 指定された測定モードに基づく RSRP の測定

この処理では、各受信ビームについてこれらの手順を繰り返した後、実行したすべての測定結果に基づいて最適なビームペアを選択します。

ビーム スイーピングに着目するため、この例では受信機で SSB の情報が既知であると仮定しています。復元処理の詳細については、NR セル サーチおよび MIB と SIB1 の復元を参照してください。

アイドル モードの SS-RSRP の測定では、セカンダリ同期信号 (SSS) のみを使用するか、SSS に加えて物理ブロードキャスト チャネル (PBCH) 復調基準信号 (DM-RS) を使用します ([ 4 ] の Section 5.1.1)。これは、この例の RSRPMode パラメーターで指定します。

% 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/10);                          % Convert to linear gain
N0 = 1/sqrt(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
carrier = nrCarrierConfig('NCellID',prm.NCellID);
carrier.NSizeGrid = cfgDL.SCSCarriers{1}.NSizeGrid;
carrier.SubcarrierSpacing = prm.SCS;
pssRef = nrPSS(carrier.NCellID);
pssInd = nrPSSIndices;
ibar_SSB = 0;
pbchdmrsRef = nrPBCHDMRS(carrier.NCellID,ibar_SSB);
pbchDMRSInd = nrPBCHDMRSIndices(carrier.NCellID);
pssGrid = zeros([240 4]);
pssGrid(pssInd) = pssRef;
pssGrid(pbchDMRSInd) = pbchdmrsRef;
refGrid = zeros([12*carrier.NSizeGrid ofdmInfo.SymbolsPerSlot]);
burstOccupiedSubcarriers = carrier.NSizeGrid*6 + (-119:120).';
refGrid(burstOccupiedSubcarriers, ...
    burstOccupiedSymbols(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*randn(size(fadWaveG),"like",1i);
    rxWaveform = fadWaveG + noise;

    % Generate weights for steered direction
    wR = SteerVecRx(prm.CenterFreq,rxBeamAng(:,rIdx));

    % Apply weights per receive element
    strRxWaveform = rxWaveform*conj(wR);

    % 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(burstOccupiedSubcarriers, ...
            burstOccupiedSymbols(tIdx,:),:);

        if strcmpi(prm.RSRPMode,'SSSwDMRS')
            meas = nrSSBMeasurements(rxSSBGrid,carrier.NCellID,mod(tIdx-1,8));
        else
            meas = nrSSBMeasurements(rxSSBGrid,carrier.NCellID);
        end
        rsrp(rIdx,tIdx) = max(meas.RSRPPerAntenna);
    end
end

ビームの決定

両端でのスイープと測定が完了したら、RSRP の測定値に基づいて最適なビームペア リンクを決定します。

[m,i] = max(rsrp,[],'all','linear');    % First occurrence 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(rsrp(rxBeamID, ...
    txBeamID)) ' 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. Beam
% patterns in this figure resemble the power patterns in linear scale.
prmScene = struct();
prmScene.TxArray = arrayTx;
prmScene.RxArray = arrayRx;
prmScene.TxArrayPos = prm.posTx;
prmScene.RxArrayPos = prm.posRx;
prmScene.ScatterersPos = prm.ScatPos;
prmScene.Lambda = lambda;
prmScene.ArrayScaling = 1;     % To enlarge antenna arrays in the plot
prmScene.MaxTxBeamLength = 45; % Maximum length of transmit beams in the plot
prmScene.MaxRxBeamLength = 25; % Maximum length of receive beam in the plot
hPlotSpatialMIMOScene(prmScene,wT,wR);
if ~prm.ElevationSweep
    view(2);
end
Selected Beam pair with RSRP: 56.2133 dBm
  Transmit #6 (Azimuth: 45, Elevation: 0)
  Receive #2 (Azimuth: -45, Elevation: 0)

これらのプロットでは、送信側の指向性パターン、受信側の指向性パターン、およびそれぞれの空間シーンが示されています。この結果は、スイープで使用された各ビーム方向によって変わります。空間シーンでは、送信アレイと受信アレイ、それぞれについて決定されたビーム、および散乱体が示されています。

まとめとその他の調査

この例では、送信側と受信側のビーム スイーピングに同期信号ブロックを使用し、P-1 ビーム管理手続きについて説明しています。SSB の基準信号の受信電力を測定することで、選択した空間環境における最適なビーム ペア リンクを特定できます。

この例では、周波数範囲、SSB のブロック パターン、SSB の数、送信アレイと受信アレイのサイズ、送信側と受信側のスイープ範囲、および測定モードを変更できます。さまざまな値を試すことで、パラメーターがビームの選択に与える影響を確認できます。この例では、ビームフォーミングの側面に着目するため、受信処理を簡略化しています。

ダウンリンクの CSI-RS 信号を使用する送信側のビーム スイーピングに関する P-2 手続きの詳細については、CSI-RS を使用した NR ダウンリンク送信側のビーム調整を参照してください。これらの手続きを使用することで、最初のビーム ペア リンクが確立された後に接続済みモードでビームの絞り込みと調整を行うことができます [ 5 ]、[ 6 ]。

参考文献

  1. 3GPP TR 38.802. "Study on New Radio access technology physical layer aspects." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  2. Giordani, M., M. Polese, A. Roy, D. Castor, and M. Zorzi. "A tutorial on beam management for 3GPP NR at mmWave frequencies." IEEE Comm. Surveys & Tutorials, vol. 21, No. 1, Q1 2019.

  3. 3GPP TS 38.211. "NR; Physical channels and modulation." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  4. 3GPP TS 38.215. "NR; Physical layer measurements." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  5. Giordani, M., M. Polese, A. Roy, D. Castor, and M. Zorzi. "Standalone and non-standalone beam management for 3GPP NR at mmWaves." IEEE Comm. Mag., April 2019, pp. 123-129.

  6. Onggosanusi, E., S. Md. Rahman, et al. "Modular and high-resolution channel state information and beam management for 5G NR." IEEE Comm. Mag., March 2018, pp. 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;
            cbw = 10;
            scsCommon = 15;
        case {'case b', 'case c'}
            scs = 30;
            cbw = 25;
            scsCommon = 30;
        case 'case d'
            scs = 120;
            cbw = 100;
            scsCommon = 120;
        case 'case e'
            scs = 240;
            cbw = 200;
            scsCommon = 120;
    end
    prm.SCS = scs;
    prm.ChannelBandwidth = cbw;
    prm.SubcarrierSpacingCommon = scsCommon;

end

function ssbStartSymbols = ssBurstStartSymbols(ssbBlockPattern,Lmax)
% Starting OFDM symbols of SS burst.

    % 'alln' gives the overall set of SS block indices 'n' described in
    % TS 38.213 Section 4.1, from which a subset is used for each Case A-E
    alln = [0; 1; 2; 3; 5; 6; 7; 8; 10; 11; 12; 13; 15; 16; 17; 18];

    cases = {'Case A' 'Case B' 'Case C' 'Case D' 'Case E'};
    m = [14 28 14 28 56];
    i = {[2 8] [4 8 16 20] [2 8] [4 8 16 20] [8 12 16 20 32 36 40 44]};
    nn = [2 1 2 16 8];

    caseIdx = find(strcmpi(ssbBlockPattern,cases));
    if (any(caseIdx==[1 2 3]))
        if (Lmax==4)
            nn = nn(caseIdx);
        elseif (Lmax==8)
            nn = nn(caseIdx) * 2;
        end
    else
        nn = nn(caseIdx);
    end

    n = alln(1:nn);
    ssbStartSymbols = (i{caseIdx} + m(caseIdx)*n).';
    ssbStartSymbols = ssbStartSymbols(:).';

end

function cfgDL = configureWaveformGenerator(prm,txBurst)
% Configure an nrDLCarrierConfig object to be used by nrWaveformGenerator
% to generate the SS burst waveform.

    cfgDL = nrDLCarrierConfig;
    cfgDL.SCSCarriers{1}.SubcarrierSpacing = prm.SCS;
    if (prm.SCS==240)
        cfgDL.SCSCarriers = [cfgDL.SCSCarriers cfgDL.SCSCarriers];
        cfgDL.SCSCarriers{2}.SubcarrierSpacing = prm.SubcarrierSpacingCommon;
        cfgDL.BandwidthParts{1}.SubcarrierSpacing = prm.SubcarrierSpacingCommon;
    else
        cfgDL.BandwidthParts{1}.SubcarrierSpacing = prm.SCS;
    end
    cfgDL.PDSCH{1}.Enable = false;
    cfgDL.PDCCH{1}.Enable = false;
    cfgDL.ChannelBandwidth = prm.ChannelBandwidth;
    cfgDL.FrequencyRange = prm.FreqRange;
    cfgDL.NCellID = prm.NCellID;
    cfgDL.NumSubframes = 5;
    cfgDL.WindowingPercent = 0;
    cfgDL.SSBurst = txBurst;

end

参考

オブジェクト

関連するトピック