Этот пример демонстрирует, как создать форму волны, содержащую пакет сигнала синхронизации (пакет SS), передать форму волны через исчезающий канал с AWGN, и затем вслепую синхронизироваться с полученной формой волны, чтобы декодировать основной блок информации (MIB).
Прежде чем устройство Оборудования пользователя (UE) может связаться с сетью, оно должно выполнить поиск ячейки и процедуры отбора и получить начальную информацию о системе. Первые несколько шагов в том процессе получают синхронизацию системы координат, узнавая идентичность ячейки и декодируя Основной блок информации (MIB). Этот пример демонстрирует, как те шаги могут быть выполнены с 5G Toolbox™.
Фигура ниже показов основные шаги в цепи обработки.
Пакетная генерация: структура txBurst
создается, который конфигурирует пакет SS и функциональный hSSBurst
используется, чтобы создать сетку ресурса OFDM, содержащую пакет SS.
Развертка луча: сетка ресурса OFDM для пакета SS является beamformed на набор физических антенн передачи с каждым блоком SS/PBCH в пакете, имеющем различный beamforming вектор.
Канал распространения: переданная форма волны передается через модель канала распространения TDL.
AWGN: к Аддитивному Белому Гауссову шуму применяются получить антенны.
Получатель: Различные процессы синхронизации и демодуляции применяются к полученной форме волны для того, чтобы установить идентичность ячейки и декодировать Основной блок информации (MIB).
Фигура ниже показов обработка продвигается в получателе.
Эти шаги обработки объяснены подробно ниже.
Структура txBurst
создается, который конфигурирует пакет SS, включая настройку шаблона блоков SS/PBCH в пакете и содержимом Основного блока информации (MIB).
% Burst configuration related to the burst structure itself: txBurst.BlockPattern = 'Case B'; txBurst.SSBPeriodicity = 20; txBurst.NFrame = 4; txBurst.SSBTransmitted = [1 1 1 1 1 1 1 1]; txBurst.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); txBurst.SampleRate = carrierInfo.SamplingRate; K = carrierInfo.NSubcarriers; txBurst.FrequencyPointA = -K/2 * gnb.SubcarrierSpacing * 1e3; % Burst configuration related to MIB content: txBurst.DMRSTypeAPosition = 2; txBurst.PDCCHConfigSIB1 = 17; txBurst.CellBarred = 0; txBurst.IntraFreqReselection = 0; txBurst.SubcarrierSpacingCommon = carrierInfo.SubcarrierSpacing; txBurst.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; channel.SampleRate = txBurst.SampleRate; % Configure SNR for AWGN SNRdB = 10;
Функциональный hSSBurst
используется, чтобы создать сетку ресурса OFDM, содержащую пакет SS. Сетка ресурса измерена таким образом, что модулируемая форма волны соответствующего OFDM имеет частоту дискретизации, равную заданному txBurst.SampleRate
, который позволяет ему быть легко добавленным к форме волны, несущей PDCCH и PDSCH. Объединение области времени форм волны требуется в случае, что блок SS/PBCH и PDCCH/PDSCH имеют различные интервалы поднесущей.
% Display burst disp(txBurst); % Create and display burst information txBurstInfo = hSSBurstInfo(txBurst); disp(txBurstInfo); % Create burst resource grid [~,txBurstGrid] = hSSBurst(txBurst);
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: [24x1 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: [240x1 double] OccupiedSymbols: [8x4 double] Windowing: 4
Сетка ресурса 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(txBurstGrid) ntxants]); blockSubcarriers = txBurstInfo.OccupiedSubcarriers; for ssb = 1:length(txBurstInfo.SSBIndex) blockSymbols = txBurstInfo.OccupiedSymbols(ssb,:); block = txBurstGrid(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(txBurstInfo.OccupiedSymbols(:))+1,:); txOfdmConfig.SubcarrierSpacing = txBurstInfo.SubcarrierSpacing; txOfdmConfig.NRB = txBurstInfo.NRB; txOfdmConfig.CyclicPrefix = txBurstInfo.CyclicPrefix; txOfdmConfig.Windowing = 0; [txWaveform,txOfdmInfo] = hOFDMModulate(txOfdmConfig,beamformedGrid);
Переданная форма волны передается через модель канала распространения TDL, приводящую к полученной форме волны для сконфигурированного количества антенн.
rxWaveform = channel(txWaveform);
К аддитивному Белому Гауссову шуму применяются получить антенны.
rng('default');
rxWaveform = awgn(rxWaveform,SNRdB,-10*log10(double(txOfdmInfo.Nfft)));
Для того, чтобы синхронизировать и демодулировать полученную форму волны, следующая информация необходима:
Состав блока SS (Кэз А... Э): UE будет знать, какие составы блока должны искаться на основе NR операционная полоса, см. таблицы 5.4.3.3-1 и 5.4.3.3-2 TS 38.104 [1]. Состав блока SS определяет интервал поднесущей блоков SS/PBCH.
Частота дискретизации формы волны: требуемый для демодуляции OFDM полученной формы волны.
, количество SS/PBCH блокируется в пакете: UE будет знать значение на основе состава блока SS и NR операционная полоса, Раздел TS 38.213 4.1 [2] описывает набор блоков SS/PBCH в пакете в каждом случае. используется в вычислении параметров для последовательностей PBCH DM-RS и дескремблирования PBCH. Эти параметры являются функцией индекса блока SS/PBCH, видят Разделы TS 38.211 7.3.3.1 и 7.4.1.4.1 [2].
% Configure necessary burst parameters burst.BlockPattern = txBurst.BlockPattern; burst.SampleRate = txBurst.SampleRate; L_max = numel(txBurst.SSBTransmitted); burst.SSBTransmitted = ones(1,L_max); % Create burst information structure and OFDM information from configured % burst parameters burstInfo = hSSBurstInfo(burst); ofdmConfig.SubcarrierSpacing = burstInfo.SubcarrierSpacing; ofdmConfig.NRB = burstInfo.NRB; ofdmConfig.CyclicPrefix = burstInfo.CyclicPrefix; ofdmInfo = hOFDMInfo(ofdmConfig);
Поиск PSS выполняется, который состоит из корреляции полученной формы волны (через все блоки SS/PBCH) с каждой из трех возможных последовательностей PSS и извлечения самого сильного пика корреляции. Блок SS/PBCH с самым сильным пиком корреляции указывает, какой луч в развертке луча был самым эффективным при направлении сигнала к получателю. Крупное смещение частоты полученной формы волны также определяется, путем создания различных гипотез о смещении частоты, исправления для каждого смещения и нахождения смещения, которое дает самую сильную корреляцию.
pssIndices = nrPSSIndices; pssGrid = zeros([240 4]); refGrid = zeros([ofdmInfo.NSubcarriers ofdmInfo.SymbolsPerSlot]); k = burstInfo.OccupiedSubcarriers; fstep = burstInfo.SubcarrierSpacing * 1e3 / 2; % half subcarrier fshifts = (-6:6) * fstep; peak_value = zeros(numel(fshifts),3); peak_index = zeros(numel(fshifts),3); t = (0:size(rxWaveform,1)-1).' / burst.SampleRate; for fIdx = 1:numel(fshifts) coarseFrequencyOffset = fshifts(fIdx); rxWaveformFreqCorrected = rxWaveform .* exp(-1i*2*pi*coarseFrequencyOffset*t); for NID2 = [0 1 2] pssRef = nrPSS(NID2); pssGrid(pssIndices) = pssRef; refGrid(k,2:5) = pssGrid; nSlot = 0; [~,corr] = nrTimingEstimate(rxWaveformFreqCorrected,ofdmConfig.NRB,ofdmConfig.SubcarrierSpacing,nSlot,refGrid,'CyclicPrefix',ofdmConfig.CyclicPrefix); corr = sum(abs(corr),2); [peak_value(fIdx,NID2+1),peak_index(fIdx,NID2+1)] = max(corr); peak_index(fIdx,NID2+1) = peak_index(fIdx,NID2+1) + ofdmInfo.SymbolLengths(1); end end % Plot PSS correlations figure; hold on; plot(fshifts/1e3,peak_value); title('PSS Correlations versus Frequency Offset'); ylabel('Magnitude'); xlabel('Frequency Offset (kHz)'); % Determine NID2 and coarse frequency offset by finding the strongest % correlation [fIdx,NID2] = find(peak_value==max(peak_value(:))); coarseFrequencyOffset = fshifts(fIdx); NID2 = NID2 - 1; % Apply coarse frequency correction rxWaveform = rxWaveform .* exp(-1i*2*pi*coarseFrequencyOffset*t); % Plot selected NID2 plot(coarseFrequencyOffset/1e3,peak_value(fIdx,NID2+1),'kx','LineWidth',2,'MarkerSize',8); lgd = legend; lgd.Interpreter = 'latex'; legends = "$N_{ID}^{(2)}$ = " + num2cell(0:2); legend([legends "coarse $\Delta_f$ = " + num2str(coarseFrequencyOffset) + ", $N_{ID}^{(2)}$ = " + num2str(NID2)],'Location','East'); % Determine timing offset offset = peak_index(fIdx,NID2+1) - 1;
Смещение синхронизации для самой сильной корреляции последовательности PSS может использоваться, чтобы синхронизировать форму волны вовремя. Затем прекрасная оценка смещения частоты может быть вычислена путем выполнения корреляции между циклическим префиксом каждого символа OFDM в SSB и соответствующими полезными частями символов OFDM. Фаза этой корреляции пропорциональна смещению частоты в форме волны.
% Perform fine frequency offset estimation using CP correlation across % the 4 OFDM symbols of the SSB fineFrequencyOffset = frequencyOffsetSSB(rxWaveform(1+offset:end,:),ofdmInfo); % Apply fine frequency correction rxWaveform = rxWaveform .* exp(-1i*2*pi*fineFrequencyOffset*t); % 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 с лучшим ОСШ определяет LSBs индекса блока SS/PBCH, требуемого для PBCH борющаяся инициализация.
% Calculate PBCH DM-RS indices dmrsIndices = nrPBCHDMRSIndices(ncellid); % Perform channel estimation using DM-RS symbols for each possible DM-RS % sequence and estimate the SNR dmrsEst = zeros(1,8); for ibar_SSB = 0:7 refGrid = zeros([240 4]); refGrid(dmrsIndices) = nrPBCHDMRS(ncellid,ibar_SSB); [hest,nest] = nrChannelEstimate(rxGrid,refGrid,'CyclicPrefix',ofdmConfig.CyclicPrefix,'AveragingWindow',[0 1]); dmrsEst(ibar_SSB+1) = 10*log10(mean(abs(hest(:).^2)) / nest); end % Plot PBCH DM-RS SNRs figure; 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 SNR 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(["SNRs" "$\overline{i}_{SSB}$ = " + num2str(ibar_SSB)]);
Теперь, когда последовательность PBCH DM-RS известна, оценка канала для блока SS/PBCH может быть создана путем оценки канала в каждом месте элемента ресурса PBCH DM-RS и интерполяции через блок SS/PBCH. SSS также используется, чтобы помочь оценке канала. Оценка аддитивного шума на PBCH DM-RS / SSS также выполняется.
refGrid = zeros([240 4]); refGrid(dmrsIndices) = nrPBCHDMRS(ncellid,ibar_SSB); refGrid(sssIndices) = nrSSS(ncellid); [hest,nest] = nrChannelEstimate(rxGrid,refGrid,'CyclicPrefix',ofdmConfig.CyclicPrefix,'AveragingWindow',[0 1]);
Поднесущие, сопоставленные с 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(pbchRef,pbchEq); % Display calculated EVM disp(['RMS PBCH EVM = ' num2str(evm_rms,'%0.3f') '%']);
RMS PBCH EVM = 28.477%
Битные оценки 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
Этот пример использует следующие функции помощника:
3GPP TS 38.104. "NR; передача радио Базовой станции (BS) и прием (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.213. "NR; процедуры Физического уровня для управления (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
function frequencyOffset = frequencyOffsetSSB(waveform,ofdmInfo) % Get 'Lsym', the number of time domain samples in an OFDM symbol, % which is the sum of 'Lcp' and 'Lu', the number of cyclic prefix % samples and useful samples respectively Lcp = ofdmInfo.CyclicPrefixLengths(2); Lu = ofdmInfo.Nfft; Lsym = Lcp + Lu; % Multiply the waveform by itself delayed by Lu samples and conjugated delayed = [zeros(Lu,size(waveform,2)); waveform(1:end-Lu,:)]; cpProduct = waveform .* conj(delayed); % Apply a moving sum filter with a window size equal to the CP length cpXCorr = filter(ones([Lcp 1]),1,cpProduct); % Moving sum over 4 OFDM symbols (i.e. the size of the SS block) y = cpXCorr; cpXCorrDelayed = cpXCorr; for k = 1:3 cpXCorrDelayed = [zeros(Lsym,size(waveform,2)); cpXCorrDelayed(1:end-Lsym,:)]; y = y + cpXCorrDelayed; end % Extract the correlation peak, average over the receive antennas, % then compute the phase and corresponding frequency offset cpCorrIndex = (Lsym * 4) + 1; frequencyOffset = ofdmInfo.SubcarrierSpacing * 1e3 * angle(mean(y(cpCorrIndex,:))) / (2*pi); end
nrBCH
| nrBCHDecode
| nrExtractResources
| nrPBCH
| nrPBCHDMRS
| nrPBCHDecode
| nrPSS
| nrSSS