メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

この例では、5G NR システムの送信機側 (gNB) と受信機側 (UE) の両方でビーム スイーピングを使用する方法を示します。この例では、同期信号ブロック (SSB) を使用し、TR 38.901 および TR 38.843 で定義されている都市マクロセルのシナリオでの初期アクセス時に使用されるいくつかのビーム管理手続きを示します。ビーム スイーピングを実現するため、この例では Phased Array System Toolbox™ の機能を使用します。

はじめに

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

  • ビーム スイーピング

  • ビームの測定

  • ビームの決定

  • ビームの報告

  • ビームの復元

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

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

この例では、NR 同期信号バーストを生成し、バースト内で各 SSB をビームフォーミングして方位角の方向でスイープを行い、ビームフォーミングされた信号を MIMO フェージング チャネルで送信し、複数の受信側ビームで受信した信号を処理します。この例では、(デュアル ループ内の) 各送受信ビーム ペアの基準信号受信電力 (RSRP) を測定し、RSRP が最大であるビーム ペア リンクを決定します。したがって、このビーム ペア リンクは、シミュレートされた空間シナリオにおける送信側と受信側の最適なビームペアを表します。次の図では、主な処理手順を示しており、ビーム管理手順が色分けして示しています。

この例では、TR 38.843 Table 6.3.1-1 に示された AI/ML に対するベースライン システムレベルのシミュレーションの前提条件を使用しています。主な特徴は次のとおりです。

1. Use TR 38.901 system-level channel model.
2. UEs are randomly distributed inside the first sector of a
three-sector cell.
3. The number of transmit and receive beams depends on the beamwidth.
While minimizing the number of beams, the example selects enough beams
to cover the full area. By default, the example considers ten transmit
beams and seven receive beams, according to the antenna specifications
defined in TR 38.843 Table 6.3.1-1.

シミュレーション パラメーター

この例のシステム パラメーターを定義します。これらのパラメーターを変更し、システムへの影響を調べます。

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

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

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

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

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

  • 送信側および受信側のアンテナ アレイ (phased.NRRectangularPanelArray オブジェクト)

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

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

  • 送信と受信の両側の仰角方向のスイープの有効化または無効化。

  • セルのサイズを定義するサイト間距離

  • 送信電力および受信側のノイズ指数

  • SSB の RSRP 測定モード

prm.NCellID = 1;                    % Cell ID
prm.FrequencyRange = 'FR2';         % Frequency range: 'FR1' or 'FR2'
prm.Scenario = 'UMa';               % Scenario: 'UMa', 'UMi', or 'RMa'
prm.CenterFrequency = 30e9;         % Hz
prm.SSBlockPattern = 'Case D';      % Case A/B/C/D/E

% Number of transmitted blocks. Set it to empty to let the example use
% the minimum number that ensures a full coverage of the 120-degree
% sector without overlapping of beams or gaps in the coverage
prm.NumSSBlocks = [];

prm.InterSiteDistance = 200;        % meters
prm.PowerBSs = 40;                  % dBm
prm.UENoiseFigure = 10;             % UE receiver noise figure in dB

% Enable or disable elevation sweep.
prm.ElevationSweep = false;

% RSRP measurement mode for SSB: 'SSSonly' uses SSS alone and 'SSSwDMRS'
% uses SSS and PBCH DM-RS.
prm.RSRPMode = 'SSSwDMRS';

この例では、見通し外 (NLOS) 成分をもつ MIMO フェージング チャネルを使用しているため、ビームの目視検査が困難になる可能性があります。MIMO チャネルのプロットで選択した送信ビームと受信ビームが互いに向き合っているかどうかを確認するには、チャネルを強制的に見通し内 (LOS) チャネルにします。

setLOSPathOnly = false;

アンテナ アレイの構成

TR 38.843 の Table 6.3.1-1 の定義に従い、4×8 の交差偏波素子をもつ方形アレイとして送信アンテナ アレイを定義します。この例では、TR 38.901 Table 7.8-1 で定義されているように、最初のセクターが 30 度を中心として配置された 3 セクター セルの最初のセクターをカバーする基地局を検討しています。アンテナ アレイがセクターの中心を向いていることを考慮して、120 度のセクター全体をカバーするようにアンテナ スイープの方位角の範囲を設定します。

