Поиск ячейки, MIB и восстановление SIB1

В этом примере показано, как LTE Toolbox™ может использоваться, чтобы полностью синхронизировать, демодулировать и декодировать живой сигнал eNodeB. Прежде чем Оборудование пользователя (UE) может связаться с сетью, это должно выполнить поиск ячейки и процедуры отбора и получить начальную информацию о системе. Это включает паз получения и синхронизацию системы координат, обнаружение идентичность ячейки и декодирование Основного блока информации (MIB) и Системных Блоков информации (РОДСТВЕННИКИ). Этот пример демонстрирует этот процесс и декодирует MIB и SIB1, первый из Системных Блоков информации. Чтобы декодировать MIB и SIB1, всесторонний получатель требуется, способен к демодуляции и декодированию большинства нисходящих каналов и сигналов.

Введение

Для того, чтобы связаться с сетью, UE должен получить некоторую информацию о базовой системе. Это несут MIB и РОДСТВЕННИКИ. MIB несет самую существенную информацию о системе:

  • Системная пропускная способность

  • Системный номер системы координат (SFN)

  • Физический гибридный автоматический повторный запрос (HARQ) канал индикатора (PHICH) настройка

MIB несут на Канале телевизионного вещания (BCH), сопоставленный в Физический Канал телевизионного вещания (PBCH). Это передается с фиксированной схемой кодирования и модуляции и может декодироваться после процедуры поиска первичной клетки. С информацией, полученной из MIB, UE может теперь декодировать Индикатор формата управления (CFI), который указывает на Физический Нисходящий Канал Управления (PDCCH) длина. Это позволяет PDCCH декодироваться и разыскиваться сообщения Нисходящей управляющей информации (DCI). CRC сообщения DCI замаскировал с Радиосетью информации о Системе, Временный Идентификатор (SI-RNTI) указывает, что SIB несут в том же подкадре. РОДСТВЕННИКИ передаются в Широковещательном Канале Управления (BCCH) логический канал. Обычно сообщения BCCH несут на Нисходящем Разделяемом Канале (DL-SCH) и передают на Физическом Нисходящем Разделяемом Канале (PDSCH). Формат и распределение ресурсов передачи PDSCH обозначаются сообщением DCI на PDCCH.

Этот пример декодирует MIB и SystemInformationBlockType1 (SIB1). Последний передается, чтобы задать планирование другой информации о системе, наряду с аспектами идентичности ячейки, такими как идентичность Мобильной сети общественной земли (PLMN). Несмотря на то, что SIB1 передается в фиксированном расписании, распределение ресурсов PDSCH, несущего SIB1, является динамическим и обозначается в связанном сообщении DCI.

Загрузка и Процесс Форма волны I/Q

MATLAB® может использоваться, чтобы получить данные I/Q из широкого спектра инструментов с помощью Instrument Control Toolbox™. В этом примере одна антенна используется получение I/Q eNodeB с двумя антеннами передачи. Получение выполняется в 15.36 Msamples/s, который достаточен, чтобы правильно произвести всю допустимую eNodeB пропускную способность до 10 МГц: 1,4 МГц, 3 МГц, 5 МГц, 10 МГц. Собранные данные хранятся в файле eNodeBOutput.mat.

В качестве альтернативы подходящий сигнал LTE может быть сгенерирован с помощью LTE Toolbox. Этим может управлять переменная loadFromFile.

loadFromFile = 1; % Set to 0 to generate the eNodeB output locally

