Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

NR セル サーチおよび MIB と SIB1 の復元

この例では5 g工具箱™を使用してgNodeBのライブ信号の同期、復調、復号化を行う方法を説明します。この例では、マスター情報ブロック (MIB) と最初のシステム情報ブロック (SIB1) を復号化します。MIB と SIB1 の復号化には、ダウンリンクのチャネルと信号の大部分を復調して復号化できる総合的な受信機が必要です。

はじめに

ユーザー端末 (UE) は、ネットワークと通信する前に、セル サーチとセル選択の手順を実行し、初期システム情報を取得しなければなりません。処理の最初の手順は、フレーム同期を取得し、セル ID を検出して、MIB と SIB1 を復号化することです。この例では、5G Toolbox を使用してそれらの手順を実行する方法を説明します。

I/Q サンプルの取得波形を使ったこの例を使用するか、nrWaveformGeneratorを使用して同期信号 (SS) バーストと SIB1 を含むローカル波形を生成できます。ローカルに生成された波形について、この例では以下の手順を実行します。

  • 波形生成: 5G Toolbox のダウンリンク波形発生器を使用して、MIB を搬送する同期信号バースト、および SIB1 を搬送する CORESET 0、PDCCH、PDSCH を構成し、生成します。送信機は 1 つの SS ブロックの SNR を向上させることがありますが、ビームフォーミングを実行するわけではありません。SSB ビームフォーミングの詳細については、NR SSB Beam Sweepingを参照してください。

  • AWGN: 波形に加法性ホワイト ガウス ノイズ (AWGN) を適用します。

  • 受信機: 受信波形にさまざまな同期処理と復調処理を適用し、システム フレーム番号、セル ID、SSB を確定して、MIB を復号化します。これらによって、PDCCH の downlink control information (DCI) のブラインド復号化に必要な情報が得られます。受信機は DCI を使用して PDSCH 復調器を構成し、DL-SCH を復号化して、最後に SIB1 を復元します。

次の図は、受信機内部の処理手順を示しています。

受信機構成

受信波形を同期して復調するには、次の情報が必要です。

  • 受信波形を復調するための波形のサンプル レート。

  • 受信波形にシンボル位相補償を適用するためのキャリアの中心周波数。

  • CORESET 0 の周波数リソースを決定するための最小チャネル帯域幅。TS 38.101-1 の Table 5.3.5-1 [1] では、各 NR 帯域のチャネル帯域幅について説明されています。

  • SS/PBCH ブロックのサブキャリア間隔を決定するための SS ブロック パターン (ケース A ~ E)。UE は NR 動作帯域に基づいて SS ブロック パターンを検索します。詳細については、TS 38.104 の Table 5.4.3.3-1 と Table 5.4.3.3-2 [2] を参照してください。

  • PBCH DM-RS シーケンスと PBCH デスクランブルのパラメーターを計算するためのバースト内 SS/PBCH ブロックの数 ($L_{max}$)。これらのパラメーターは、TS 38.211 の Section 7.3.3.1 と Section 7.4.1.4.1 [3] で説明されているように、SS/PBCH ブロック インデックスに依存しています。TS 38.213 の Section 4.1 [5] では、各ケースでのバースト内 SS/PBCH ブロックのセットについて説明されています。UE は、SS ブロック パターンと NR 動作帯域に基づいて、$L_{max}$の値を認識します。

loadFromFile = 0;% Set to 1 to load a captured waveformifloadFromFile% Load captured waveformrx = load(“capturedWaveformSIB1.mat”); rxWaveform = rx.waveform;% Configure receiver sample rate (samples/second)rxSampleRate = rx.sampleRate;% Symbol phase compensation frequency. Specify the carrier center%频率或设置为0禁用符号相位有限公司mpensationfPhaseComp = rx.fPhaseComp;% Carrier center frequency (Hz)% Set the minimum channel bandwidth for the NR band required to% configure CORESET 0 in FR1 (See TS 38.101-1 Table 5.3.5-1)minChannelBW = rx.minChannelBW;% 5, 10, 40 MHz% Configure necessary burst parameters at the receiver. The SSB pattern% can be 'Case A','Case B','Case C' for FR1 or 'Case D','Case E' for% FR2. The maximum number of blocks L_max can be 4 or 8 for FR1 and 64% for FR2.refBurst.BlockPattern = rx.ssbBlockPattern; refBurst.L_max = rx.L_max;else% Generate waveform containing SS burst and SIB1% Configure the cell identityconfig = struct(); config.NCellID = 102;% Configure an SS burstconfig.BlockPattern ='Case B';% FR1: 'Case A','Case B','Case C'. FR2: 'Case D','Case E'config.TransmittedBlocks = ones(1,8);% Bitmap of SS blocks transmittedconfig.SubcarrierSpacingCommon = 15;% SIB1 subcarrier spacing in kHz (15 or 30 for FR1. 60 or 120 for FR2)config.EnableSIB1 = 1;% Set to 0 to disable SIB1% Set the minimum channel bandwidth for the NR band required to% configure CORESET0 in FR1 (See TS 38.101-1 Table 5.3.5-1)config.MinChannelBW = 5;% 5, 10, 40 MHz% Configure and generate a waveform containing an SS burst and SIB1wavegenConfig = hSIB1WaveformConfiguration(config); [txWaveform,waveInfo] = nrWaveformGenerator(wavegenConfig); txOfdmInfo = waveInfo.ResourceGrids(1).Info;% Introduce a beamforming gain by boosting the SNR of one SSB and% associated SIB1 PDCCH and PDSCHssbIdx = 0;% Index of the SSB to boost (0-based)boost = 6;% SNR boost in dBtxWaveform = hSIB1Boost(txWaveform,wavegenConfig,waveInfo,ssbIdx,boost);% Add white Gaussian noise to the waveformrng('default');% Reset the random number generatorSNRdB = 20;% SNR for AWGNrxWaveform = awgn(txWaveform,SNRdB-boost,-10*log10(double(txOfdmInfo.Nfft)));% Configure receiver% Sample raterxSampleRate = txOfdmInfo.SampleRate;% Symbol phase compensation frequency (Hz). The function% nrWaveformGenerator does not apply symbol phase compensation to the% generated waveform.fPhaseComp = 0;% Carrier center frequency (Hz)% Minimum channel bandwidth (MHz)minChannelBW = config.MinChannelBW;% Configure necessary burst parameters at the receiverrefBurst.BlockPattern = config.BlockPattern; refBurst.L_max = numel(config.TransmittedBlocks);end% Get OFDM information from configured burst and receiver parametersnrbSSB = 20;scsSSB = hSSBurstSubcarrierSpacing(再保险fBurst.BlockPattern); rxOfdmInfo = nrOFDMInfo(nrbSSB,scsSSB,'SampleRate',rxSampleRate);% Display spectrogram of received waveformfigure; nfft = rxOfdmInfo.Nfft; spectrogram(rxWaveform(:,1),ones(nfft,1),0,nfft,'centered',rxSampleRate,'yaxis',“MinThreshold”,-130); title('Spectrogram of the Received Waveform')