c = physconst('LightSpeed');    % Propagation speed
lambda = c/prm.CenterFrequency; % Wavelength

% Transmit array
prm.TransmitAntennaArray = phased.NRRectangularPanelArray(...
    Size=[4,8,1,1],...
    Spacing=[0.5,0.5,1,1]*lambda);

% Transmit azimuthal and elevation sweep limits in degrees
prm.TxAZlim = [-60 60];
prm.TxELlim = [-90 0];

% Define the transmit antenna downtilt angle in degrees. The default is the
% value defined in TR 38.843 Table 6.3.1-2.
prm.TxDowntilt = 110;

TR 38.843 の Table 6.3.1-1 の定義に従い、1×4 の無指向性の交差偏波素子をもつ方形アレイとして受信アンテナ アレイを定義します。アンテナ素子が無指向性であることを考慮して、360 度空間全体の半分をカバーするようにアンテナ スイープの方位角の範囲を設定します。

% Receive array
prm.ReceiveAntennaArray = phased.NRRectangularPanelArray(...
    Size=[1,4,1,1],...
    Spacing=[0.5,0.5,1,1]*lambda,...
    ElementSet={phased.ShortDipoleAntennaElement,phased.ShortDipoleAntennaElement});
% Ensure that the two elements are cross polarized
prm.ReceiveAntennaArray.ElementSet{1}.AxisDirection = "Custom";
prm.ReceiveAntennaArray.ElementSet{1}.CustomAxisDirection = [0;  1; 1];
prm.ReceiveAntennaArray.ElementSet{2}.AxisDirection = "Custom";
prm.ReceiveAntennaArray.ElementSet{2}.CustomAxisDirection = [0; -1; 1];

% Receive azimuthal and elevation sweep limits in degrees
prm.RxAZlim = [-90 90];
prm.RxELlim = [0 90];

prm = validateParams(prm);

同期信号バーストの構成

指定されたシステム パラメーターを使用し、同期信号バースト パラメーターを設定します。初期アクセスの場合、SSB の周期を 20 ms に設定します。この例では、SSB が常にフレームの前半にあると仮定しています。

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 バースト波形を作成します。生成された波形は、まだビームフォーミングされていません。

burstWaveform = nrWaveformGenerator(cfgDL);

% Get carrier object
ncellid = prm.NCellID;
carrier = nrCarrierConfig('NCellID',ncellid);
carrier.NSizeGrid = cfgDL.SCSCarriers{1}.NSizeGrid;
carrier.SubcarrierSpacing = cfgDL.SCSCarriers{1}.SubcarrierSpacing;

% Display spectrogram of SS burst waveform
figure;
ofdmInfo = nrOFDMInfo(carrier);
nfft = ofdmInfo.Nfft;
sampleRate = ofdmInfo.SampleRate;
spectrogram(burstWaveform,ones(nfft,1),0,nfft,'centered',sampleRate,'yaxis','MinThreshold',-130);
title('Spectrogram of SS Burst Waveform')

チャネル構成

TR 38.901 の定義に従い、MIMO フェージング チャネル channel を構成します。h38901Scenario 関数と h38901Channel 関数を使用して、3 セクター ノードの最初のセクターにランダムにドロップされた UE と基地局との間のチャネルを作成します。

% Specify the seed used to generate the channel and drop the UEs within the
% sector boundaries.
seed = 49;

% Use |h38901Scenario| to create an urban macrocell (UMa) scenario with a
% single cell and three sectors. The scenario considers spatial
% consistency, as defined in TR 38.901 Section 7.6.3-1.
s38901 = h38901Scenario(Scenario=prm.Scenario,...
    CarrierFrequency=prm.CenterFrequency,...
    InterSiteDistance=prm.InterSiteDistance,...
    NumCellSites=1,...
    NumSectors=3,...
    NumUEs=1,...
    ChosenUEs=true,...
    SpatialConsistency=true,...
    Wrapping=false,...
    Seed=seed);

