このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 バーストに対応します。ここに示されているシナリオでは、理論上選択されるビームペア リンクとしてビーム S3 と U2 が強調表示されています。この例では、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 ダウンリンク送信側のビーム調整を参照してください。これらの手続きを使用することで、最初のビーム ペア リンクが確立された後に接続済みモードでビームの絞り込みと調整を行うことができます。
参考文献
3GPP TR 38.802. "Study on New Radio access technology physical layer aspects." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
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.
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.
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.
3GPP TS 38.211. "NR; Physical channels and modulation." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
3GPP TS 38.215. "NR; Physical layer measurements." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
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.
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
参考
オブジェクト
phased.ScatteringMIMOChannel(Phased Array System Toolbox) |phased.SteeringVector(Phased Array System Toolbox)