Процедуры синхронизации NR

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

AWGN

К аддитивному Белому Гауссову шуму применяются получить антенны.

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 полученной формы волны.

  • $L_{max}$, количество SS/PBCH блокируется в пакете: UE будет знать значение$L_{max}$ на основе состава блока SS и NR операционная полоса, Раздел TS 38.213 4.1 [2] описывает набор блоков SS/PBCH в пакете в каждом случае.$L_{max}$ используется в вычислении параметров для последовательностей 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 и крупный поиск частоты

Поиск 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,:);

Поиск SSS

Синхронизация пика корреляции 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;

Поиск PBCH DM-RS

В процессе, похожем на поиск 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 и SSS

Теперь, когда последовательность 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

Поднесущие, сопоставленные с 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

Битные оценки 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

Парсинг MIB

Наконец декодируемые транспортные биты блока 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

Приложение

Этот пример использует следующие функции помощника:

Выбранная библиография

  1. 3GPP TS 38.104. "NR; передача радио Базовой станции (BS) и прием (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

  2. 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

Смотрите также

Объекты

Функции

Похожие темы