PSS サーチおよび周波数オフセットの補正

受信機は、PSS サーチと大まかな周波数オフセットの推定を、以下の手順に従って実行します。

  • 受信波形を周波数オフセットの候補で周波数シフトする。オフセット候補は、サブキャリアの半分の間隔で配置されます。周波数オフセットの検索帯域幅はsearchBWを使用して制御します。

  • 周波数シフトされた受信波形と各 PSS シーケンス (NID2) の 3 つの候補の相関をとり、最も強い相関ピークを抽出する。基準 PSS シーケンスは周波数の中心にあります。そのため、最も強い相関ピークが、キャリアの中心周波数に対する大まかな周波数オフセットの指標になります。また、このピークは、3 つの PSS (NID2) のうち受信波形で検出されたものと、チャネル条件が最良になる時点も示します。

  • SSB 内の各 OFDM シンボルのサイクリック プレフィックスと対応する OFDM シンボルの有意部分の相関をとることで、サブキャリアの半分未満の周波数オフセットを推定する。この相関の位相は、波形の周波数オフセットに比例します。

disp(' -- Frequency correction and timing estimation --')% Specify the frequency offset search bandwidth in kHzsearchBW = 6*scsSSB; [rxWaveform,freqOffset,NID2] = hSSBurstFrequencyCorrect(rxWaveform,refBurst.BlockPattern,rxSampleRate,searchBW); disp([' Frequency offset: 'num2str(freqOffset,'%.0f')' Hz'])
-- Frequency correction and timing estimation -- Frequency offset: 65 Hz

時間同期とOFDM復調

受信機は、周波数検索処理で検出した基準 PSS シーケンスを使用して、最も強い SS ブロックへのタイミング オフセットを推定します。周波数オフセットを補正することで、受信機は、基準 PSS と受信波形の中心周波数が一致しているとみなすことができるようになります。最後に、受信機が同期波形を OFDM 復調し、SS ブロックを抽出します。

% Create a reference grid for timing estimation using detected PSS. The PSS%放在第二个OFDM符号的引用ence grid to avoid the% special CP length of the first OFDM symbol.refGrid = zeros([nrbSSB*12 2]); refGrid(nrPSSIndices,2) = nrPSS(NID2);% Second OFDM symbol for correct CP length% Timing estimation. This is the timing offset to the OFDM symbol prior to% the detected SSB due to the content of the reference gridnSlot = 0; timingOffset = nrTimingEstimate(rxWaveform,nrbSSB,scsSSB,nSlot,refGrid,'SampleRate',rxSampleRate);% Synchronization, OFDM demodulation, and extraction of strongest SS blockrxGrid = nrOFDMDemodulate(rxWaveform(1+timingOffset:end,:),nrbSSB,scsSSB,nSlot,'SampleRate',rxSampleRate); rxGrid = rxGrid(:,2:5,:);% Display the timing offset in samples. As the symbol lengths are measured% in FFT samples, scale the symbol lengths to account for the receiver% sample rate.srRatio = rxSampleRate/(scsSSB*1e3*rxOfdmInfo.Nfft); firstSymbolLength = rxOfdmInfo.SymbolLengths(1)*srRatio; str = sprintf(' Time offset to synchronization block: %%.0f samples (%%.%.0ff ms) \n',floor(log10(rxSampleRate))-3); fprintf(str,timingOffset+firstSymbolLength,(timingOffset+firstSymbolLength)/rxSampleRate*1e3);
Time offset to synchronization block: 2200 samples (0.1432 ms)

SSS サーチ

受信機は、受信グリッドから SSS に関係するリソース エレメントを抽出し、ローカルに生成された可能性のある各 SSS シーケンスとの相関をとります。最も強い PSS シーケンスと SSS シーケンスのインデックスを組み合わせることで、PBCH DM-RS と PBCH の処理に必要な物理レイヤーのセル ID を得ることができます。

