Этот пример демонстрирует, как создать форму волны, содержащую пакет сигнала синхронизации (пакет SS), передать форму волны через исчезающий канал с AWGN, и затем вслепую синхронизироваться с полученной формой волны, чтобы декодировать основной блок информации (MIB).
Прежде чем Пользовательский терминал (UT) может связаться с сетью, это должно выполнить поиск ячейки и процедуры отбора и получить начальную информацию о системе. Первые несколько шагов в том процессе получают синхронизацию кадра, узнавая идентичность ячейки и декодируя Основной блок информации (MIB). Этот пример демонстрирует, как те шаги могут быть выполнены с 5G Toolbox (TM).
Фигура ниже показов основные шаги в цепочке обработки.

Пакетная генерация: структура burst создается, который конфигурирует пакет SS и функциональный hSSBurst, используется, чтобы создать сетку ресурса OFDM, содержащую пакет SS.
Развертка луча: сетка ресурса OFDM для пакета SS является beamformed на набор физических антенн передачи с каждым блоком SS/PBCH в пакете, имеющем различный beamforming вектор.
Канал распространения: переданная форма волны передается через модель канала распространения TDL.
AWGN: к Аддитивному Белому Гауссову Шуму применяются получить антенны.
Получатель: Различные процессы синхронизации и демодуляции применяются к полученной форме волны в порядке установить идентичность ячейки и декодировать Основной блок информации (MIB).
Фигура ниже показов обработка продвигается в получателе.

Эти шаги обработки объяснены подробно ниже.
burst структуры создается, который конфигурирует пакет SS, включая настройку шаблона блоков SS/PBCH в пакете и содержимом Основного блока информации (MIB).
% Burst configuration related to the burst structure itself: burst.BlockPattern = 'Case B'; burst.SSBPeriodicity = 20; burst.NFrame = 4; burst.SSBTransmitted = [1 1 1 1 1 1 1 1]; burst.NCellID = 102; % Burst configuration related to carrier (10 MHz, see TS 38.104 Table % 5.3.2-1): gnb.SubcarrierSpacing = 15; gnb.NRB = 52; gnb.CyclicPrefix = 'Normal'; carrierInfo = hOFDMInfo(gnb); burst.SampleRate = carrierInfo.SamplingRate; K = carrierInfo.NSubcarriers; burst.FrequencyPointA = -K/2 * gnb.SubcarrierSpacing * 1e3; % Burst configuration related to MIB content: burst.DMRSTypeAPosition = 2; burst.PDCCHConfigSIB1 = 17; burst.CellBarred = 0; burst.IntraFreqReselection = 0; burst.SubcarrierSpacingCommon = carrierInfo.SubcarrierSpacing; burst.DisplayBurst = true;
Канал распространения Коснувшейся строки задержки (TDL) channel сконфигурирован, а также ОСШ для AWGN, добавленного в получателе.
% Configure number of transmit and receive antennas ntxants = 8; nrxants = 2; % Configure channel velocity = 30.0; fc = 4e9; c = physconst('lightspeed'); fd = (velocity*1000/3600)/c*fc; channel = nrTDLChannel; channel.Seed = 24; channel.DelayProfile = 'TDL-C'; channel.DelaySpread = 300e-9; channel.MaximumDopplerShift = fd; channel.MIMOCorrelation = 'Medium'; channel.Polarization = 'Cross-Polar'; channel.NumTransmitAntennas = ntxants; channel.NumReceiveAntennas = nrxants; % Configure SNR for AWGN SNRdB = 10;
Функциональный hSSBurst используется, чтобы создать сетку ресурса OFDM, содержащую пакет SS. Сетка ресурса измерена таким образом, что модулируемая форма волны соответствующего OFDM имеет частоту дискретизации, равную заданному burst.SampleRate, который позволяет ему быть легко добавленным к форме волны, несущей PDCCH и PDSCH. Объединение области времени форм волны требуется в случае, что блок SS/PBCH и PDCCH/PDSCH имеют различные интервалы поднесущей.
% Display burst disp(burst); % Create and display burst information burstInfo = hSSBurstInfo(burst); disp(burstInfo); % Create burst resource grid [~,burstGrid] = hSSBurst(burst);
BlockPattern: 'Case B'
SSBPeriodicity: 20
NFrame: 4
SSBTransmitted: [1 1 1 1 1 1 1 1]
NCellID: 102
SampleRate: 15360000
FrequencyPointA: -4680000
DMRSTypeAPosition: 2
PDCCHConfigSIB1: 17
CellBarred: 0
IntraFreqReselection: 0
SubcarrierSpacingCommon: 15
DisplayBurst: 1
SubcarrierSpacing: 30
NCRB_SSB: 6
k_SSB: 0
FrequencyOffsetSSB: 0
MIB: [24×1 double]
L: 8
SSBIndex: [0 1 2 3 4 5 6 7]
i_SSB: [0 1 2 3 4 5 6 7]
ibar_SSB: [0 1 2 3 4 5 6 7]
SampleRate: 15360000
Nfft: 512
NRB: 36
CyclicPrefix: 'Normal'
OccupiedSubcarriers: [240×1 double]
OccupiedSymbols: [8×4 double]