MIB соответствует одному транспортному блоку BCH. Временной интервал передачи (TTI) BCH, или время должен был передать один транспортный блок, 40 мс или 4 системы координат. BCH передается в 4 частях, каждая часть, сопоставленная с первым подкадром (подкадр 0) системы координат, и возможно, что каждая передача независимо decodable, в зависимости от условий сигнала. Чтобы гарантировать, что подкадр 0 получен, получение должно быть по крайней мере 11 подкадрами долго, чтобы составлять возможность, что получение запускается во время подкадра 0. Для условий недостаточного сигнала все 4 части TTI могут требоваться, в этом случае получение должно быть по крайней мере 41 подкадром долго. Аналогичная ситуация запрашивает SIB1; это передается в подкадре 5 из каждого даже система координат с четырьмя различными Версиями Сокращения (RVs), передаваемый последовательное предоставление полного периода 80 мс или 8 систем координат. Поэтому 21 подкадр получения требуется, чтобы гарантировать прием одного RV SIB1 (в подкадре 5 из даже системы координат), но до 81 подкадра получения требуется, если условия сигнала таковы, что весь RVs должен быть объединен.

if loadFromFile
    load eNodeBOutput.mat           % Load I/Q capture of eNodeB output
    eNodeBOutput = double(eNodeBOutput)/32768; % Scale samples
    sr = 15.36e6;                   % Sampling rate for loaded samples
else
    rmc = lteRMCDL('R.3'); %#ok<UNRCH>
    rmc.NCellID = 17;
    rmc.TotSubframes = 41;
    rmc.PDSCH.RNTI = 61;
    % SIB parameters
    rmc.SIB.Enable = 'On';
    rmc.SIB.DCIFormat = 'Format1A';
    rmc.SIB.AllocationType = 0;
    rmc.SIB.VRBStart = 8;
    rmc.SIB.VRBLength = 8;
    rmc.SIB.Gap = 0;
    % SIB data field filled with random bits, this is not a valid SIB
    % message
    rmc.SIB.Data = randi([0 1],176,1);
    [eNodeBOutput,~,info] = lteRMCDLTool(rmc,[1;0;0;1]);
    sr = info.SamplingRate;     % Sampling rate of generated samples
end

До декодирования MIB UE не знает полную системную пропускную способность. Первичные и вторичные сигналы синхронизации (PSS и SSS) и PBCH (содержащий MIB) все лежат в центральных 72 поднесущих (6 блоков ресурса) системной пропускной способности, позволяя UE первоначально демодулировать только эту центральную область. Поэтому пропускная способность первоначально установлена в 6 блоков ресурса. Форма волны I/Q должна передискретизироваться соответственно. На данном этапе мы также отображаем спектр входного сигнала eNodeBOutput.

% Set up some housekeeping variables:
% separator for command window logging
separator = repmat('-',1,50);
% plots
if (~exist('channelFigure','var') || ~isvalid(channelFigure))
    channelFigure = figure('Visible','off');
end
[spectrumAnalyzer,synchCorrPlot,pdcchConstDiagram] = ...
    hSIB1RecoveryExamplePlots(channelFigure,sr);
% PDSCH EVM
pdschEVM = comm.EVM();
pdschEVM.MaximumEVMOutputPort = true;

% The sampling rate for the initial cell search is established using
% lteOFDMInfo configured for 6 resource blocks. enb.CyclicPrefix is set
% temporarily in the call to lteOFDMInfo to suppress a default value
% warning (it does not affect the sampling rate).
enb = struct;                   % eNodeB config structure
enb.NDLRB = 6;                  % Number of resource blocks
ofdmInfo = lteOFDMInfo(setfield(enb,'CyclicPrefix','Normal')); %#ok<SFLD>

if (isempty(eNodeBOutput))
    fprintf('\nReceived signal must not be empty.\n');
    return;
end

% Display received signal spectrum
fprintf('\nPlotting received signal spectrum...\n');
spectrumAnalyzer(awgn(eNodeBOutput, 100.0));

if (sr~=ofdmInfo.SamplingRate)
    if (sr < ofdmInfo.SamplingRate)
        warning('The received signal sampling rate (%0.3fMs/s) is lower than the desired sampling rate for cell search / MIB decoding (%0.3fMs/s); cell search / MIB decoding may fail.',sr/1e6,ofdmInfo.SamplingRate/1e6);
    end
    fprintf('\nResampling from %0.3fMs/s to %0.3fMs/s for cell search / MIB decoding...\n',sr/1e6,ofdmInfo.SamplingRate/1e6);
