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
個の受信ビームによって受信されます。
この例では、N
と M
の両方がバースト内の SSB の数に等しいと仮定しています。簡略化のため、この例ではバーストを 1 つだけ生成しますが、無線によってバーストを M
回受信する状態を再現するため、受信機はこの 1 つのバーストを M
回処理します。
次の図では、N = M = 4
のときの gNB と UE の両方における方位角面内のスイープをビームごとに示しています。この図では、デュアル スイープにかかる時間を示しています。ここで、gNB の各区間は SSB に対応し、UE の各区間は SS バーストに対応します。ここに示されているシナリオでは、理論上選択されるビームペア リンクとしてビーム S3
と U2
が強調表示されています。この例では、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 ]。
参考文献
3GPP TR 38.802. "Study on New Radio access technology physical layer aspects." 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.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
参考
オブジェクト
phased.ScatteringMIMOChannel
(Phased Array System Toolbox) |phased.SteeringVector
(Phased Array System Toolbox)