このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
CSI-RS を使用した NR ダウンリンク送信側のビーム調整
この例では、5G Toolbox™ のチャネル状態情報基準信号 (CSI-RS) を使用したダウンリンク送信側のビーム調整手続きを示します。この例では、散乱環境において複数の CSI-RS リソースをさまざまな方向に送信する方法と、基準信号受信電力 (RSRP) 測定値に基づいて最適な送信ビームを選択する方法を示します。
はじめに
NR 5G の周波数範囲 2 (FR2) は、ミリメートル波 (mmWave) の周波数 (24.25 GHz ~ 52.6 GHz) で運用されます。周波数が高くなるにつれて送信信号のパス損失と侵入損失が高くなる傾向があり、これによりリンク バジェットが影響を受けます。高い周波数で信号を送受信する際のゲインと指向性を改善するには、ビームフォーミングを行う必要があります。ビームの管理は、良好な接続状態を確保するため、最適なビーム ペア (送信ビームおよび対応する受信ビーム) を確立して維持するためのレイヤー 1 (物理レイヤー) の手続きとレイヤー 2 (メディア アクセス制御) の手続きのセットになります。TR 38.802 の Section 6.1.6.1 [1] では、ビームの管理が 3 つの手続きとして定義されています。
手続き 1 (P-1): この手続きは、同期信号ブロック (SSB) に基づく初期捕捉に焦点を当てています。初期捕捉の際に、送信側と受信側の両方でビーム スイーピングを行い、RSRP 測定値に基づいて最適なビーム ペアを選択します。一般に、選択されたビームは幅が広く、データの送受信にとって最適なビーム ペアではない可能性があります。この手続きの詳細については、NR SSB のビーム スイーピングを参照してください。
手続き 2 (P-2): この手続きは、送信側のビーム調整に焦点を当てています。ここでは、受信ビームを固定したまま送信側でビーム スイーピングを行います。この手続きは、ダウンリンク送信側のビーム調整については非ゼロ電力 CSI-RS (NZP-CSI-RS) に基づいて行い、アップリンク送信側のビーム調整についてはサウンディング基準信号 (SRS) に基づいて行います。
初期捕捉後に指向性とゲインの高いユニキャスト データ伝送を行うには、SSB ビームよりも細いビームが必要となります。そのため、一連の基準信号リソースを構成し、初期捕捉処理で得られたビーム角度範囲内でより細いビームを使用して、そのリソースをさまざまな方向に送信します。その後、ユーザー端末 (UE) またはアクセス ネットワーク ノード (gNB) において、固定された受信ビームを使って信号を取得し、それらのビームをすべて測定します。最後に、すべての送信ビームの RSRP 測定値に基づいて最適な送信ビームを選択します。
手続き 3 (P-3): この手続きは、受信側のビーム調整に焦点を当てています。ここでは、現在の送信ビームに対して受信側でビーム スイーピングを行います。この処理は、最適な受信ビームを見つけることを目的としています。これは、隣接するビームの場合もあれば、調整されたビームの場合もあります。この手続きでは、同じ送信ビームを使って一連の基準信号リソース (ダウンリンクの場合は NZP-CSI-RS、アップリンクの場合は SRS) を送信し、一定の角度範囲をカバーするさまざまな方向のさまざまなビームを使用して UE または gNB でその信号を受信します。最後に、すべての受信ビームの RSRP 測定値に基づいて最適な受信ビームを選択します。
この例は、送信機におけるダウンリンクのビーム調整に焦点を当てています。この例は、NR 5G の周波数範囲 1 (FR1) と周波数範囲 2 (FR2) のどちらでも機能します。次の図では、4 つの NZP-CSI-RS リソースを 4 つの異なる方向に送信する場合の送信側のビーム調整手続きを示しています。
この図では、この例の主な処理手順を示しており、送信側のビーム調整手続きに関連する手順を色分けして示しています。
CSI-RS リソースの生成
キャリアの構成
30 kHz のサブキャリア間隔で 50 MHz のキャリアを表すキャリア構成オブジェクトを作成します。
carrier = nrCarrierConfig;
% Maximum transmission bandwidth configuration for 50 MHz carrier with 30 kHz subcarrier spacing
carrier.NSizeGrid = 133;
carrier.SubcarrierSpacing = 30;
carrier.NSlot = 0;
carrier.NFrame = 0
carrier = nrCarrierConfig with properties: NCellID: 1 SubcarrierSpacing: 30 CyclicPrefix: 'normal' NSizeGrid: 133 NStartGrid: 0 NSlot: 0 NFrame: 0 IntraCellGuardBands: [0x2 double] Read-only properties: SymbolsPerSlot: 14 SlotsPerSubframe: 2 SlotsPerFrame: 20
CSI-RS の構成
numNZPRes
個の NZP-CSI-RS リソースから成る NZP-CSI-RS リソース セットを表す CSI-RS 構成オブジェクトを作成します。レイヤー 1 の RSRP 測定用に、TS 38.215 の Section 5.1.2 [2] または TS 38.214 の Section 5.1.6.1.2 [3] の規定に従い、同じ数のアンテナ ポート (シングルポートまたはデュアルポート) を使って 1 つのリソース セットにすべての CSI-RS リソースを構成します。この例は、シングルポートの CSI-RS で機能します。
numNZPRes = 12; csirs = nrCSIRSConfig; csirs.CSIRSType = repmat({'nzp'},1,numNZPRes); csirs.CSIRSPeriod = 'on'; csirs.Density = repmat({'one'},1,numNZPRes); csirs.RowNumber = repmat(2,1,numNZPRes); csirs.SymbolLocations = {0,1,2,3,4,5,6,7,8,9,10,11}; csirs.SubcarrierLocations = repmat({0},1,numNZPRes); csirs.NumRB = 25
csirs = nrCSIRSConfig with properties: CSIRSType: {'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp' 'nzp'} CSIRSPeriod: 'on' RowNumber: [2 2 2 2 2 2 2 2 2 2 2 2] Density: {'one' 'one' 'one' 'one' 'one' 'one' 'one' 'one' 'one' 'one' 'one' 'one'} SymbolLocations: {[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]} SubcarrierLocations: {[0] [0] [0] [0] [0] [0] [0] [0] [0] [0] [0] [0]} NumRB: [25] RBOffset: [0] NID: [0] Read-only properties: NumCSIRSPorts: [1 1 1 1 1 1 1 1 1 1 1 1] CDMType: {'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM' 'noCDM'}
% Validate CSI-RS antenna ports validateCSIRSPorts(csirs); % Get the binary vector to represent the presence of each CSI-RS resource % in a specified slot csirsTransmitted = getActiveCSIRSRes(carrier,csirs);
すべての NZP-CSI-RS リソースのパワー スケーリングをデシベル (dB) 単位で構成します。
powerCSIRS = 0;
CSI-RS シンボルとインデックスの生成
構成オブジェクト carrier
および csirs
を使用し、CSI-RS のシンボルとインデックスを生成します。各 CSI-RS リソースの出力を個別に識別するには、名前と値のペア OutputResourceFormat,'cell'
を指定します。
csirsSym = nrCSIRS(carrier,csirs,'OutputResourceFormat','cell')
csirsSym=1×12 cell array
{25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double} {25x1 double}
csirsInd = nrCSIRSIndices(carrier,csirs,'OutputResourceFormat','cell')
csirsInd=1×12 cell array
{25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32} {25x1 uint32}
アンテナ アレイと散乱体の構成
送信側および受信側のアンテナ アレイの構成
搬送波周波数と信号伝播速度を構成します。
% Set the carrier frequency fc = 3.5e9; freqRange = validateFc(fc); % Set the propagation speed c = physconst('LightSpeed'); % Calculate wavelength lambda = c/fc;
送信側と受信側のアンテナ アレイのサイズを 2 要素ベクトルとして構成します。ここで、最初の要素はアンテナ アレイの行数を表し、2 番目の要素はアンテナ アレイの列数を表します。
txArySize = [8 8]; rxArySize = [2 2];
送信アンテナ素子と受信アンテナ素子の総数を計算します。
nTx = prod(txArySize); nRx = prod(rxArySize);
送信側と受信側のアンテナ アレイの位置を構成します。次に、送信側と受信側のアンテナ アレイ位置間の空間間隔に基づき、自由空間パス損失を計算します。
% Configure antenna array positions txArrayPos = [0;0;0]; rxArrayPos = [100;50;0]; % Calculate the free space path loss toRxRange = rangeangle(txArrayPos,rxArrayPos); spLoss = fspl(toRxRange,lambda);
アンテナ アレイのサイズに基づき、等間隔直線アレイ (ULA) または等間隔矩形アレイ (URA) を構成します。
% Initialize the flags to choose between URA and ULA isTxRectArray = false; isRxRectArray = false; % Enable isTxRectArray if both the number of rows and columns of transmit % antenna array are greater than one if ~any(txArySize == 1) isTxRectArray = true; end % Enable isRxRectArray if both the number of rows and columns of receive % antenna array are greater than one if ~any(rxArySize == 1) isRxRectArray = true; end % Configure the transmit and receive antenna elements txAntenna = phased.IsotropicAntennaElement('BackBaffled',true); % To avoid transmission beyond +/- 90 % degrees from the broadside, baffle % the back of the transmit antenna % element by setting the BackBaffled % property to true rxAntenna = phased.IsotropicAntennaElement('BackBaffled',false); % To receive the signal from 360 degrees, % set the BackBaffled property to false % Configure transmit antenna array if isTxRectArray % Create a URA System object for signal transmission txArray = phased.URA('Element',txAntenna,'Size',txArySize,'ElementSpacing',lambda/2); else % Create a ULA System object for signal transmission txArray = phased.ULA('Element',txAntenna,'NumElements',nTx,'ElementSpacing',lambda/2); end % Configure receive antenna array if isRxRectArray % Create a URA System object for signal reception rxArray = phased.URA('Element',rxAntenna,'Size',rxArySize,'ElementSpacing',lambda/2); else % Create a ULA System object for signal reception rxArray = phased.ULA('Element',rxAntenna,'NumElements',nRx,'ElementSpacing',lambda/2); end
散乱体の構成
fixedScatMode = true; rng(42); if fixedScatMode % Fixed single scatterer location numScat = 1; scatPos = [60;10;15]; else % Generate scatterers at random positions numScat = 10; %#ok<UNRCH> azRange = -180:180; randAzOrder = randperm(length(azRange)); elRange = -90:90; randElOrder = randperm(length(elRange)); azAngInSph = deg2rad(azRange(randAzOrder(1:numScat))); elAngInSph = deg2rad(elRange(randElOrder(1:numScat))); r = 20; % Transform spherical coordinates to Cartesian coordinates [x,y,z] = sph2cart(azAngInSph,elAngInSph,r); scatPos = [x;y;z] + (txArrayPos + rxArrayPos)/2; end
送信ビームフォーミングと OFDM 変調
ステアリング ベクトルの計算
送信アンテナ アレイの steering vector System object™ を作成します。
txArrayStv = phased.SteeringVector('SensorArray',txArray,'PropagationSpeed',c);
送信アンテナ アレイを基準とした散乱体位置の角度を計算します。
[~,scatAng] = rangeangle(scatPos(:,1),txArrayPos); % Pointing towards the first scatterer position, in case of multiple scatterers
初期捕捉処理 (P-1) で得られた SSB 送信ビームの方位角面と仰角面のビーム幅を構成します。
azTxBeamWidth = 30; % In degrees elTxBeamWidth = 30; % In degrees
方位角面と仰角面のビーム幅を使用し、散乱体の位置と (部分的または完全に) 向きが等しい SSB 送信ビーム方向を取得します。
ssbTxAng = getInitialBeamDir(scatAng,azTxBeamWidth,elTxBeamWidth);
SSB 送信ビームがカバーする角度範囲内で、アクティブなすべての CSI-RS リソースのビーム方向 (方位角と仰角のペア) を計算します。
% Get the number of transmit beams based on the number of active CSI-RS resources in a slot numBeams = sum(csirsTransmitted); % Get the azimuthal sweep range based on the SSB transmit beam direction % and its beamwidth in azimuth plane azSweepRange = [ssbTxAng(1) - azTxBeamWidth/2 ssbTxAng(1) + azTxBeamWidth/2]; % Get the elevation sweep range based on the SSB transmit beam direction % and its beamwidth in elevation plane elSweepRange = [ssbTxAng(2) - elTxBeamWidth/2 ssbTxAng(2) + elTxBeamWidth/2]; % Get the azimuth and elevation angle pairs for all NZP-CSI-RS transmit beams azBW = beamwidth(txArray,fc,'Cut','Azimuth'); elBW = beamwidth(txArray,fc,'Cut','Elevation'); csirsBeamAng = hGetBeamSweepAngles(numBeams,azSweepRange,elSweepRange,azBW,elBW);
アクティブなすべての CSI-RS リソースについて、ステアリング ベクトルを計算します。
wT = zeros(nTx,numBeams); for beamIdx = 1:numBeams tempW = txArrayStv(fc,csirsBeamAng(:,beamIdx)); wT(:,beamIdx) = tempW; end
デジタル ビームフォーミングの適用
すべての NZP-CSI-RS リソースをループ処理し、アクティブなリソースすべてにデジタル ビームフォーミングを適用します。デジタル ビームフォーミングは、同じ OFDM シンボル内で周波数選択性ビームフォーミングを提供できると考えられています。
% Number of CSI-RS antenna ports ports = csirs.NumCSIRSPorts(1); % Initialize the beamformed grid bfGrid = nrResourceGrid(carrier,nTx); % Get the active NZP-CSI-RS resource indices activeRes = find(logical(csirsTransmitted)); for resIdx = 1:numNZPRes % Initialize the carrier resource grid for one slot and map NZP-CSI-RS symbols onto % the grid txSlotGrid = nrResourceGrid(carrier,ports); txSlotGrid(csirsInd{resIdx}) = db2mag(powerCSIRS)*csirsSym{resIdx}; reshapedSymb = reshape(txSlotGrid,[],ports); % Get the transmit beam index beamIdx = find(activeRes == resIdx); % Apply the digital beamforming if ~isempty(beamIdx) bfSymb = reshapedSymb * wT(:,beamIdx)'; bfGrid = bfGrid + reshape(bfSymb,size(bfGrid)); end end
OFDM 変調の実行
OFDM 変調を実行し、時間領域の波形を生成します。
% Perform OFDM modulation [tbfWaveform,ofdmInfo] = nrOFDMModulate(carrier,bfGrid); % Normalize the beamformed time-domain waveform over the number of transmit % antennas tbfWaveform = tbfWaveform/sqrt(nTx);
散乱 MIMO チャネルと AWGN
チャネルの構成
System objectphased.ScatteringMIMOChannel
(Phased Array System Toolbox) を使用し、散乱に基づく MIMO 伝播チャネルを構成します。このチャネル モデルは、時間遅延、ゲイン、ドップラー シフト、位相変化、自由空間パス損失、およびオプションでその他の大気減衰を入力に適用します。
chan = phased.ScatteringMIMOChannel; chan.PropagationSpeed = c; chan.CarrierFrequency = fc; chan.Polarization = 'none'; chan.SpecifyAtmosphere = false; chan.SampleRate = ofdmInfo.SampleRate; chan.SimulateDirectPath = false; chan.ChannelResponseOutputPort = true; % Configure transmit array parameters chan.TransmitArray = txArray; chan.TransmitArrayMotionSource = 'property'; chan.TransmitArrayPosition = txArrayPos; % Configure receive array parameters chan.ReceiveArray = rxArray; chan.ReceiveArrayMotionSource = 'property'; chan.ReceiveArrayPosition = rxArrayPos; % Configure scatterers chan.ScattererSpecificationSource = 'property'; chan.ScattererPosition = scatPos; chan.ScattererCoefficient = ones(1,numScat); % Get the maximum channel delay by transmitting random signal [~,~,tau] = chan(complex(randn(chan.SampleRate*1e-3,nTx), ... randn(chan.SampleRate*1e-3,nTx))); maxChDelay = ceil(max(tau)*chan.SampleRate);
チャネルを使用した波形の送信
チャネルの内容をフラッシュするために送信波形の末尾にゼロを追加してから、時間領域波形を散乱 MIMO チャネルに渡します。これらのゼロは、チャネルで発生する遅延を想定しています。
% Append zeros to the transmit waveform to account for channel delay tbfWaveform = [tbfWaveform; zeros(maxChDelay,nTx)]; % Pass the waveform through the channel fadWave = chan(tbfWaveform);
AWGN の適用
受信ゲインを構成して劣化した波形に適用し、パス損失を補正します。次に、結果として得られた波形に AWGN を適用します。この例で使用している SNR 定義の説明については、リンク シミュレーションで使用する SNR の定義を参照してください。
% Configure the receive gain rxGain = 10.^((spLoss)/20); % Gain in linear scale % Apply the gain fadWaveG = fadWave*rxGain; % Configure the SNR in dB SNRdB = 20; SNR = 10^(SNRdB/10); % SNR in linear scale % Calculate the standard deviation for AWGN N0 = 1/sqrt(2.0*nRx*double(ofdmInfo.Nfft)*SNR); % Generate AWGN noise = N0*complex(randn(size(fadWaveG)),randn(size(fadWaveG))); % Apply AWGN to the waveform rxWaveform = fadWaveG + noise;
タイミング同期
受信した基準シンボルと NZP-CSI-RS シンボルのローカル コピーとの相互相関を求め、タイミング同期を実行します。
% Generate reference symbols and indices refSym = nrCSIRS(carrier,csirs); refInd = nrCSIRSIndices(carrier,csirs); % Estimate timing offset offset = nrTimingEstimate(carrier,rxWaveform,refInd,refSym); if offset > maxChDelay offset = 0; end % Correct timing offset syncTdWaveform = rxWaveform(1+offset:end,:);
OFDM 復調と受信ビームフォーミング
OFDM 復調
同期した時間領域波形を OFDM 復調します。
rxGrid = nrOFDMDemodulate(carrier,syncTdWaveform);
ステアリング ベクトルの計算
受信アンテナ アレイの steering vector System object を作成します。
rxArrayStv = phased.SteeringVector('SensorArray',rxArray,'PropagationSpeed',c);
受信アンテナ アレイを基準とした散乱体位置の角度を計算します。これを、SSB を使用した初期捕捉処理で得られた受信ビームの方向とします。
[~,scatRxAng] = rangeangle(scatPos(:,1),rxArrayPos); % Pointing towards the first scatterer position, in case of multiple scatterers
初期捕捉処理 (P-1) で得られた受信ビームの方位角面と仰角面のビーム幅を構成します。
azRxBeamWidth = 30; % In degrees elRxBeamWidth = 30; % In degrees
P-1 で得られた方位角面と仰角面のビーム幅を使用し、散乱体位置と (部分的または完全に) 向きが等しい初期受信ビーム方向を取得します。
rxAng = getInitialBeamDir(scatRxAng,azRxBeamWidth,elRxBeamWidth);
受信角度に関するステアリング ベクトルを計算します。
wR = rxArrayStv(fc,rxAng);
受信ビームフォーミングの適用
受信側でデジタル ビームフォーミングを実行するには、rxGrid
に他の信号が存在しないと仮定して (単一 UE のシナリオ)、ステアリングの重みを rxGrid
に適用します。FR2 の場合は、TS 38.215 の Section 5.1.2 [2] で規定されているように、すべての受信アンテナ素子からの信号を結合します。
temp = rxGrid; if strcmpi(freqRange,'FR1') % Beamforming without combining rbfGrid = reshape(reshape(temp,[],nRx).*wR',size(temp,1),size(temp,2),[]); else % 'FR2' % Beamforming with combining rbfGrid = reshape(reshape(temp,[],nRx)*conj(wR),size(temp,1),size(temp,2),[]); end
散乱 MIMO のシナリオのプロット
MIMO のシーン パラメーターを構成します。
sceneParams.TxArray = txArray; sceneParams.RxArray = rxArray; sceneParams.TxArrayPos = txArrayPos; sceneParams.RxArrayPos = rxArrayPos; sceneParams.ScatterersPos = scatPos; sceneParams.Lambda = lambda; sceneParams.ArrayScaling = 100; % To enlarge antenna arrays in the plot sceneParams.MaxTxBeamLength = 45; % Maximum length of transmit beams in the plot sceneParams.MaxRxBeamLength = 25; % Maximum length of receive beam in the plot
補助関数 hPlotSpatialMIMOScene
を使用し、散乱 MIMO のシナリオ (送信側と受信側のアンテナ アレイ、散乱体位置とそのパス、および送信側と受信側のアンテナ アレイのすべてのビーム パターン) をプロットします。この図のビーム パターンは、線形スケールの電力パターンと似ています。
hPlotSpatialMIMOScene(sceneParams,wT,wR);
axis tight;
view([74 29]);
ビームの決定
UE は、OFDM 復調後、現在の受信ビームの条件で、さまざまなビームによって送信されたすべての CSI-RS リソースの RSRP を測定します。関数 nrCSIRSMeasurements
を使用してこれらの測定を実行します。
% Perform RSRP measurements meas = nrCSIRSMeasurements(carrier,csirs,rbfGrid); % Display the measurement quantities for all CSI-RS resources in dBm RSRPdBm = max(meas.RSRPPerAntenna,[],1); disp(['RSRP measurements of all CSI-RS resources (in dBm):' 13 num2str(RSRPdBm)]);
RSRP measurements of all CSI-RS resources (in dBm): 42.3147 33.237 29.1999 45.1102 37.0922 31.4861 39.9414 33.5053 24.5859 17.5821 12.9908 -1.9296
測定値から RSRP の最大値を特定し、それに対応する最適なビームを見つけます。
% Get the transmit beam index with maximum RSRP value [~,maxRSRPIdx] = max(RSRPdBm(logical(csirsTransmitted))); % Get the CSI-RS resource index with maximum RSRP value [~,maxRSRPResIdx] = max(RSRPdBm);
調整後の送信ビームに対応するビーム幅を計算します。
% Get the steering weights corresponding to refined transmit beam if numBeams == 0 disp('Refinement has not happened, as NZP-CSI-RS is not transmitted') else refBeamWts = wT(:,maxRSRPIdx); csirsAzBeamWidth = beamwidth(txArray,fc,'PropagationSpeed',c,'Weights',refBeamWts,'CutAngle',csirsBeamAng(2,maxRSRPIdx)); csirsElBeamWidth = beamwidth(txArray,fc,'PropagationSpeed',c,'Weights',refBeamWts,'Cut','Elevation','CutAngle',csirsBeamAng(1,maxRSRPIdx)); disp(['From initial beam acquisition:' 13 ' Beamwidth of initial SSB beam in azimuth plane is: '... num2str(azTxBeamWidth) ' degrees' 13 ... ' Beamwidth of initial SSB beam in elevation plane is: '... num2str(elTxBeamWidth) ' degrees' 13 13 ... 'With transmit-end beam refinement:' 13 ' Refined transmit beam ('... num2str(maxRSRPIdx) ') corresponds to CSI-RS resource '... num2str(maxRSRPResIdx) ' is selected in the direction ['... num2str(csirsBeamAng(1,maxRSRPIdx)) ';' num2str(csirsBeamAng(2,maxRSRPIdx))... ']' 13 ' Beamwidth of refined transmit beam in azimuth plane is: '... num2str(csirsAzBeamWidth) ' degrees' 13 ... ' Beamwidth of refined transmit beam in elevation plane is: '... num2str(csirsElBeamWidth) ' degrees']); end
From initial beam acquisition: Beamwidth of initial SSB beam in azimuth plane is: 30 degrees Beamwidth of initial SSB beam in elevation plane is: 30 degrees With transmit-end beam refinement: Refined transmit beam (4) corresponds to CSI-RS resource 4 is selected in the direction [10;15] Beamwidth of refined transmit beam in azimuth plane is: 13.46 degrees Beamwidth of refined transmit beam in elevation plane is: 13.24 degrees
まとめとその他の調査
この例では、NZP-CSI-RS を使用したビーム調整手続き (P-2) について説明しています。この手続きでは、初期捕捉で得られたビームよりも細い送信ビームを特定します。
複数の CSI-RS リソース、送信側と受信側のアンテナ アレイ構成、および複数の散乱体を構成し、さまざまなビームの中から調整されたビームを選択することができます。また、信号を送受信する方位角と仰角のペアを構成することもできます。
参考文献
3GPP TR 38.802. "Study on New Radio access technology physical layer aspects." 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.
3GPP TS 38.214. "NR; Physical layer procedures for data." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
ローカル関数
function validateCSIRSPorts(csirs) % validateCSIRSPorts validates the CSI-RS antenna ports, given the % CSI-RS configuration object CSIRS. numPorts = csirs.NumCSIRSPorts; if any(numPorts > 1) error('nr5g:PortsGreaterThan1','CSI-RS resources must be configured for single-port for RSRP measurements.'); end end function csirsTransmitted = getActiveCSIRSRes(carrier,csirs) % getActiveCSIRSRes returns a binary vector indicating the presence of % all CSI-RS resources in a specified slot, given the carrier % configuration object CARRIER and CSI-RS configuration object CSIRS. % Extract the following properties of carrier NSlotA = carrier.NSlot; % Absolute slot number NFrameA = carrier.NFrame; % Absolute frame number SlotsPerFrame = carrier.SlotsPerFrame; % Number of slots per frame % Calculate the appropriate frame number (0...1023) based on the % absolute slot number NFrameR = mod(NFrameA + fix(NSlotA/SlotsPerFrame),1024); % Relative slot number (0...slotsPerFrame-1) NSlotR = mod(NSlotA,SlotsPerFrame); % Loop over the number of CSI-RS resources numCSIRSRes = numel(csirs.CSIRSType); csirsTransmitted = zeros(1,numCSIRSRes); csirs_struct = validateConfig(csirs); for resIdx = 1:numCSIRSRes % Extract the CSI-RS slot periodicity and offset if isnumeric(csirs_struct.CSIRSPeriod{resIdx}) Tcsi_rs = csirs_struct.CSIRSPeriod{resIdx}(1); Toffset = csirs_struct.CSIRSPeriod{resIdx}(2); else if strcmpi(csirs_struct.CSIRSPeriod{resIdx},'on') Tcsi_rs = 1; else Tcsi_rs = 0; end Toffset = 0; end % Check for the presence of CSI-RS, based on slot periodicity and offset if (Tcsi_rs ~= 0) && (mod(SlotsPerFrame*NFrameR + NSlotR - Toffset, Tcsi_rs) == 0) csirsTransmitted(resIdx) = 1; end end end function freqRange = validateFc(fc) % validateFc validates the carrier frequency FC and returns the frequency % range as either 'FR1' or 'FR2'. if fc >= 410e6 && fc <= 7.125e9 freqRange = 'FR1'; elseif fc >= 24.25e9 && fc <= 52.6e9 freqRange = 'FR2'; else error('nr5g:invalidFreq',['Selected carrier frequency is outside '... 'FR1 (410 MHz to 7.125 GHz) and FR2 (24.25 GHz to 52.6 GHz).']); end end function beamDir = getInitialBeamDir(scatAng,azBeamWidth,elBeamWidth) % getInitialBeamDir returns the initial beam direction BEAMDIR, given the % angle of scatterer position with respect to transmit or receive antenna % array SCATANG, beamwidth of transmit or receive beam in azimuth plane % AZBEAMWIDTH, and beamwidth of transmit or receive beam in elevation % plane ELBEAMWIDTH. % Azimuth angle boundaries of all transmit/receive beams azSSBSweep = -180:azBeamWidth:180; % Elevation angle boundaries of all transmit/receive beams elSSBSweep = -90:elBeamWidth:90; % Get the azimuth angle of transmit/receive beam azIdx1 = find(azSSBSweep <= scatAng(1),1,'last'); azIdx2 = find(azSSBSweep >= scatAng(1),1,'first'); azAng = (azSSBSweep(azIdx1) + azSSBSweep(azIdx2))/2; % Get the elevation angle of transmit/receive beam elIdx1 = find(elSSBSweep <= scatAng(2),1,'last'); elIdx2 = find(elSSBSweep >= scatAng(2),1,'first'); elAng = (elSSBSweep(elIdx1) + elSSBSweep(elIdx2))/2; % Form the azimuth and elevation angle pair (in the form of [az;el]) % for transmit/receive beam beamDir = [azAng;elAng]; end