% Create the channels for each sector, specifying the transmit and receive
% antenna arrays.
[channelsAll,chinfoAll] = createChannelLinks(s38901,...
    SampleRate=sampleRate,...
    DropMode="PathLoss",...
    TransmitAntennaArray=prm.TransmitAntennaArray,...
    ReceiveAntennaArray=prm.ReceiveAntennaArray,...
    FastFading=true);

% Get the channel and the channel information structure for the first
% sector.
channel = channelsAll(1,1,1);
chInfo = chinfoAll.AttachedUEInfo(1,1,1);

% Ensure that channel filtering is on to be able to pass the waveform
% through the channel
channel.SmallScale.ChannelFiltering = true;

if setLOSPathOnly
    channel = forceLOSChannel(prm,channel);
end

% Extract the position of the base station and the UE, together with the
% information on whether the UE is in line of sight (LOS) or not.
prm.posTx = chInfo.Config.BSPosition; % Transmit array position, [x,y,z], meters
prm.posRx = chInfo.Position;          % Receive array position, [x,y,z], meters
prm.LOS = channel.SmallScale.HasLOSCluster;

% Add transmit and receive array orientation info to the parameter structure
prm.TransmitArrayOrientation = channel.SmallScale.TransmitArrayOrientation';
prm.ReceiveArrayOrientation = channel.SmallScale.ReceiveArrayOrientation';

% Get the maximum channel delay
chInfo = info(channel.SmallScale);
maxChDelay = chInfo.MaximumChannelDelay;

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

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

% Transmit beam angles in azimuth and elevation, equi-spaced
numTxBeams = prm.NumTxBeams;
arrayTx = prm.TransmitAntennaArray;
azBW = beamwidth(arrayTx,prm.CenterFrequency,'Cut','Azimuth');
elBW = beamwidth(arrayTx,prm.CenterFrequency,'Cut','Elevation');
txBeamAng = hGetBeamSweepAngles(numTxBeams,prm.TxAZlim,prm.TxELlim, ...
    azBW,elBW,prm.ElevationSweep);
% Account for the antenna downtilt
elOffset = 90 - prm.TxDowntilt;
txBeamAng(2,:) = txBeamAng(2,:) + elOffset;

% For evaluating transmit-side steering weights
SteerVecTx = phased.SteeringVector('SensorArray',arrayTx, ...
    'PropagationSpeed',c);

% Get the set of OFDM symbols and subcarriers occupied by each SSB
numBlocks = length(txBurst.TransmittedBlocks);
burstStartSymbols = hSSBurstStartSymbols(txBurst.BlockPattern,numBlocks);
burstStartSymbols = burstStartSymbols(txBurst.TransmittedBlocks==1);
burstOccupiedSymbols = burstStartSymbols.' + (1:4);
burstOccupiedSubcarriers = carrier.NSizeGrid*6 + (-119:120).';