else
    fprintf('\nResampling not required; received signal is at desired sampling rate for cell search / MIB decoding (%0.3fMs/s).\n',sr/1e6);
end
% Downsample received signal
nSamples = ceil(ofdmInfo.SamplingRate/round(sr)*size(eNodeBOutput,1));
nRxAnts = size(eNodeBOutput, 2);
downsampled = zeros(nSamples, nRxAnts);
for i=1:nRxAnts
    downsampled(:,i) = resample(eNodeBOutput(:,i), ofdmInfo.SamplingRate, round(sr));
end
Warning: MATLAB Connector is not running. 
Warning: MATLAB Connector is not running. 

Plotting received signal spectrum...

Resampling from 15.360Ms/s to 1.920Ms/s for cell search / MIB decoding...

Поиск ячейки, циклическое обнаружение длины префикса и дуплексного режима

Вызовите lteCellSearch, чтобы получить идентичность ячейки и синхронизацию смещения offset первой голове системы координат. Поиск ячейки повторяется для каждой комбинации циклической длины префикса и дуплексного режима, и комбинация с самой сильной корреляцией позволяет этим параметрам быть идентифицированными. График корреляции между полученным сигналом и PSS/SSS для обнаруженной идентичности ячейки производится. PSS обнаруживается с помощью корреляции временного интервала, и SSS обнаруживается с помощью корреляции частотного диапазона. До обнаружения SSS выполняется оценка/коррекция смещения частоты с помощью циклической префиксной корреляции. Обнаружение PSS временного интервала устойчиво к маленьким смещениям частоты, но большие смещения могут ухудшить корреляцию PSS.

fprintf('\nPerforming cell search...\n');

% Set up duplex mode and cyclic prefix length combinations for search; if
% either of these parameters is configured in |enb| then the value is
% assumed to be correct
if (~isfield(enb,'DuplexMode'))
    duplexModes = {'TDD' 'FDD'};
else
    duplexModes = {enb.DuplexMode};
end
if (~isfield(enb,'CyclicPrefix'))
    cyclicPrefixes = {'Normal' 'Extended'};
else
    cyclicPrefixes = {enb.CyclicPrefix};
end

% Perform cell search across duplex mode and cyclic prefix length
% combinations and record the combination with the maximum correlation; if
% multiple cell search is configured, this example will decode the first
% (strongest) detected cell
searchalg.MaxCellCount = 1;
searchalg.SSSDetection = 'PostFFT';
peakMax = -Inf;
for duplexMode = duplexModes
    for cyclicPrefix = cyclicPrefixes
        enb.DuplexMode = duplexMode{1};
        enb.CyclicPrefix = cyclicPrefix{1};
        [enb.NCellID, offset, peak] = lteCellSearch(enb, downsampled, searchalg);
        enb.NCellID = enb.NCellID(1);
        offset = offset(1);
        peak = peak(1);
        if (peak>peakMax)
            enbMax = enb;
            offsetMax = offset;
            peakMax = peak;
        end
    end
end

% Use the cell identity, cyclic prefix length, duplex mode and timing
% offset which gave the maximum correlation during cell search
enb = enbMax;
offset = offsetMax;

% Compute the correlation for each of the three possible primary cell
% identities; the peak of the correlation for the cell identity established
% above is compared with the peak of the correlation for the other two
% primary cell identities in order to establish the quality of the
% correlation.
corr = cell(1,3);
idGroup = floor(enbMax.NCellID/3);
for i = 0:2
    enb.NCellID = idGroup*3 + mod(enbMax.NCellID + i,3);
    [~,corr{i+1}] = lteDLFrameOffset(enb, downsampled);
    corr{i+1} = sum(corr{i+1},2);