Сетка ресурса OFDM для пакета SS является beamformed на набор физических антенн передачи с каждым блоком SS/PBCH в пакете, имеющем различный beamforming вектор. beamformed OFDM сетка ресурса является затем OFDM, модулируемый, чтобы дать форму волны области времени.
% Configure beamforming weights W = fft(eye(ntxants)) / sqrt(ntxants); % Beamform the OFDM symbols corresponding to each burst beamformedGrid = zeros([size(burstGrid) ntxants]); blockSubcarriers = burstInfo.OccupiedSubcarriers; for ssb = 1:length(burstInfo.SSBIndex) blockSymbols = burstInfo.OccupiedSymbols(ssb,:); block = burstGrid(blockSubcarriers,blockSymbols); Wssb = W(mod(ssb-1,ntxants)+1,:); beamformedBlock = reshape(block(:) * Wssb,[size(block) ntxants]); beamformedGrid(blockSubcarriers,blockSymbols,:) = beamformedBlock; end % Perform OFDM modulation beamformedGrid = beamformedGrid(:,1:max(burstInfo.OccupiedSymbols(:))+1,:); ofdmConfig.SubcarrierSpacing = burstInfo.SubcarrierSpacing; ofdmConfig.NRB = burstInfo.NRB; ofdmConfig.CyclicPrefix = burstInfo.CyclicPrefix; ofdmConfig.Windowing = 0; [burstWaveform,ofdmInfo] = hOFDMModulate(ofdmConfig,beamformedGrid);
Переданная форма волны передается через модель канала распространения TDL, приводящую к полученной форме волны для сконфигурированного количества антенн.
rxWaveform = channel(burstWaveform);
К аддитивному Белому Гауссову Шуму применяются получить антенны.
rng('default');
rxWaveform = awgn(rxWaveform,SNRdB,-10*log10(double(ofdmInfo.Nfft)));
Поиск PSS выполняется, который состоит из корреляции полученной формы волны (через все блоки SS/PBCH) с каждой из трех возможных последовательностей PSS и извлечения самого сильного пика корреляции. Блок SS/PBCH с самым сильным пиком корреляции указывает, какой луч в развертке луча был самым эффективным при направлении сигнала к получателю.
pssIndices = nrPSSIndices; pssGrid = zeros([240 4]); refGrid = zeros([ofdmInfo.NSubcarriers ofdmInfo.SymbolsPerSlot]); k = burstInfo.OccupiedSubcarriers; l = burstInfo.OccupiedSymbols(1,:); figure; hold on; peak_value = zeros(1,3); peak_index = zeros(1,3); for NID2 = [0 1 2] pssRef = nrPSS(NID2); pssGrid(pssIndices) = pssRef; refGrid(k,l) = pssGrid; refWaveform = hOFDMModulate(ofdmConfig,refGrid); refWaveform = refWaveform(refWaveform~=0); corr = zeros(size(rxWaveform)); for r = 1:size(rxWaveform,2) antcorr = xcorr(rxWaveform(:,r),refWaveform); corr(:,r) = antcorr(size(rxWaveform,1):end); end corr = sum(abs(corr),2); [peak_value(NID2+1),peak_index(NID2+1)] = max(corr); plot(corr); end % Plot PSS correlations axis([1 length(rxWaveform(:,1)) 0 max(peak_value)*1.1]); title('PSS Correlations (time domain)'); ylabel('Magnitude'); xlabel('Sample Index'); % Determine NID2 by finding the strongest correlation NID2 = find(peak_value==max(peak_value)) - 1; % Determine timing offset offset = peak_index(NID2+1) - 1; % Plot selected NID2 plot(offset+1,peak_value(NID2+1),'kx','LineWidth',2,'MarkerSize',8); lgd = legend; lgd.Interpreter = 'latex'; legends = "$N_{ID}^{(2)}$ = " + num2cell(0:2); legend([legends "$N_{ID}^{(2)}$ = " + num2str(NID2)]); % Extract strongest burst offset = offset - ofdmInfo.SymbolLengths(1); rxGrid = hOFDMDemodulate(ofdmConfig,rxWaveform(1+offset:end,:)); rxGrid = rxGrid(burstInfo.OccupiedSubcarriers,2:5,:);

