Этот пример демонстрирует, как создать форму волны, содержащую пакет сигнала синхронизации (пакет 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