end
threshold = 1.3 * max([corr{2}; corr{3}]); % multiplier of 1.3 empirically obtained
if (max(corr{1})<threshold)
    warning('Synchronization signal correlation was weak; detected cell identity may be incorrect.');
end
% Return to originally detected cell identity
enb.NCellID = enbMax.NCellID;

% Plot PSS/SSS correlation and threshold
synchCorrPlot.YLimits = [0 max([corr{1}; threshold])*1.1];
synchCorrPlot([corr{1} threshold*ones(size(corr{1}))]);

% Perform timing synchronization
fprintf('Timing offset to frame start: %d samples\n',offset);
downsampled = downsampled(1+offset:end,:);
enb.NSubframe = 0;

% Show cell-wide settings
fprintf('Cell-wide settings after cell search:\n');
disp(enb);
Performing cell search...
Timing offset to frame start: 481 samples
Cell-wide settings after cell search:
           NDLRB: 6
      DuplexMode: 'FDD'
    CyclicPrefix: 'Normal'
         NCellID: 17
       NSubframe: 0

Оценка смещения частоты и коррекция

До демодуляции OFDM должно быть удалено любое значительное смещение частоты. Смещение частоты в форме волны I/Q оценивается и откорректировало использование lteFrequencyOffset и lteFrequencyCorrect. Смещение частоты оценивается посредством корреляции циклического префикса и поэтому может оценить смещения до +/-половина интервала поднесущей т.е. +/-7.5 кГц.

fprintf('\nPerforming frequency offset estimation...\n');
% For TDD, TDDConfig and SSC are defaulted to 0. These parameters are not
% established in the system until SIB1 is decoded, so at this stage the
% values of 0 make the most conservative assumption (fewest downlink
% subframes and shortest special subframe).
if (strcmpi(enb.DuplexMode,'TDD'))
    enb.TDDConfig = 0;
    enb.SSC = 0;
end
delta_f = lteFrequencyOffset(enb, downsampled);
fprintf('Frequency offset: %0.3fHz\n',delta_f);
downsampled = lteFrequencyCorrect(enb, downsampled, delta_f);
Performing frequency offset estimation...
Frequency offset: 2.663Hz

Демодуляция OFDM и оценка канала

Прореженная форма волны OFDM I/Q демодулируется, чтобы произвести сетку ресурса rxgrid. Это используется, чтобы выполнить оценку канала. hest оценка канала, nest оценка шума (для эквализации MMSE) и cec настройка средства оценки канала.

Для оценки канала пример принимает 4 ячейки определенные ссылочные сигналы. Это означает, что оценки канала к каждой антенне получателя от всех возможных специфичных для ячейки ссылочных портов сигнала доступны. Истинное количество специфичных для ячейки ссылочных портов сигнала еще не известно. Оценка канала только выполняется на первом подкадре, т.е. использовании первого L Символы OFDM в rxgrid.

Консерватор 13 9 экспериментальное окно усреднения используется, в частоте и время, чтобы уменьшать удар шума на экспериментальных оценках во время оценки канала.

% Channel estimator configuration
cec.PilotAverage = 'UserDefined';     % Type of pilot averaging
cec.FreqWindow = 13;                  % Frequency window size
cec.TimeWindow = 9;                   % Time window size
cec.InterpType = 'cubic';             % 2D interpolation type
cec.InterpWindow = 'Centered';        % Interpolation window type
cec.InterpWinSize = 1;                % Interpolation window size

% Assume 4 cell-specific reference signals for initial decoding attempt;
% ensures channel estimates are available for all cell-specific reference
% signals
enb.CellRefP = 4;

fprintf('Performing OFDM demodulation...\n\n');

griddims = lteResourceGridSize(enb); % Resource grid dimensions
L = griddims(2);                     % Number of OFDM symbols in a subframe
% OFDM demodulate signal
rxgrid = lteOFDMDemodulate(enb, downsampled);
if (isempty(rxgrid))
    fprintf('After timing synchronization, signal is shorter than one subframe so no further demodulation will be performed.\n');
    return;