% Extract the received SSS symbols from the SS/PBCH blocksssIndices = nrSSSIndices; sssRx = nrExtractResources(sssIndices,rxGrid);% Correlate received SSS symbols with each possible SSS sequencesssEst = zeros(1,336);forNID1 = 0:335 ncellid = (3*NID1) + NID2; sssRef = nrSSS(ncellid); sssEst(NID1+1) = sum(abs(mean(sssRx .* conj(sssRef),1)).^2);end% Plot SSS correlationsfigure; stem(0:335,sssEst,'o'); title('SSS Correlations (Frequency Domain)'); xlabel('$N_{ID}^{(1)}$','Interpreter','latex'); ylabel('Magnitude'); axis([-1 336 0 max(sssEst)*1.1]);% Determine NID1 by finding the strongest correlationNID1 = find(sssEst==max(sssEst)) - 1;% Plot selected NID1holdon; plot(NID1,max(sssEst),'kx','LineWidth',2,'MarkerSize',8); legend(["correlations""$N_{ID}^{(1)}$ = "+ num2str(NID1)],'Interpreter','latex');% Form overall cell identity from estimated NID1 and NID2ncellid = (3*NID1) + NID2; disp([' Cell identity: 'num2str(ncellid)])
Cell identity: 102

PBCH DM-RS サーチ

SSS サーチと同様の処理で、受信機は PBCH DM-RS シーケンスの各候補を構築し、チャネルとノイズの推定を実行します。最も SNR の高い PBCH DM-RS のインデックスによって、PBCH スクランブルの初期化に必要な SS/PBCH ブロック インデックスの LSB が決まります。

% Calculate PBCH DM-RS indicesdmrsIndices = nrPBCHDMRSIndices(ncellid);% Perform channel estimation using DM-RS symbols for each possible DM-RS% sequence and estimate the SNRdmrsEst = zeros(1,8);foribar_SSB = 0:7 refGrid = zeros([240 4]); refGrid(dmrsIndices) = nrPBCHDMRS(ncellid,ibar_SSB); [hest,nest] = nrChannelEstimate(rxGrid,refGrid,'AveragingWindow',[0 1]); dmrsEst(ibar_SSB+1) = 10*log10(mean(abs(hest(:).^2)) / nest);end% Plot PBCH DM-RS SNRsfigure; stem(0:7,dmrsEst,'o'); title('PBCH DM-RS SNR Estimates'); xlabel('$\overline{i}_{SSB}$','Interpreter','latex'); xticks(0:7); ylabel('Estimated SNR (dB)'); axis([-1 8 min(dmrsEst)-1 max(dmrsEst)+1]);% Record ibar_SSB for the highest SNRibar_SSB = find(dmrsEst==max(dmrsEst)) - 1;% Plot selected ibar_SSBholdon; plot(ibar_SSB,max(dmrsEst),'kx','LineWidth',2,'MarkerSize',8); legend(["SNRs""$\overline{i}_{SSB}$ = "+ num2str(ibar_SSB)],'Interpreter','latex');

PBCH DM-RS と SSS を使用したチャネル推定

受信機は、前の手順で検出された SSS と PBCH DM-RS を使用して、SS/PBCH ブロック全体のチャネルを推定します。また、PBCH DM-RS/SSS に対する加法性ノイズの推定も実行します。

refGrid = zeros([nrbSSB*12 4]); refGrid(dmrsIndices) = nrPBCHDMRS(ncellid,ibar_SSB); refGrid(sssIndices) = nrSSS(ncellid); [hest,nest,hestInfo] = nrChannelEstimate(rxGrid,refGrid,'AveragingWindow',[0 1]);

PBCH 復調

受信機はセル ID を使用して、受信グリッドから PBCH に対応するリソース エレメントを判定し、抽出します。さらに、受信機はチャネルとノイズの推定を使用して、MMSE イコライズを実行します。イコライズされた PBCH シンボルを復調およびデスクランブルし、符号化された BCH ブロックのビット推定を取得します。