Синхронизация пика корреляции PSS используется, чтобы синхронизировать форму волны, и демодуляция OFDM выполняется. Поднесущие, сопоставленные с SSS, извлекаются и коррелируются с каждой возможной последовательностью SSS. Индексы самого сильного PSS и последовательностей SSS объединены, чтобы дать идентичность ячейки физического уровня, которая требуется для обработки PBCH и PBCH DM-RS.
% Extract the received SSS symbols from the SS/PBCH block sssIndices = nrSSSIndices; sssRx = nrExtractResources(sssIndices,rxGrid); % Correlate received SSS symbols with each possible SSS sequence sssEst = zeros(1,336); for NID1 = 0:335 ncellid = (3*NID1) + NID2; sssRef = nrSSS(ncellid); sssEst(NID1+1) = sum(abs(mean(sssRx .* conj(sssRef),1)).^2); end % Plot SSS correlations figure; 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 correlation NID1 = find(sssEst==max(sssEst)) - 1; % Plot selected NID1 hold on; plot(NID1,max(sssEst),'kx','LineWidth',2,'MarkerSize',8); lgd = legend; lgd.Interpreter = 'latex'; legend(["correlations" "$N_{ID}^{(1)}$ = " + num2str(NID1)]); % Form overall cell identity from NID1 and NID2 ncellid = (3*NID1) + NID2;

В процессе, подобном поиску SSS, поднесущие, соответствующие PBCH DM-RS, извлекаются и коррелируются с каждой возможной последовательностью PBCH DM-RS. Индекс самого сильного PBCH DM-RS определяет LSBs индекса блока SS/PBCH, требуемого для PBCH борющаяся инициализация.
% Extract the received PBCH DM-RS symbols from the SS/PBCH block dmrsIndices = nrPBCHDMRSIndices(ncellid); [dmrsRx,dmrsRxIndices] = nrExtractResources(dmrsIndices,rxGrid); % Correlate received DM-RS symbols with each possible DM-RS sequence dmrsEst = zeros(1,8); for ibar_SSB = 0:7 dmrsRef = nrPBCHDMRS(ncellid,ibar_SSB); dmrsEst(ibar_SSB+1) = sum(abs(mean(dmrsRx .* conj(dmrsRef),1)).^2); end % Plot PBCH DM-RS correlations figure; stem(0:7,dmrsEst,'o'); title('PBCH DM-RS Correlations (frequency domain)'); xlabel('$\overline{i}_{SSB}$','Interpreter','latex'); xticks(0:7); ylabel('Magnitude'); axis([-1 8 0 max(dmrsEst)*1.1]); % Record ibar_SSB for the strongest correlation ibar_SSB = find(dmrsEst==max(dmrsEst)) - 1; % Plot selected ibar_SSB hold on; plot(ibar_SSB,max(dmrsEst),'kx','LineWidth',2,'MarkerSize',8); lgd = legend; lgd.Interpreter = 'latex'; legend(["correlations" "$\overline{i}_{SSB}$ = " + num2str(ibar_SSB)]);

Теперь, когда последовательность PBCH DM-RS известна, оценка канала для блока SS/PBCH может быть создана путем оценки канала в каждом месте элемента ресурса PBCH DM-RS и интерполяции через блок SS/PBCH. Оценка аддитивного шума на PBCH DM-RS также выполняется.
% Channel estimation, using linear interpolation of the PBCH DM-RS dmrsRef = nrPBCHDMRS(ncellid,ibar_SSB); dmrsSubs = double(nrPBCHDMRSIndices(ncellid,'IndexStyle','subscript')); hest = zeros([240 4 nrxants 1]); [l_hest,k_hest] = meshgrid(1:size(hest,2),1:size(hest,1)); dmrsEsts = dmrsRx .* conj(dmrsRef); for r = 1:nrxants f = scatteredInterpolant(dmrsSubs(:,2),dmrsSubs(:,1),dmrsEsts(:,r)); hest(:,:,r) = f(l_hest,k_hest); end % Noise estimation, based on the difference between the PBCH DM-RS in % symbols 2 and 4 (1-based) of the SS/PBCH block. This technique assumes % that the channel itself does not change between the two symbols dmrsEstsSym2 = dmrsEsts(dmrsSubs(:,2)==2,:); dmrsEstsSym4 = dmrsEsts(dmrsSubs(:,2)==4,:); dmrsEstsSym2and4 = [dmrsEstsSym2(:) dmrsEstsSym4(:)]; dmrsNoise = mean(dmrsEstsSym2and4,2) - dmrsEstsSym2and4; nest = var(dmrsNoise(:)) * 2;
Поднесущие, сопоставленные с PBCH, извлечены и канал, и шумовые оценки используются, чтобы выполнить коррекцию MMSE. Компенсируемые символы PBCH затем демодулируются и дескремблированы, чтобы дать битные оценки для закодированного блока BCH.
% Extract the received PBCH symbols from the SS/PBCH block [pbchIndices,pbchIndicesInfo] = nrPBCHIndices(ncellid); pbchRx = nrExtractResources(pbchIndices,rxGrid); % Plot received PBCH constellation before equalization figure; plot(pbchRx,'o'); title('Received PBCH constellation'); m = max(abs([real(pbchRx(:)); imag(pbchRx(:))])) * 1.1; axis([-m m -m m]); % 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=4, or the 3 LSBs % for L=8 or 64 if (burstInfo.L==4) v = mod(ibar_SSB,4); else v = ibar_SSB; end ssbIndex = v; % PBCH equalization and CSI calculation pbchHest = 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 equalization figure; plot(pbchEq,'o'); title('Equalized PBCH constellation'); m = max(abs([real(pbchEq(:)); imag(pbchEq(:))])) * 1.1; axis([-m m -m m]); % PBCH demodulation pbchBits = nrPBCHDecode(pbchEq,ncellid,v,nest); % Calculate RMS PBCH EVM pbchRef = nrPBCH(pbchBits<0,ncellid,v); evm = comm.EVM; evm_rms = evm(pbchEq,pbchRef); % Display calculated EVM disp(['RMS PBCH EVM = ' num2str(evm_rms,'%0.3f') '%']);
RMS PBCH EVM = 32.425%