end
% Perform channel estimation
[hest, nest] = lteDLChannelEstimate(enb, cec, rxgrid(:,1:L,:));
Performing OFDM demodulation...

Демодуляция PBCH, декодирование BCH, парсинг MIB

MIB теперь декодируется наряду с количеством специфичных для ячейки ссылочных портов сигнала, переданных как маска на CRC BCH. Функция ltePBCHDecode устанавливает синхронизацию системы координат по модулю 4 и возвращает это в nfmod4 параметр. Это также возвращает биты MIB в векторном mib и истинный номер специфичных для ячейки ссылочных портов сигнала, который присвоен в enb.CellRefP при выходе этого вызова функции. Если количество специфичных для ячейки ссылочных портов сигнала декодируется как enb.CellRefP=0, это указывает на отказ декодировать BCH. Функция lteMIB используется, чтобы проанализировать битовый вектор mib и добавьте соответствующие поля в конфигурационную структуру enb. После декодирования MIB обнаруженная пропускная способность присутствует в enb.NDLRB.

% Decode the MIB
% Extract resource elements (REs) corresponding to the PBCH from the first
% subframe across all receive antennas and channel estimates
fprintf('Performing MIB decoding...\n');
pbchIndices = ltePBCHIndices(enb);
[pbchRx, pbchHest] = lteExtractResources( ...
    pbchIndices, rxgrid(:,1:L,:), hest(:,1:L,:,:));

% Decode PBCH
[bchBits, pbchSymbols, nfmod4, mib, enb.CellRefP] = ltePBCHDecode( ...
    enb, pbchRx, pbchHest, nest);

% Parse MIB bits
enb = lteMIB(mib, enb);

% Incorporate the nfmod4 value output from the function ltePBCHDecode, as
% the NFrame value established from the MIB is the System Frame Number
% (SFN) modulo 4 (it is stored in the MIB as floor(SFN/4))
enb.NFrame = enb.NFrame+nfmod4;

% Display cell wide settings after MIB decoding
fprintf('Cell-wide settings after MIB decoding:\n');
disp(enb);

if (enb.CellRefP==0)
    fprintf('MIB decoding failed (enb.CellRefP=0).\n\n');
    return;
end
if (enb.NDLRB==0)
    fprintf('MIB decoding failed (enb.NDLRB=0).\n\n');
    return;
end
Performing MIB decoding...
Cell-wide settings after MIB decoding:
            NDLRB: 50
       DuplexMode: 'FDD'
     CyclicPrefix: 'Normal'
          NCellID: 17
        NSubframe: 0
         CellRefP: 2
    PHICHDuration: 'Normal'
               Ng: 'One'
           NFrame: 406

Демодуляция OFDM на полной пропускной способности

Теперь, когда пропускная способность сигнала известна, сигнал передискретизируется к номинальному уровню выборки, используемому LTE Toolbox в той пропускной способности (см. lteOFDMModulate для деталей). Частота возместила оценку, и коррекция выполняется на передискретизируемом сигнале. Синхронизация синхронизации и демодуляции OFDM затем выполняется.

fprintf('Restarting reception now that bandwidth (NDLRB=%d) is known...\n',enb.NDLRB);

% Resample now we know the true bandwidth
ofdmInfo = lteOFDMInfo(enb);
if (sr~=ofdmInfo.SamplingRate)
    if (sr < ofdmInfo.SamplingRate)
        warning('The received signal sampling rate (%0.3fMs/s) is lower than the desired sampling rate for NDLRB=%d (%0.3fMs/s); PDCCH search / SIB1 decoding may fail.',sr/1e6,enb.NDLRB,ofdmInfo.SamplingRate/1e6);
    end
    fprintf('\nResampling from %0.3fMs/s to %0.3fMs/s...\n',sr/1e6,ofdmInfo.SamplingRate/1e6);