disp(' -- PBCH demodulation and BCH decoding -- ')% Extract the received PBCH symbols from the SS/PBCH block[pbchIndices,pbchIndicesInfo] = nrPBCHIndices(ncellid); pbchRx = nrExtractResources(pbchIndices,rxGrid);% Configure 'v' for PBCH scrambling according to TS 38.211 Section 7.3.3.1% 'v' is also the 2 LSBs of the SS/PBCH block index for L_max=4, or the 3% LSBs for L_max=8 or 64.ifrefBurst.L_max == 4 v = mod(ibar_SSB,4);elsev = ibar_SSB;endssbIndex = v;% PBCH equalization and CSI calculationpbchHest = nrExtractResources(pbchIndices,hest); [pbchEq,csi] = nrEqualizeMMSE(pbchRx,pbchHest,nest); Qm = pbchIndicesInfo.G / pbchIndicesInfo.Gd; csi = repmat(csi.',Qm,1); csi = reshape(csi,[],1);% Plot received PBCH constellation after equalizationfigure; plot(pbchEq,'o'); xlabel('In-Phase'); ylabel('Quadrature') title('Equalized PBCH Constellation'); m = max(abs([real(pbchEq(:)); imag(pbchEq(:))])) * 1.1; axis([-m m -m m]);% PBCH demodulationpbchBits = nrPBCHDecode(pbchEq,ncellid,v,nest);% Calculate RMS PBCH EVMpbchRef = nrPBCH(pbchBits<0,ncellid,v); evm = comm.EVM; pbchEVMrms = evm(pbchRef,pbchEq);% Display calculated EVMdisp([' PBCH RMS EVM: 'num2str(pbchEVMrms,'%0.3f')'%']);
-- PBCH demodulation and BCH decoding -- PBCH RMS EVM: 8.687%

BCH の復号化

受信機は BCH ビット推定を MMSE イコライザーからのチャネル状態情報 (CSI) で重み付けして、BCH を復号化します。BCH 復号化を構成するものには、レート リカバリ、Polar 復号化、CRC 復号化、デスクランブルに加え、8 個の追加のタイミング関連ペイロード ビットから 24 個の BCH トランスポート ブロック ビットを分離することが含まれます。

% Apply CSIpbchBits = pbchBits .* csi;% Perform BCH decoding including rate recovery, polar decoding, and CRC% decoding. PBCH descrambling and separation of the BCH transport block% bits 'trblk' from 8 additional payload bits A...A+7 is also performed:% A ... A+3: 4 LSBs of system frame number% A+4: half frame number% A+5 ... A+7: for L_max=64, 3 MSBs of the SS/PBCH block index% for L_max=4 or 8, A+5 is the MSB of subcarrier offset k_SSBpolarListLength = 8; [~,crcBCH,trblk,sfn4lsb,nHalfFrame,msbidxoffset] =...nrBCHDecode(pbchBits,polarListLength,refBurst.L_max,ncellid);% Display the BCH CRCdisp([' BCH CRC: 'num2str(crcBCH)]);% Stop processing MIB and SIB1 if BCH was received with errorsifcrcBCH disp(' BCH CRC is not zero.');returnend% Use 'msbidxoffset' value to set bits of 'k_SSB' or 'ssbIndex', depending% on the number of SS/PBCH blocks in the burstif(refBurst.L_max==64) ssbIndex = ssbIndex + (bit2int(msbidxoffset,3) * 8); k_SSB = 0;elsek_SSB = msbidxoffset * 16;end% Displaying the SSB indexdisp([' SSB index: 'num2str(ssbIndex)]);
BCH CRC: 0 SSB index: 0

MIB と BCH の解析

この例では、24 個の復号化された BCH トランスポート ブロック ビットから MIB メッセージを抽出し、初期システム情報をもつinitialSystemInfo構造体を作成します。この処理には、MIB の 6 つの MSB と PBCH ペイロード ビットの 4 つの LSB から 10 ビットのシステム フレーム番号 (SFN)NFrameを再構成することが含まれます。また、バーストごとに L_max=4 または L_max=8 の SS/PBCH ブロックについて、PBCH ペイロード ビットからサブキャリア オフセットk_SSBの MSB を組み込むことも含まれます。

% Parse the last 23 decoded BCH transport block bits into a MIB message.% The BCH transport block 'trblk' is the RRC message BCCH-BCH-Message,% consisting of a leading 0 bit and 23 bits corresponding to the MIB. The% leading bit signals the message type transmitted (MIB or empty sequence).mib = fromBits(MIB,trblk(2:end));% Do not parse leading bit% Create set of subcarrier spacings signaled by the 7th bit of the decoded% MIB, the set is different for FR1 (L_max=4 or 8) and FR2 (L_max=64)if(refBurst.L_max==64) commonSCSs = [60 120];elsecommonSCSs = [15 30];endinitialSystemInfo =结构();initialSystemInfo。NFrame = mib.systemFrameNumber*2^4 + bit2int(sfn4lsb,4); initialSystemInfo.SubcarrierSpacingCommon = commonSCSs(mib.subCarrierSpacingCommon + 1); initialSystemInfo.k_SSB = k_SSB + mib.ssb_SubcarrierOffset; initialSystemInfo.DMRSTypeAPosition = 2 + mib.dmrs_TypeA_Position; initialSystemInfo.PDCCHConfigSIB1 = info(mib.pdcch_ConfigSIB1); initialSystemInfo.CellBarred = mib.cellBarred; initialSystemInfo.IntraFreqReselection = mib.intraFreqReselection;% Display the MIB structuredisp(' BCH/MIB Content:') disp(initialSystemInfo);% Check if a CORESET for Type0-PDCCH common search space (CSS) is present,% according to TS 38.213 Section 4.1if~isCORESET0Present(refBurst.BlockPattern,initialSystemInfo.k_SSB) fprintf('CORESET 0 is not present (k_SSB > k_SSB_max).\n');returnend
BCH/MIB Content: NFrame: 0 SubcarrierSpacingCommon: 15 k_SSB: 0 DMRSTypeAPosition: 3 PDCCHConfigSIB1: [1x1 struct] CellBarred: 0 IntraFreqReselection: 0

全帯域幅での OFDM 復調

MIB が復元されると、受信機は共通のサブキャリア間隔と CORESET 0 をサポートする帯域幅を使用して、検出された SS ブロックを含むフレームを OFDM 復調します。受信機は、SSB の検出位置からのオフセットと TS 38.213 の Section 13 の Table 13-1 ~ 13-10 [5] で規定されている帯域幅を介する共通の numerology 内で、CORESET 0 の周波数リソースを決定します。周波数補正処理によって、OFDM リソース グリッドの中心と SS バーストの中心周波数が揃えられます。しかし、その中心と CORESET 0 の中心周波数とが必ずしも一致するわけではありません。次の図は、CORESET 0 の周波数リソース SSB と関連する PDCCH モニタリングとの関係を示しています。

SS バーストと異なり、制御チャネルとデータ チャネルは、その共通リソース ブロック (CRB) のラスターに周波数を合わせなければなりません。KSSB の値は、その CRB ラスターからの SSB の周波数オフセットを示しています。周波数補正処理で SSB の周波数を中心に揃えたので、k_SSBで決められた周波数シフトを適用して、OFDM 復調の前に、データ チャネルと制御チャネルをその CRB で揃えます。

if(refBurst.L_max==64) scsKSSB = initialSystemInfo.SubcarrierSpacingCommon;elsescsKSSB = 15;endk_SSB = initialSystemInfo.k_SSB; kFreqShift = k_SSB*scsKSSB*1e3; rxWaveform = rxWaveform.*exp(1i*2*pi*kFreqShift*(0:length(rxWaveform)-1)'/rxSampleRate);% Adjust timing offset to the frame originframeOffset = hTimingOffsetToFrame(refBurst,timingOffset,ssbIndex,rxSampleRate);% If the frame offset is negative, the frame of interest is incomplete. Add% leading zeros to the waveform to align the wavefom to the frameifframeOffset < 0 rxWaveform = [zeros(-frameOffset,size(rxWaveform,2));rxWaveform];elserxWaveform = rxWaveform(1+frameOffset:end,:);end% Determine the OFDM demodulation bandwidth using CORESET 0 bandwidthcset0Idx = initialSystemInfo.PDCCHConfigSIB1.controlResourceSetZero; scsCommon = initialSystemInfo.SubcarrierSpacingCommon; scsPair = [scsSSB scsCommon]; [csetNRB,~,csetFreqOffset] = hCORESET0Resources(cset0Idx,scsPair,minChannelBW,k_SSB);% Minimum bandwidth in RB that includes CORESET 0 in received waveform.c0 = csetFreqOffset+10*scsSSB/scsCommon;% CORESET frequency offset from carrier centernrb = 2*max(c0,csetNRB-c0);% Minimum number of RB to cover CORESET 0ifrxSampleRate < nrb*12*scsCommon*1e3 disp(['SIB1 recovery cannot continue. CORESET 0 resources are beyond '...'the frequency limits of the received waveform for the sampling rate configured.']);return;end% OFDM demodulate received waveform with common subcarrier spacingnSlot = 0; rxGrid = nrOFDMDemodulate(rxWaveform, nrb, scsCommon, nSlot,...'SampleRate',rxSampleRate,'CarrierFrequency',fPhaseComp);% Display OFDM resource grid and highlight strongest SS blockfigure; imagesc(abs(rxGrid(:,:,1))); axisxyxlabel('OFDM symbol'); ylabel('Subcarrier'); numFrames = floor(length(rxWaveform)/rxSampleRate/10e-3); sfns = sprintf('(%d...%d)',initialSystemInfo.NFrame, initialSystemInfo.NFrame+numFrames-1); title(['Received Resource Grid. System Frame Number: 'sfns]); highlightSSBlock(refBurst,ssbIndex,nrb,scsPair,kFreqShift)

PDCCH の復調と Downlink Control Information の復号化

CORESET/SS 内のシステム情報 DCI メッセージをブラインド サーチするため、受信機は以下の手順を実行します。

  • PDCCH モニタリングの判定と、制御情報を含む OFDM リソース グリッドの抽出。

  • CORESET 0、サーチ スペース、PDCCH の各構成。

  • Format 1_0 の DCI メッセージのブラインド サーチ。

受信機は、TS 38.213 の Table 13-11 と Table 13-12 [5] の説明に従い、スロットおよび検出した SS ブロックの位置からの OFDM シンボルのオフセットによって、PDCCH モニタリングを判定します。

[csetNRB,csetDuration,csetOffset,csetPattern] = hCORESET0Resources(cset0Idx,scsPair,minChannelBW,k_SSB); ssIdx = initialSystemInfo.PDCCHConfigSIB1.searchSpaceZero; [ssSlot,ssFirstSym,isOccasion] = hPDCCH0MonitoringOccasions(ssIdx,ssbIndex,scsPair,csetPattern,csetDuration,initialSystemInfo.NFrame);% PDCCH monitoring occasions associated to different SS blocks can be in% different frames. If there are no monitoring occasions in this frame,% there must be one in the next one.slotsPerFrame = 10*scsCommon/15;if~isOccasion [ssSlot,ssFirstSym,isOccasion] = hPDCCH0MonitoringOccasions(ssIdx,ssbIndex,scsPair,csetPattern,csetDuration,initialSystemInfo.NFrame+1); ssSlot = ssSlot+slotsPerFrame;end% For FR1, UE monitors PDCCH in the Type0-PDCCH CSS over two consecutive% slots for CORESET pattern 1ifcsetPattern == 1 monSlotsPerPeriod = 2;elsemonSlotsPerPeriod = 1;end% Calculate 1-based subscripts of the subcarriers and OFDM symbols for the% slots containing the PDCCH0 associated to the detected SS block in this% and subsequent 2-frame blockscsetSubcarriers = 12*(nrb-20*scsSSB/scsCommon)/2 - csetOffset*12 + (1:csetNRB*12); numRxSym = size(rxGrid,2); symbolsPerSlot = 14; numRxSlots = ceil(numRxSym/symbolsPerSlot); monSlots = ssSlot + (0:monSlotsPerPeriod-1)' + (0:2*slotsPerFrame:(numRxSlots-ssSlot-1)); monSlots = monSlots(:)'; monSymbols = monSlots*symbolsPerSlot + (1:symbolsPerSlot)'; monSymbols = monSymbols(:)';%去除监测超过波形lim象征itsmonSymbols(monSymbols > numRxSym) = [];% Check if search space is beyond end of waveformifisempty(monSymbols) disp('Search space slot is beyond end of waveform.');return;end% Extract slots containing strongest PDCCH from the received gridrxMonSlotGrid = rxGrid(csetSubcarriers,monSymbols,:);

CORESET、サーチ スペース、その他の PDCCH パラメーターを構成します。CORESET リソースとサーチ スペースは、TS 38.213 の Section 13 の Table 13-1 ~ 13-15 [5] に従って構成されます。CCE から REG へのインターリーブ マッピングのパラメーター (REGBundleSize = 6、InterleaverSize = 2、ShiftIndex = NCellID) は、TS 38.211 の Section 7.3.2.2 [3] に記載されています。CORESET 0 の場合、BWP は TS 38.212 の Section 7.3.1.0 [4] に記載されている CORESET のサイズになります。PDCCH スクランブル パラメーターは、TS 38.211 の Section 7.3.2.3 [3] に記載されているように、nRNTI = 0 と nID = NCellID になります。

pdcch = hPDCCH0Configuration(ssbIndex,initialSystemInfo,scsPair,ncellid,minChannelBW);% Configure the carrier to span the BWP (CORESET 0)c0Carrier = nrCarrierConfig; c0Carrier.SubcarrierSpacing = initialSystemInfo.SubcarrierSpacingCommon; c0Carrier.NStartGrid = pdcch.NStartBWP; c0Carrier.NSizeGrid = pdcch.NSizeBWP; c0Carrier.NSlot = pdcch.SearchSpace.SlotPeriodAndOffset(2); c0Carrier.NFrame = initialSystemInfo.NFrame; c0Carrier.NCellID = ncellid;

DCI メッセージを検索します。UE は、SI-RNTI を使用してすべてのアグリゲーション レベルごとに全 PDCCH 候補を監視し、適切な候補 (またはインスタンス) を識別することによって、受信した PDCCH シンボルをブラインドで復号化します。

% Specify DCI message with Format 1_0 scrambled with SI-RNTI (TS 38.212% Section 7.3.1.2.1)dci = DCIFormat1_0_SIRNTI(pdcch.NSizeBWP); disp(' -- Downlink control information message search in PDCCH -- '); siRNTI = 65535;% TS 38.321 Table 7.1-1dciCRC = true; mSlot = 0;% Loop over all monitoring slotswhile(mSlot < length(monSlots)) && dciCRC ~= 0 c0Carrier.NSlot = monSlots(mSlot+1);ifmonSlotsPerPeriod==2ifmod(mSlot,2) pdcch.SearchSpace.SlotPeriodAndOffset(2) = monSlots(2);elsepdcch.SearchSpace.SlotPeriodAndOffset(2) = monSlots(1);endend% Get PDCCH candidates according to TS 38.213 Section 10.1[pdcchInd,pdcchDmrsSym,pdcchDmrsInd] = nrPDCCHSpace(c0Carrier,pdcch); rxSlotGrid = rxMonSlotGrid(:,(1:symbolsPerSlot) + symbolsPerSlot*mSlot,:); rxSlotGrid = rxSlotGrid/max(abs(rxSlotGrid(:)));% Normalization of received RE magnitude% Loop over all supported aggregation levelsaLev = 1;while(aLev <= 5) && dciCRC ~= 0% Loop over all candidates at each aggregation level in SScIdx = 1; numCandidatesAL = pdcch.SearchSpace.NumCandidates(aLev);while(cIdx <= numCandidatesAL) && dciCRC ~= 0% Channel estimation using PDCCH DM-RS[hest,nVar,pdcchHestInfo] = nrChannelEstimate(rxSlotGrid,pdcchDmrsInd{aLev}(:,cIdx),pdcchDmrsSym{aLev}(:,cIdx));% Equalization and demodulation of PDCCH symbols[pdcchRxSym,pdcchHest] = nrExtractResources(pdcchInd{aLev}(:,cIdx),rxSlotGrid,hest); pdcchEqSym = nrEqualizeMMSE(pdcchRxSym,pdcchHest,nVar); dcicw = nrPDCCHDecode(pdcchEqSym,pdcch.DMRSScramblingID,pdcch.RNTI,nVar);% DCI message decodingpolarListLength = 8; [dcibits,dciCRC] = nrDCIDecode(dcicw,dci.Width,polarListLength,siRNTI);ifdciCRC == 0 disp([' Decoded PDCCH candidate #'num2str(cIdx)' at aggregation level 'num2str(2^(aLev-1))])endcIdx = cIdx + 1;endaLev = aLev+1;endmSlot = mSlot+1;endcIdx = cIdx-1; aLev = aLev-1; mSlot = mSlot-1; monSymbols = monSymbols(mSlot*symbolsPerSlot + (1:symbolsPerSlot));% Calculate RMS PDCCH EVMpdcchRef = nrPDCCH(double(dcicw<0),pdcch.DMRSScramblingID,pdcch.RNTI); evm = comm.EVM; pdcchEVMrms = evm(pdcchRef,pdcchEqSym);% Display calculated EVMdisp([' PDCCH RMS EVM: 'num2str(pdcchEVMrms,'%0.3f')'%']); disp([' PDCCH CRC: 'num2str(dciCRC)]);% Highlight CORESET 0/SS corresponding to strongest SSBbounding_box = @(y,x,h,w)rectangle('Position',[x+0.5 y-0.5 w h],'EdgeColor','r'); bounding_box(csetSubcarriers(1),monSymbols(1)+ssFirstSym-1,csetNRB*12,csetDuration); str = sprintf('CORESET 0/SS'); text(monSymbols(1)+ssFirstSym-7,csetSubcarriers(1)-20,0,str,'FontSize',10,'Color','w')ifdciCRC disp(' DCI decoding failed.');returnend% Plot received PDCCH constellation after equalizationfigure; plot(pdcchEqSym,'o'); xlabel('In-Phase'); ylabel('Quadrature') title('Equalized PDCCH Constellation'); m = max(abs([real(pdcchEqSym(:)); imag(pdcchEqSym(:))])) * 1.1; axis([-m m -m m]);% Display the OFDM grid of the slot containing strongest PDCCHfigure; imagesc(abs(rxSlotGrid(:,:,1))); axisxyxlabel('OFDM symbol'); ylabel('subcarrier'); title('Slot Containing Strongest PDCCH');% Highlight PDCCH in resource gridsubsPdcch = nrPDCCHSpace(c0Carrier,pdcch,'IndexStyle','Subs'); subsPdcch = double(subsPdcch{aLev}(:,:,cIdx)); x = min(subsPdcch(:,2))-1; X = max(subsPdcch(:,2))-x; y = min(subsPdcch(:,1)); Y = max(subsPdcch(:,1))-y+1; bounding_box(y,x,Y,X); str = sprintf(' PDCCH \n Aggregation Level: %d\n Candidate: %d',2.^(aLev-1),cIdx-1); text(x+X+1,y+Y/2,0,str,'FontSize',10,'Color','w')
-- Downlink control information message search in PDCCH -- Decoded PDCCH candidate #1 at aggregation level 8 PDCCH RMS EVM: 10.759% PDCCH CRC: 0

PDSCH の復調、DL-SCH の復号化、および SIB1 の抽出

最初のシステム情報ブロックを復元するために、受信機は以下の手順を実行します。

  • セル ID、BCH 情報、DCI を使用した PDSCH 構成の決定

  • PDSCH シンボルのチャネル推定、イコライズ、復調

  • DL-SCH の復号化と SIB1 の抽出

disp(' -- PDSCH demodulation and DL-SCH decoding -- ')% Build DCI message structuredci = fromBits(dci,dcibits);% Get PDSCH configuration from cell ID, BCH information, and DCI[pdsch,K_0] = hSIB1PDSCHConfiguration(dci,pdcch.NSizeBWP,initialSystemInfo.DMRSTypeAPosition,csetPattern);% For CORESET pattern 2, the gNodeB can allocate PDSCH in the next slot,% which is indicated by the slot offset K_0 signaled by DCI. For more% information, see TS 38.214 Table 5.1.2.1.1-4.c0Carrier.NSlot = c0Carrier.NSlot+K_0; symbolOffset = symbolsPerSlot*(mSlot+K_0); monSymbols = monSymbols+symbolOffset; rxSlotGrid = rxGrid(csetSubcarriers,monSymbols,:); rxSlotGrid = rxSlotGrid/max(abs(rxSlotGrid(:)));% Normalization of received RE magnitudeifK_0 > 0% Display the OFDM grid of the slot containing associated PDSCHfigure; imagesc(abs(rxSlotGrid(:,:,1))); axisxyxlabel('OFDM symbol'); ylabel('subcarrier'); title('Slot Containing PDSCH (Slot Offset K_0 = 1)');end% PDSCH channel estimation and equalization using PDSCH DM-RSpdschDmrsIndices = nrPDSCHDMRSIndices(c0Carrier,pdsch); pdschDmrsSymbols = nrPDSCHDMRS(c0Carrier,pdsch);
-- PDSCH demodulation and DL-SCH decoding --

シンボル位相補償とチャネル推定での搬送周波数の不一致の悪影響を補償するために、受信機 OFDM は、fPhaseComp周辺の検索帯域幅で搬送周波数のセットを使用して波形を復調します。DL-SCH の復号化が成功するか、最後の周波数に到達した時点で検索を終了します。等しいシンボル位相補償を生成する最小の検索帯域幅は、共通サブキャリア間隔が 15、30、60、120 kHz の場合、それぞれ 1920、3840、7680、15360 kHz になります。SIB1 の復号化に失敗し、イコライズされた PDSCH シンボルの歪みが大きく、回転したコンスタレーションになる場合は、検索帯域幅をこれらの値まで増やしてください。

mu = log2(scsCommon/15); bw = 2^mu*100;% Search bandwidth (kHz)freqStep = 2^mu;% Frequency step (kHz)freqSearch = -bw/2:freqStep:bw/2-freqStep; [~,fSearchIdx] = sort(abs(freqSearch));% Sort frequencies from centerfreqSearch = freqSearch(fSearchIdx);forfpc = fPhaseComp - kFreqShift + 1e3*freqSearch% OFDM demodulate received waveformnSlot = 0; rxGrid = nrOFDMDemodulate(rxWaveform, nrb, scsCommon, nSlot,...'SampleRate',rxSampleRate,'CarrierFrequency',fpc);% Extract monitoring slot from the received gridrxSlotGrid = rxGrid(csetSubcarriers,monSymbols,:); rxSlotGrid = rxSlotGrid/max(abs(rxSlotGrid(:)));% Normalization of received RE magnitude% Channel estimation and equalization of PDSCH symbols[hest,nVar,pdschHestInfo] = nrChannelEstimate(rxSlotGrid,pdschDmrsIndices,pdschDmrsSymbols); [pdschIndices,pdschIndicesInfo] = nrPDSCHIndices(c0Carrier,pdsch); [pdschRxSym,pdschHest] = nrExtractResources(pdschIndices,rxSlotGrid,hest); pdschEqSym = nrEqualizeMMSE(pdschRxSym,pdschHest,nVar);% PDSCH demodulationcw = nrPDSCHDecode(c0Carrier,pdsch,pdschEqSym,nVar);% Create and configure DL-SCH decoder with target code rate and% transport block sizedecodeDLSCH = nrDLSCHDecoder; Xoh_PDSCH = 0;% TS 38.214 Section 5.1.3.2tcr = hMCS(dci.ModulationCoding); NREPerPRB = pdschIndicesInfo.NREPerPRB; tbsLength = nrTBS(pdsch.Modulation,pdsch.NumLayers,length(pdsch.PRBSet),NREPerPRB,tcr,Xoh_PDSCH); decodeDLSCH.TransportBlockLength = tbsLength; decodeDLSCH.TargetCodeRate = tcr;% Decode DL-SCH[sib1bits,sib1CRC] = decodeDLSCH(cw,pdsch.Modulation,pdsch.NumLayers,dci.RedundancyVersion);ifsib1CRC == 0break;endend% Highlight PDSCH in resource gridsubsPdsch = double(nrPDSCHIndices(c0Carrier,pdsch,'IndexStyle','subscript')); x = min(subsPdsch(:,2))-1; X = max(subsPdsch(:,2))-x; y = min(subsPdsch(:,1)); Y = max(subsPdsch(:,1))-y+1; bounding_box(y,x,Y,X); str = sprintf('PDSCH (SIB1) \n Modulation: %s\n Code rate: %.2f',pdsch.Modulation,tcr); text(x+4,y+Y+60,0, str,'FontSize',10,'Color','w')% Plot received PDSCH constellation after equalizationfigure; plot(pdschEqSym,'o'); xlabel('In-Phase'); ylabel('Quadrature') title('Equalized PDSCH Constellation'); m = max(abs([real(pdschEqSym(:)); imag(pdschEqSym(:))])) * 1.1; axis([-m m -m m]);% Calculate RMS PDSCH EVM, including normalization of PDSCH symbols for any% offset between DM-RS and PDSCH powerpdschRef = nrPDSCH(c0Carrier,pdsch,double(cw{1}<0)); evm = comm.EVM; pdschEVMrms = evm(pdschRef,pdschEqSym/sqrt(var(pdschEqSym)));% Display PDSCH EVM and DL-SCH CRCdisp([' PDSCH RMS EVM: 'num2str(pdschEVMrms,'%0.3f')'%']); disp([' PDSCH CRC: 'num2str(sib1CRC)]);ifsib1CRC == 0 disp(' SIB1 decoding succeeded.');elsedisp(' SIB1 decoding failed.');end
PDSCH RMS EVM: 10.835% PDSCH CRC: 0 SIB1 decoding succeeded.

付録

この例で使用している補助関数は次のとおりです。

参考文献

  1. 3GPP TS 38.101-1. "NR; User Equipment (UE) radio transmission and reception; Part 1: Range 1 Standalone"3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  2. 3GPP TS 38.104. "NR; Base Station (BS) radio transmission and reception."3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

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

  4. 3GPP TS 38.212. "NR; Multiplexing and channel coding."3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  5. 3GPP TS 38.213. "NR; Physical layer procedures for control."3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  6. 3GPP TS 38.214. "NR; Physical layer procedures for data."3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  7. 3GPP TS 38.321. "NR; Medium Access Control (MAC) protocol specification."3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

ローカル関数

functionpresent = isCORESET0Present(ssbBlockPattern,kSSB)switchssbBlockPatterncase{'Case A','Case B','Case C'}% FR1kssb_max = 23;case{'Case D','Case E'}% FR2kssb_max = 11;endif(kSSB <= kssb_max) present = true;elsepresent = false;endendfunctiontimingOffset = hTimingOffsetToFrame(burst,offset,ssbIdx,rxSampleRate)% As the symbol lengths are measured in FFT samples, scale the symbol% lengths to account for the receiver sample rate. Non-integer delays% are approximated at the end of the process.scs = hSSBurstSubcarrierSpacing(burst.BlockPattern); ofdmInfo = nrOFDMInfo(1,scs,'SampleRate',rxSampleRate);% smallest FFT size for SCS-SRsrRatio = rxSampleRate/(scs*1e3*ofdmInfo.Nfft); symbolLengths = ofdmInfo.SymbolLengths*srRatio;% Adjust timing offset to the start of the SS block. This step removes% the extra offset introduced in the reference grid during PSS search,% which contained the PSS in the second OFDM symbol.offset = offset + symbolLengths(1);% Timing offset is adjusted so that the received grid starts at the% frame head i.e. adjust the timing offset for the difference between% the first symbol of the strongest SSB, and the start of the frameburstStartSymbols = hSSBurstStartSymbols(burst.BlockPattern,burst.L_max);% Start symbols in SSB numerologyssbFirstSym = burstStartSymbols(ssbIdx+1);% 0-based% Adjust for whole subframessymbolsPerSubframe = length(symbolLengths); subframeOffset = floor(ssbFirstSym/symbolsPerSubframe); samplesPerSubframe = sum(symbolLengths); timingOffset = offset - (subframeOffset*samplesPerSubframe);% Adjust for remaining OFDM symbols and round offset if not integersymbolOffset = mod(ssbFirstSym,symbolsPerSubframe); timingOffset = round(timingOffset - sum(symbolLengths(1:symbolOffset)));endfunctionhighlightSSBlock(refBurst,ssbIndex,commonNRB,scs,kFreqShift) scsSSB = scs(1); scsCommon = scs(2);% Determine frequency origin of the SSB in common numerologybounding_box = @(y,x,h,w)rectangle('Position',[x+0.5 y-0.5 w h],'EdgeColor','r'); scsRatio = scsSSB/scsCommon; ssbFreqOrig = 12*(commonNRB-20*scsRatio)/2+1+kFreqShift/(scsCommon*1e3);% Determine time origin of the SSB in common numerologyssbStartSymbols = hSSBurstStartSymbols(refBurst.BlockPattern,refBurst.L_max); ssbHeadSymbol = ssbStartSymbols(ssbIndex+1)/scsRatio; ssbTailSymbol = floor((ssbStartSymbols(ssbIndex+1)+4)/scsRatio)-1; bounding_box(ssbFreqOrig,ssbHeadSymbol,240*scsRatio,ssbTailSymbol-ssbHeadSymbol+1); str = sprintf('Strongest \n SSB: %d',ssbIndex); text(ssbHeadSymbol,ssbFreqOrig-20,0, str,'FontSize',10,'Color','w')end

関連するトピック