% 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 txBeamIdx = 1:numTxBeams

    % Extract SSB waveform from burst
    blockSymbols = burstOccupiedSymbols(txBeamIdx,:);
    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.CenterFrequency,txBeamAng(:,txBeamIdx));

    % Beamforming: Apply weights per transmit element to SSB
    strTxWaveform(startSSBInd:endSSBInd,:) = ssbWaveform*(wT');

end

% Adjust the beamformed waveform according to the base station power
pref = sum(rms(strTxWaveform).^2);
txWaveform = strTxWaveform*1/sqrt(pref)*sqrt(10^((prm.PowerBSs-30)/10));

ビームフォーミングしたバースト波形をチャネル経由で送信します。

% Pad the waveform to ensure the channel filter is fully flushed
nT = size(txWaveform,2);
dlWaveform = [txWaveform; zeros(maxChDelay,nT)];

% Pass the waveform through the channel
rxWaveform = channel.SmallScale(dlWaveform);
rxWaveform = rxWaveform*db2mag(channel.LargeScale); % Account for the path loss

% Apply AWGN
rng(seed); % Set RNG state for repeatability
rxWaveform = hAWGN(rxWaveform,prm.UENoiseFigure,sampleRate);

受信側のビーム スイーピングと測定

受信側のビーム スイーピングでは、ビームフォーミング後のバースト送信波形が各受信ビームによって連続で受信されます。N 個の送信ビームと M 個の受信ビームを使用する手続き P-1 の場合、gNB から N 個のビームがそれぞれ M 回ずつ送信され、各送信ビームが M 個の受信ビームによって受信されます。簡略化のため、この例ではバーストを 1 つだけ生成しますが、無線によってバーストを M 回受信する状態を再現するため、受信機はこの 1 つのバーストを M 回処理します。

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

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

  • 受信側のビーム結合

  • タイミング補正

  • OFDM 復調

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

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

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

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

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

% Receive beam angles in azimuth and elevation, equi-spaced
numRxBeams = prm.NumRxBeams;
arrayRx = prm.ReceiveAntennaArray;
azBW = beamwidth(arrayRx,prm.CenterFrequency,'Cut','Azimuth');
elBW = beamwidth(arrayRx,prm.CenterFrequency,'Cut','Elevation');
rxBeamAng = hGetBeamSweepAngles(numRxBeams,prm.RxAZlim,prm.RxELlim, ...
    azBW,elBW,prm.ElevationSweep);

% For evaluating receive-side steering weights
SteerVecRx = phased.SteeringVector('SensorArray',arrayRx, ...
    'PropagationSpeed',c);

% Loop over all receive beams
rsrp = -inf(numRxBeams,numTxBeams);
for rIdx = 1:numRxBeams

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

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

    % Correct timing
    offset = hSSBurstTimingOffset(strRxWaveform,carrier,ofdmInfo,burstOccupiedSymbols);
    if offset > maxChDelay
        % If the receiver cannot compute a valid timing offset, the receive
        % power of the waveform is too low. Continue to the next receive
        % beam.
        continue
    end
    strRxWaveformS = strRxWaveform(1+offset:end,:);

    % OFDM Demodulate
    rxGrid = nrOFDMDemodulate(carrier,strRxWaveformS);

    % Loop over all SSBs in rxGrid (transmit end)
    for tIdx = 1:numTxBeams
        % Get each SSB grid
        rxSSBGrid = rxGrid(burstOccupiedSubcarriers, ...
            burstOccupiedSymbols(tIdx,:),:);

        % Compute the synchronization signal RSRP
        rsrp(rIdx,tIdx) = hSSBurstRSRP(rxSSBGrid,ncellid,txBurst.TransmittedBlocks,tIdx,prm.RSRPMode);
    end
end

ビームの決定

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

[~,optBeamPairIdx] = max(rsrp,[],'all','linear'); % First occurrence is output
% optBeamPairIdx is column-down first (for receive), then across columns (for transmit)
[rxBeamID,txBeamID] = ind2sub([numRxBeams numTxBeams],optBeamPairIdx);

% Display the selected beam pair
disp("Selected beam pair with RSRP: " + rsrp(optBeamPairIdx) + " dBm");
disp("  Transmit #"  + compose('%-3d',txBeamID) + ...
     " (Azimuth: "   + compose('%7.2f',txBeamAng(1,txBeamID)) + ...
     ", Elevation: " + compose('%7.2f',txBeamAng(2,txBeamID)) + ")");
disp("  Receive  #"  + compose('%-3d',rxBeamID) + ...
     " (Azimuth: "   + compose('%7.2f',rxBeamAng(1,rxBeamID)) + ...
     ", Elevation: " + compose('%7.2f',rxBeamAng(2,rxBeamID)) + ")");

% Display final beam pair patterns
figure(Name="Selected Transmit Array Response Pattern");
wT = SteerVecTx(prm.CenterFrequency,txBeamAng(:,txBeamID));
pattern(arrayTx,prm.CenterFrequency,PropagationSpeed=c,Weights=wT);

figure(Name="Selected Receive Array Response Pattern");
wR = SteerVecRx(prm.CenterFrequency,rxBeamAng(:,rxBeamID));
pattern(arrayRx,prm.CenterFrequency,PropagationSpeed=c,Weights=wR);
Selected beam pair with RSRP: 22.3728 dBm
  Transmit #4   (Azimuth:  -12.00, Elevation:  -20.00)
  Receive  #3   (Azimuth:  -12.86, Elevation:    0.00)

送信ビーム、受信ビーム、および決定されたビームを使用して、TR 38.901 のシナリオをプロットします。チャネル内に強力な NLOS クラスターがある場合、RSRP 値を最大化するビーム ペアは互いにわずかにずれた方向を指すことがあります。基地局と UE との間の高さの違いも見通しに影響を与える可能性があります。この例では、既定で最適なビームのみが表示されます。すべてのビームをプロットに表示するには、plotAllBeams を true に設定します。

dataInfo = struct();
dataInfo.PosBS = prm.posTx;
dataInfo.PosUE = prm.posRx;
dataInfo.TransmitArrayOrientation = channel.SmallScale.TransmitArrayOrientation';
dataInfo.ReceiveArrayOrientation = channel.SmallScale.ReceiveArrayOrientation';
plotAllBeams = false;
hPlotSpatial38901Scene(prm,dataInfo,optBeamPairIdx,plotAllBeams);
if ~prm.ElevationSweep
    view(2);
end

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

まとめとその他の調査

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

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

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

参考文献

  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. 3GPP TR 38.843, "Study on Artificial Intelligence (AI)/Machine Learning (ML) for NR air interface." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  3. 3GPP TR 38.901, "Study on channel model for frequencies from 0.5 to 100 GHz." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

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

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

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

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

  8. 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.FrequencyRange,'FR1')
        if prm.CenterFrequency > 7.125e9 || prm.CenterFrequency < 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
    else % 'FR2'
        if prm.CenterFrequency > 52.6e9 || prm.CenterFrequency < 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
    end

    % Verify that there are multiple TX and Rx antennas
    prm.NumTx = getNumElements(prm.TransmitAntennaArray);
    prm.NumRx = getNumElements(prm.ReceiveAntennaArray);
    if prm.NumTx==1 || prm.NumRx==1
        error(['Number of transmit or receive antenna elements must be', ...
               ' greater than 1.']);
    end

    if ~( strcmpi(prm.RSRPMode,'SSSonly') || ...
          strcmpi(prm.RSRPMode,'SSSwDMRS') )
        error(['Invalid RSRP measuring mode. Specify either ', ...
               '''SSSonly'' or ''SSSwDMRS'' as the mode.']);
    end

    % Number of beams at transmit end
    % Assume a number of beams so that the beams span the entire 120-degree
    % sector, with a maximum of 64 beams, as mentioned in TR 38.843 Table
    % 6.3.1-1
    % Assume the number of transmitted blocks is the same as the number of
    % beams at transmit end
    if prm.FrequencyRange=="FR1"
        maxNumSSBBlocks = 8;
    else % FR2
        maxNumSSBBlocks = 64;
    end
    if isempty(prm.NumSSBlocks)
        % The number of blocks/beams is automatically generated as the
        % minimum needed to cover the full azimuth sweep
        azTxBW = beamwidth(prm.TransmitAntennaArray,prm.CenterFrequency,'Cut','Azimuth');
        numAZTxBeams = round(diff(prm.TxAZlim)/azTxBW);

        if prm.ElevationSweep
            % If elevation sweep is enabled, consider elevation as well in
            % the computation of the number of blocks/beams needed.
            elTxBW = beamwidth(prm.TransmitAntennaArray,prm.CenterFrequency,'Cut','Elevation');
            numELTxBeams = round(diff(prm.TxELlim)/elTxBW);
        else
            numELTxBeams = 1;
        end

        prm.NumTxBeams = min(numAZTxBeams*numELTxBeams, maxNumSSBBlocks);
        prm.NumSSBlocks = prm.NumTxBeams;
    else
        % The number of blocks/beams is defined by the user
        if prm.NumSSBlocks>maxNumSSBBlocks
            error("Invalid number of SSB blocks. For " + prm.FrequencyRange + ...
                ", there can be only up to " + maxNumSSBBlocks + " blocks.");
        end
        prm.NumTxBeams = prm.NumSSBlocks;
    end
    prm.SSBTransmitted = [ones(1,prm.NumTxBeams) zeros(1,maxNumSSBBlocks-prm.NumTxBeams)];

    % Number of beams at receive end
    % Assume a number of beams so that the beams cover the full azimuth
    % sweep, with a maximum of 8 beams, as mentioned in TR 38.843 Table
    % 6.3.1-1.
    azRxBW = beamwidth(prm.ReceiveAntennaArray,prm.CenterFrequency,'Cut','Azimuth');
    numAZRxBeams = round(diff(prm.RxAZlim)/azRxBW);
    if prm.ElevationSweep
        % If elevation sweep is enabled, consider elevation as well in
        % the computation of the number of blocks/beams needed.
        elRxBW = beamwidth(prm.ReceiveAntennaArray,prm.CenterFrequency,'Cut','Elevation');
        numELRxBeams = round(diff(prm.RxELlim)/elRxBW);
    else
        numELRxBeams = 1;
    end
    prm.NumRxBeams = min(numAZRxBeams*numELRxBeams, 8);

    % 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 cfgDL = configureWaveformGenerator(prm,txBurst)
    % Configure an nrDLCarrierConfig object to be used by nrWaveformGenerator
    % to generate the SS burst waveform.

    % Calculate the minimum number of subframes for the given number of
    % transmitted blocks to avoid generating a waveform that is longer than
    % needed
    carrier = nrCarrierConfig(SubcarrierSpacing=prm.SCS);
    symbolsPerSubframe = carrier.SymbolsPerSlot*carrier.SlotsPerSubframe;
    numBlocks = length(txBurst.TransmittedBlocks);
    burstStartSymbols = hSSBurstStartSymbols(txBurst.BlockPattern,numBlocks);
    burstStartSymbols = burstStartSymbols(txBurst.TransmittedBlocks==1);
    burstOccupiedSymbols = burstStartSymbols.' + (1:4);
    numSubframes = ceil(burstOccupiedSymbols(prm.NumSSBlocks,end)/symbolsPerSubframe);

    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.FrequencyRange;
    cfgDL.NCellID = prm.NCellID;
    cfgDL.NumSubframes = numSubframes;
    cfgDL.WindowingPercent = 0;
    cfgDL.SSBurst = txBurst;

end

function rxWaveform = hAWGN(rxWaveform,noiseFigure,sampleRate)
    % Add noise to the received waveform

    persistent kBoltz;
    if isempty(kBoltz)
        kBoltz = physconst('Boltzmann');
    end

    % Calculate the required noise power spectral density
    NF = 10^(noiseFigure/10);
    N0 = sqrt(kBoltz*sampleRate*290*NF);

    % Establish dimensionality based on the received waveform
    [T,Nr] = size(rxWaveform);

    % Create noise
    noise = N0*randn([T Nr],'like',1i);

    % Add noise to the received waveform
    rxWaveform = rxWaveform + noise;
end

function channel = forceLOSChannel(prm,channel)
    % Force the channel to be LOS
    if channel.SmallScale.HasLOSCluster
        % The channel is already LOS
        return;
    end

    % Turn on the HasLOSCluster flag
    channel.SmallScale.HasLOSCluster = true;

    % Ensure the array paths are pointing in the right direction and remove
    % all NLOS clusters
    d = prm.posRx-prm.posTx;
    [az,el,~] = cart2sph(d(1),d(2),d(3));
    channel.SmallScale.AnglesAoD = rad2deg(az);
    channel.SmallScale.AnglesZoD = 90-rad2deg(el);
    channel.SmallScale.AnglesAoA = channel.SmallScale.AnglesAoD(1) + 180;
    channel.SmallScale.AnglesZoA = 180-channel.SmallScale.AnglesZoD(1);
    channel.SmallScale.PathDelays = channel.SmallScale.PathDelays(1);
    channel.SmallScale.AveragePathGains = channel.SmallScale.AveragePathGains(1);

    channel.SmallScale.NumStrongestClusters = 0;
    channel.SmallScale.XPR = channel.SmallScale.XPR(1,:);
    channel.SmallScale.RayCoupling = channel.SmallScale.RayCoupling(1,:,:);
    channel.SmallScale.InitialPhases = channel.SmallScale.InitialPhases(1,:,:);

end

参考

オブジェクト

トピック