else
    fprintf('\nResampling not required; received signal is at desired sampling rate for NDLRB=%d (%0.3fMs/s).\n',enb.NDLRB,sr/1e6);
end
nSamples = ceil(ofdmInfo.SamplingRate/round(sr)*size(eNodeBOutput,1));
resampled = zeros(nSamples, nRxAnts);
for i = 1:nRxAnts
    resampled(:,i) = resample(eNodeBOutput(:,i), ofdmInfo.SamplingRate, round(sr));
end

% Perform frequency offset estimation and correction
fprintf('\nPerforming frequency offset estimation...\n');
delta_f = lteFrequencyOffset(enb, resampled);
fprintf('Frequency offset: %0.3fHz\n',delta_f);
resampled = lteFrequencyCorrect(enb, resampled, delta_f);

% Find beginning of frame
fprintf('\nPerforming timing offset estimation...\n');
offset = lteDLFrameOffset(enb, resampled);
fprintf('Timing offset to frame start: %d samples\n',offset);
% Aligning signal with the start of the frame
resampled = resampled(1+offset:end,:);

% OFDM demodulation
fprintf('\nPerforming OFDM demodulation...\n\n');
rxgrid = lteOFDMDemodulate(enb, resampled);
Restarting reception now that bandwidth (NDLRB=50) is known...

Resampling not required; received signal is at desired sampling rate for NDLRB=50 (15.360Ms/s).

Performing frequency offset estimation...
Frequency offset: 51.925Hz

Performing timing offset estimation...
Timing offset to frame start: 3848 samples

Performing OFDM demodulation...

Декодирование SIB1

Следующие шаги выполняются в этом разделе:

  • Физический Канал Индикатора Формата Управления (PCFICH) демодуляция, декодирование CFI

  • Декодирование PDCCH

  • Слепой поиск PDCCH

  • Восстановление битов SIB: демодуляция PDSCH и декодирование DL-SCH

  • Буферизация и сброс состояния DL-SCH HARQ

После восстановления CRC SIB должен быть 0.

Эти шаги декодирования выполняются в цикле для каждого вхождения подкадра, несущего SIB1 в полученном сигнале. Как упомянуто выше, SIB1 передается в подкадре 5 из каждого даже система координат, таким образом, входной сигнал сначала проверяется, чтобы установить при наименьшем количестве одного вхождения SIB1, присутствует. Для каждого подкадра SIB1 построен оценочный ответ величины канала, как созвездие полученного PDCCH.

% Check this frame contains SIB1, if not advance by 1 frame provided we
% have enough data, terminate otherwise.
if (mod(enb.NFrame,2)~=0)
    if (size(rxgrid,2)>=(L*10))
        rxgrid(:,1:(L*10),:) = [];
        fprintf('Skipping frame %d (odd frame number does not contain SIB1).\n\n',enb.NFrame);
    else
        rxgrid = [];
    end
    enb.NFrame = enb.NFrame + 1;
end

% Advance to subframe 5, or terminate if we have less than 5 subframes
if (size(rxgrid,2)>=(L*5))
    rxgrid(:,1:(L*5),:) = [];   % Remove subframes 0 to 4
else
    rxgrid = [];
end
enb.NSubframe = 5;

if (isempty(rxgrid))
    fprintf('Received signal does not contain a subframe carrying SIB1.\n\n');
end

% Reset the HARQ buffers
decState = [];