Битные оценки BCH взвешиваются с Информацией о состоянии канала (CSI) от эквалайзера MMSE затем, декодирование BCH выполняется, состоя из восстановления уровня, полярного декодирования, декодирования CRC, дескремблирования и разделения 24 транспортных битов блока BCH от 8 дополнительных связанных с синхронизацией битов полезной нагрузки.
% Apply CSI pbchBits = 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=64, 3 MSBs of the SS/PBCH block index % for L=4 or 8, A+5 is the MSB of the subcarrier offset k_SSB polarListLength = 8; [~,err,trblk,sfn4lsb,nHalfFrame,msbidxoffset] = ... nrBCHDecode(pbchBits,polarListLength,burstInfo.L,ncellid); % Use 'msbidxoffset' value to set bits of 'k_SSB' or 'ssbIndex', depending % on the number of SS/PBCH blocks in the burst if (burstInfo.L==64) ssbIndex = ssbIndex + (bi2de(msbidxoffset.','left-msb') * 8); k_SSB = 0; else k_SSB = msbidxoffset * 16; end % Display the BCH CRC disp(['BCH CRC = ' num2str(err)]); % Displaying the SSB index disp(['SSB index = ' num2str(ssbIndex)]);
BCH CRC = 0 SSB index = 1
Наконец декодируемые транспортные биты блока BCH 24 анализируются в структуру, которая представляет поля сообщения MIB. Это включает воссоздание 10-битного Системного номера кадра (SFN) NFrame от 6 MSBs в MIB и 4 LSBs в битах полезной нагрузки PBCH. Это также включает слияние MSB смещения поднесущей k_SSB от битов полезной нагрузки PBCH в случае L=4 или 8 блоков SS/PBCH на пакет.
% Create set of subcarrier spacings signaled by the 7th bit of the decoded % MIB, the set is different for FR1 (L=4 or 8) and FR2 (L=64) if (burstInfo.L==64) commonSCSs = [60 120]; else commonSCSs = [15 30]; end % Create a structure of MIB fields from the decoded MIB bits. The BCH % transport block 'trblk' is the RRC message BCCH-BCH-Message, consisting % of a leading 0 bit then 23 bits corresponding to the MIB mib.NFrame = bi2de([trblk(2:7); sfn4lsb] .','left-msb'); mib.SubcarrierSpacingCommon = commonSCSs(trblk(8) + 1); mib.k_SSB = k_SSB + bi2de(trblk(9:12).','left-msb'); mib.DMRSTypeAPosition = 2 + trblk(13); mib.PDCCHConfigSIB1 = bi2de(trblk(14:21).','left-msb'); mib.CellBarred = trblk(22); mib.IntraFreqReselection = trblk(23); % Display the MIB structure disp(mib);
NFrame: 4
SubcarrierSpacingCommon: 15
k_SSB: 0
DMRSTypeAPosition: 2
PDCCHConfigSIB1: 17
CellBarred: 0
IntraFreqReselection: 0
nrBCH | nrBCHDecode | nrExtractResources | nrPBCH | nrPBCHDMRS | nrPBCHDecode | nrPSS | nrSSS