% While we have more data left, attempt to decode SIB1
while (size(rxgrid,2) > 0)

    fprintf('%s\n',separator);
    fprintf('SIB1 decoding for frame %d\n',mod(enb.NFrame,1024));
    fprintf('%s\n\n',separator);

    % Reset the HARQ buffer with each new set of 8 frames as the SIB1
    % info may be different
    if (mod(enb.NFrame,8)==0)
        fprintf('Resetting HARQ buffers.\n\n');
        decState = [];
    end

    % Extract current subframe
    rxsubframe = rxgrid(:,1:L,:);

    % Perform channel estimation
    [hest,nest] = lteDLChannelEstimate(enb, cec, rxsubframe);

    % PCFICH demodulation, CFI decoding. The CFI is now demodulated and
    % decoded using similar resource extraction and decode functions to
    % those shown already for BCH reception. lteExtractResources is used to
    % extract REs corresponding to the PCFICH from the received subframe
    % rxsubframe and channel estimate hest.
    fprintf('Decoding CFI...\n\n');
    pcfichIndices = ltePCFICHIndices(enb);  % Get PCFICH indices
    [pcfichRx, pcfichHest] = lteExtractResources(pcfichIndices, rxsubframe, hest);
    % Decode PCFICH
    cfiBits = ltePCFICHDecode(enb, pcfichRx, pcfichHest, nest);
    cfi = lteCFIDecode(cfiBits); % Get CFI
    if (isfield(enb,'CFI') && cfi~=enb.CFI)
        release(pdcchConstDiagram);
    end
    enb.CFI = cfi;
    fprintf('Decoded CFI value: %d\n\n', enb.CFI);

    % For TDD, the PDCCH must be decoded blindly across possible values of
    % the PHICH configuration factor m_i (0,1,2) in TS36.211 Table 6.9-1.
    % Values of m_i = 0, 1 and 2 can be achieved by configuring TDD
    % uplink-downlink configurations 1, 6 and 0 respectively.
    if (strcmpi(enb.DuplexMode,'TDD'))
        tddConfigs = [1 6 0];
    else
        tddConfigs = 0; % not used for FDD, only used to control while loop
    end
    alldci = {};
    while (isempty(alldci) && ~isempty(tddConfigs))
        % Configure TDD uplink-downlink configuration
        if (strcmpi(enb.DuplexMode,'TDD'))
            enb.TDDConfig = tddConfigs(1);
        end
        tddConfigs(1) = [];
        % PDCCH demodulation. The PDCCH is now demodulated and decoded
        % using similar resource extraction and decode functions to those
        % shown already for BCH and CFI reception
        pdcchIndices = ltePDCCHIndices(enb); % Get PDCCH indices
        [pdcchRx, pdcchHest] = lteExtractResources(pdcchIndices, rxsubframe, hest);
        % Decode PDCCH and plot constellation
        [dciBits, pdcchSymbols] = ltePDCCHDecode(enb, pdcchRx, pdcchHest, nest);
        pdcchConstDiagram(pdcchSymbols);

        % PDCCH blind search for System Information (SI) and DCI decoding.
        % The LTE Toolbox provides full blind search of the PDCCH to find
        % any DCI messages with a specified RNTI, in this case the SI-RNTI.
        fprintf('PDCCH search for SI-RNTI...\n\n');
        pdcch = struct('RNTI', 65535);
        pdcch.ControlChannelType = 'PDCCH';
        pdcch.EnableCarrierIndication = 'Off';
        pdcch.SearchSpace = 'Common';
        pdcch.EnableMultipleCSIRequest = 'Off';
        pdcch.EnableSRSRequest = 'Off';
        pdcch.NTxAnts = 1;
        alldci = ltePDCCHSearch(enb, pdcch, dciBits); % Search PDCCH for DCI
    end

    % If DCI was decoded, proceed with decoding PDSCH / DL-SCH
    for i = 1:numel(alldci)

        dci = alldci{i};
        fprintf('DCI message with SI-RNTI:\n');
        disp(dci);
        % Get the PDSCH configuration from the DCI
        [pdsch, trblklen] = hPDSCHConfiguration(enb, dci, pdcch.RNTI);

        % If a PDSCH configuration was created, proceed with decoding PDSCH
        % / DL-SCH
        if ~isempty(pdsch)

            pdsch.NTurboDecIts = 5;
            fprintf('PDSCH settings after DCI decoding:\n');
            disp(pdsch);

            % PDSCH demodulation and DL-SCH decoding to recover SIB bits.
            % The DCI message is now parsed to give the configuration of
            % the corresponding PDSCH carrying SIB1, the PDSCH is
            % demodulated and finally the received bits are DL-SCH decoded
            % to yield the SIB1 bits.

            fprintf('Decoding SIB1...\n\n');
            % Get PDSCH indices
            [pdschIndices,pdschIndicesInfo] = ltePDSCHIndices(enb, pdsch, pdsch.PRBSet);
            [pdschRx, pdschHest] = lteExtractResources(pdschIndices, rxsubframe, hest);
            % Decode PDSCH
            [dlschBits,pdschSymbols] = ltePDSCHDecode(enb, pdsch, pdschRx, pdschHest, nest);
            % Decode DL-SCH with soft buffer input/output for HARQ combining
            if ~isempty(decState)
                fprintf('Recombining with previous transmission.\n\n');
            end
            [sib1, crc, decState] = lteDLSCHDecode(enb, pdsch, trblklen, dlschBits, decState);

            % Compute PDSCH EVM
            recoded = lteDLSCH(enb, pdsch, pdschIndicesInfo.G, sib1);
            remod = ltePDSCH(enb, pdsch, recoded);
            [~,refSymbols] = ltePDSCHDecode(enb, pdsch, remod);
            [rmsevm,peakevm] = pdschEVM(refSymbols{1}, pdschSymbols{1});
            fprintf('PDSCH RMS EVM: %0.3f%%\n',rmsevm);
            fprintf('PDSCH Peak EVM: %0.3f%%\n\n',peakevm);

            fprintf('SIB1 CRC: %d\n',crc);
            if crc == 0
                fprintf('Successful SIB1 recovery.\n\n');
            else
                fprintf('SIB1 decoding failed.\n\n');
            end

        else
            % Indicate that creating a PDSCH configuration from the DCI
            % message failed
            fprintf('Creating PDSCH configuration from DCI message failed.\n\n');
        end

    end
    if (numel(alldci)==0)
        % Indicate that DCI decoding failed
        fprintf('DCI decoding failed.\n\n');
    end

    % Update channel estimate plot
    figure(channelFigure);
    surf(abs(hest(:,:,1,1)));
    hSIB1RecoveryExamplePlots(channelFigure);
    channelFigure.CurrentAxes.XLim = [0 size(hest,2)+1];
    channelFigure.CurrentAxes.YLim = [0 size(hest,1)+1];

    % Skip 2 frames and try SIB1 decoding again, or terminate if we
    % have less than 2 frames left.
    if (size(rxgrid,2)>=(L*20))
        rxgrid(:,1:(L*20),:) = [];   % Remove 2 more frames
    else
        rxgrid = []; % Less than 2 frames left
    end
    enb.NFrame = mod(enb.NFrame + 2,1024);

end
--------------------------------------------------
SIB1 decoding for frame 406
--------------------------------------------------

Decoding CFI...

Decoded CFI value: 2

PDCCH search for SI-RNTI...

DCI message with SI-RNTI:
           DCIFormat: 'Format1A'
                 CIF: 0
      AllocationType: 0
          Allocation: [1x1 struct]
           ModCoding: 6
              HARQNo: 0
             NewData: 0
                  RV: 1
            TPCPUCCH: 0
            TDDIndex: 0
          SRSRequest: 0
    HARQACKResOffset: 0

PDSCH settings after DCI decoding:
            RNTI: 65535
          PRBSet: [8x1 uint64]
         NLayers: 2
             CSI: 'On'
      Modulation: {'QPSK'}
              RV: 1
        TxScheme: 'TxDiversity'
    NTurboDecIts: 5

Decoding SIB1...

PDSCH RMS EVM: 27.029%
PDSCH Peak EVM: 76.752%

SIB1 CRC: 0
Successful SIB1 recovery.

Приложение

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