Этот пример показывает, как LTE Toolbox™ могут использоваться, чтобы обнаружить присутствие UE, сопоставленных с eNodeB. Это достигается путем поиска нисходящего сигнала для сообщений DCI и установления набора уникальных идентификаторов (C-RNTI), используемых.
В LTE канал управления физическим нисходящим каналом (PDCCH) содержит управляющую информацию в форме сообщений информации управления нисходящим каналом (DCI). Сообщения DCI передают информацию планирования восходящей линии связи или нисходящей линии связи от eNodeB к UE назначения, порядок UE могли идентифицировать ресурсы, необходимые для приема по физическому нисходящему общему каналу (PDSCH) или для передачи по физическому восходящему общему каналу (PUSH). Каждому UE назначается идентификатор, известный как C-RNTI (Временный идентификатор сотовой радиосети). C-RNTI используется для скремблирования бит CRC сообщения DCI для этого UE, а также для определения местоположения сообщения DCI в PDCCH. Для получения дополнительной информации см. пример PDCCH Blind Search и DCI Decoding.
Целью этого примера является декодирование PDCCH и поиск сообщений DCI кандидата. Затем C-RNTI получают из действительных сообщений, давая указание на количество адресованных UE и их шаблон с течением времени. Обратите внимание, что в этом примере возвращаются все обнаруженные RNTI, а не только RNTI в области значений C-RNTI, заданном в TS 36.321 Таблица 7.1-1 [1]. Сохранение этих других RNTI позволяет использовать этот пример для идентификации вхождений сообщений DCI, сопоставленных с системной информацией (SI-RNTI) или пейджингом (P-RNTI).
В этом примере анализируемая форма волны сохранена в файле ueDetectionWaveform.mat как переменная rxWaveform
. Принято, что полоса пропускания, режим дуплекса, длина циклического префикса, тождества камеры, количество портов опорного сигнала для конкретной ячейки и строение PHICH все известны, и соответствующая переменная строения eNodeB enb
также загружается из файла. Также возможно использовать форму волны, чьё строение eNodeB не известно, в этом случае строение eNodeB должна быть декодирована, как показано на примере Камеры Search, MIB и SIB1 Recovery.
load ueDetectionWaveform.mat;
rxWaveform = double(rxWaveform) / 32768;
Выполняют оценку и коррекцию смещения частоты и временную синхронизацию.
% Perform frequency offset estimation and correction foffset = lteFrequencyOffset(enb,rxWaveform); rxWaveform = lteFrequencyCorrect(enb,rxWaveform,foffset); % Perform timing synchronization to the first whole subframe of the % waveform toffset = lteDLFrameOffset(enb,rxWaveform); ofdmInfo = lteOFDMInfo(enb); sfLength = ofdmInfo.SamplingRate * 1e-3; offsetSubframes = floor(toffset / sfLength); toffset = toffset - (offsetSubframes * sfLength); rxWaveform = rxWaveform(1+toffset:end,:); enb.NSubframe = mod(-offsetSubframes,10);
Форма волны I/Q rxWaveform
демодулируется ли OFDM для создания полученной ресурсной сетки rxgrid
.
rxgrid = lteOFDMDemodulate(enb,rxWaveform);
Оценка и эквализация канала потребуются для обработки сигнала I/Q, захваченного вне эфира, поэтому параметры оценщика канала сконфигурированы.
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
Анализируемая нисходящая форма волны может нести информацию для ряда UE. Этот раздел пытается найти их RNTI. Применяемый здесь подход использует тот факт, что для действительного сообщения DCI биты CRC маскируются с RNTI. Поэтому, принимая, что ошибок нет (CRC = 0), последние 16 декодированных биты соответствуют RNTI. Этот подход описан в разделе 5 [2].
Этот пример реализует следующий алгоритм:
Рассмотрим все форматы PDCCH в специфичном для UE пространстве поиска (0... 3)
Для каждого формата PDCCH вычислите все возможные кандидаты в области управления, которые могут нести сообщение DCI.
Для каждого кандидата попытайтесь декодировать сообщение DCI (учитывая все возможные форматы DCI с уникальной длиной сообщения DCI).
Следующие шаги выполняются, чтобы проверить, составляют ли декодированные биты действительное сообщение DCI (графическое представление алгоритма также представлено ниже):
Предположим, что в передаче нет ошибок, т.е. предположим, что CRC = 0. Это означает, что последние 16 декодированных биты составляют C-RNTI.
Отделите сообщение DCI от 16 бит C-RNTI.
Вычислите новые биты CRC и замаскируйте их с помощью C-RNTI.
Повторно закодируйте сообщение DCI.
Сравните повторно закодированное сообщение с исходным кодированным кандидатом DCI.
Отсутствие ошибок в сравнении на этом последнем этапе означает, что было обнаружено действительное сообщение DCI и C-RNTI (идентификатор UE). В некоторых случаях, особенно с формами волны, захваченными вне эфира, в процессе декодирования DCI могут возникнуть некоторые ошибки. Поэтому в этом примере используется порог (maxErrors
) для управления тем, сколько ошибок допускается при сравнении между принятыми битами и повторно закодированными битами.
Два шага последующей обработки применяются к списку обнаруженных UE в порядок уменьшения количества ложных обнаружений:
Сообщения DCI, получившие символы-кандидаты, степень которых (в дБ) меньше порога minPDCCHPower
исключены. Без этого шага полученные биты, состоящие исключительно из шума (даже при низкой степени), могут вызывать ложные обнаружения.
В случае перекрытия результатов (т.е. когда индексы кандидата одного результата являются подмножеством другого), будет выбран результат с самым низким количеством битовых ошибок.
Обратите внимание, что для полноты, общее пространство поиска также ищется для 1A формата DCI и 1C сообщений, распределяющих ресурсы для сообщений системной информации, пейджинга или отклика с произвольным доступом.
% Maximum number of bit errors allowed to consider a detection as valid maxErrors = 2; % Minimum PDCCH power in dB (relative to the cell-specific reference signal % used for channel estimation) to consider a detection as valid minPDCCHPower = -5.0; % Initialize results table results = table; % Get DCI formats and lengths for DCI messages in the common search space pdcchCommon = struct('SearchSpace','Common'); pdcchCommon.ControlChannelType = 'PDCCH'; CIF = 'Off'; % enable or disable Carrier Indicator Field pdcchCommon.EnableCarrierIndication = CIF; [dciInfoCommon,pdcchCommon] = getUniqueDCILengths(enb,pdcchCommon); % Get DCI formats and lengths for DCI messages in the UE-specific search % space. The length of a DCI message of a given format may be affected by % various UE-specific higher-layer parameters so the set of different % unique lengths across those parameters is recorded, along with the % corresponding parameter combinations pdcchUESpecific = struct('SearchSpace','UESpecific'); pdcchUESpecific.ControlChannelType = 'PDCCH'; pdcchUESpecific.EnableCarrierIndication = CIF; [dciInfoUESpecific,pdcchUESpecific] = getUniqueDCILengths(enb,pdcchUESpecific); % Establish the number of subframes in the waveform griddims = lteResourceGridSize(enb); L = griddims(2); nSubframes = floor(size(rxgrid,2) / L); % For each subframe in the waveform, attempt to decode the PDCCH startSubframe = enb.NSubframe; CFIs = zeros(1,nSubframes); for i = 0:nSubframes-1 % Extract the current subframe rxSubframe = rxgrid(:,(i*L) + (1:L),:); % Perform channel estimation [hest,nest] = lteDLChannelEstimate(enb,cec,rxSubframe); % If the current subframe contains the first occurrence of the MIB in % the waveform, decode the MIB to establish the frame number if (enb.NSubframe==0 && i<10) startFrame = decodeMIB(enb,rxSubframe,hest,nest,i); end % Get PCFICH indices, extract received PCFICH symbols and corresponding % channel estimate, demodulate PCFICH, decode and record CFI pcfichIndices = ltePCFICHIndices(enb); [pcfichRx,pcfichHest] = lteExtractResources(pcfichIndices,rxSubframe,hest); pcfichBits = ltePCFICHDecode(enb,pcfichRx,pcfichHest,nest); enb.CFI = lteCFIDecode(pcfichBits); CFIs(i+1) = enb.CFI; % Get PDCCH indices pdcchIndices = ltePDCCHIndices(enb); % Extract received PDCCH symbols and corresponding channel estimate [pdcchRx,pdcchHest] = lteExtractResources(pdcchIndices,rxSubframe,hest); % Perform PDCCH demodulation to obtain the received PDCCH bits, which % may contain encoded DCI messages for one or more users [pdcchBits,pdcchSymbols] = ltePDCCHDecode(enb,pdcchRx,pdcchHest,nest); % Initialize array of PDCCH format / candidate / DCI format % combinations, which represent possible UEs (i.e. possible locations % for DCI messages providing a downlink or uplink grant for a UE) possibleUEs = []; % PDCCH format for UE-specific search space can be 0, 1, 2, or 3 for pdcchFormat = 0:3 ue = struct(); % Get all PDCCH candidate indices and the number of candidates M % for the current PDCCH format ue.PDCCHFormat = pdcchFormat; candidates = getPDCCHCandidates(enb,ue); M = size(candidates,1); % For each candidate for m = 1:M % Record PDCCH candidate indices ue.Candidate = candidates(m,:); % For each DCI format in the UE-specific search space dciFormats = fieldnames(dciInfoUESpecific); for dciFormatIdx = 1:length(dciFormats) % Record DCI format ue.DCIFormat = dciFormats{dciFormatIdx}; % Record this PDCCH format / candidate / DCI format % combination as a possible "UE". For DCI formats that have % different lengths across the UE-specific higher-layer % parameters, each length is recorded as a different % possible UE dciLengths = dciInfoUESpecific.(ue.DCIFormat); for dciLengthIdx = 1:length(dciLengths) ue.DCILength = dciLengths(dciLengthIdx); ue.PDCCH = pdcchUESpecific.(ue.DCIFormat)(dciLengthIdx); possibleUEs = [possibleUEs ue]; %#ok<AGROW> end end % For PDCCH formats 2 or 3, record the possibility of a DCI % message in the common search space in this candidate location % with format 1A or 1C. Such DCI messages correspond to System % Information, Paging, or Random Access Response message rather % than uplink or downlink grants for a UE, but are searched for % in this example for completeness if (any(pdcchFormat==[2 3])) for dciFormat = {'Format1A' 'Format1C'} ue.DCIFormat = dciFormat{1}; ue.DCILength = dciInfoCommon.(ue.DCIFormat); ue.PDCCH = pdcchCommon.(ue.DCIFormat); possibleUEs = [possibleUEs ue]; %#ok<AGROW> end end end end % For each possible UE for ue = possibleUEs % Get the received candidate bits from the received PDCCH bits (for % DCI decoding) bitIdx = ue.Candidate; candidateBits = pdcchBits(bitIdx(1):bitIdx(2)); % Get the received candidate symbols from the received PDCCH % symbols (for PDCCH power estimation). The modulation order Qm = 2 % is used to convert candidate bit indices into candidate symbol % indices (QPSK modulation is always used for PDCCH) Qm = 2; symIdx = [((bitIdx(1) - 1) / Qm) + 1 bitIdx(2)/Qm]; candidateSymbols = pdcchSymbols(symIdx(1):symIdx(2)); % Decode the received candidate bits and get the RNTI. Assuming a % CRC pass (CRC = 0), the 2nd output from lteDCIDecode will % correspond to the RNTI [dciMessageBits,RNTI] = lteDCIDecode(ue.DCILength,candidateBits); % Re-encode the decoded DCI message bits (using the detected RNTI) % and establish the number of bit errors between the re-encoded % candidate bits and received candidate bits ue.RNTI = RNTI; reencodedCandidateBits = lteDCIEncode(ue,dciMessageBits); numErrors = sum(int8(candidateBits > 0) ~= reencodedCandidateBits); % If the number of bit errors is greater than maxErrors, continue % to the next possible UE (the rest of the loop body here is not % executed) if (numErrors > maxErrors) continue; end % Create DCI message structure from message bit payload. This is % performed because for some DCI formats (e.g. format 0 versus % format 1A), the true DCI format amongst DCI formats with % the same length can be determined by the value of a message bit dci = lteDCI(enb,ue.PDCCH,dciMessageBits); % Create table entry for the current DCI message result = struct(); result.Subframe = i; result.DetectedRNTI = string(dec2hex(ue.RNTI,4)); result.NumErrors = numErrors; result.DCIFormat = string(dci.DCIFormat); result.PDCCHFormat = ue.PDCCHFormat; result.Candidate = ue.Candidate; result.PDCCHPower = round(10*log10(var(candidateSymbols)),2); result.DCI = {dci}; result = struct2table(result); % Check if a DCI message has previously been successfully decoded % in this subframe with the same RNTI, DCI format and starting % candidate location as the current DCI message (but with a % different PDCCH format) if (~isempty(results)) match = (results.Subframe == result.Subframe); match = match & (results.DetectedRNTI == result.DetectedRNTI); match = match & strcmpi(results.DCIFormat,result.DCIFormat); match = match & (results.Candidate(:,1) == result.Candidate(1)); match = find(match~=0); else match = []; end % If a DCI message satisfies the criteria above, it must have been % for a smaller PDCCH format and therefore represents successful % decoding of part of the current message, i.e. decoding a subset % of the candidate Control Channel Elements (CCEs). Therefore the % previous result can be replaced with the current result. Note % that for larger PDCCH formats the number of bit errors will tend % to be bigger as there are more candidate bits, so at low SNRs the % detected PDCCH format here may be lower than the true PDCCH % format (i.e. the number of errors in the bits for the true PDCCH % format exceeds maxErrors) if (isempty(match)) results = [results; result]; %#ok<AGROW> else results(match,:) = result; end end % Update the subframe number enb.NSubframe = mod(enb.NSubframe + 1,10); end % Remove results whose estimated PDCCH power (in dB) is lower than the % minimum power threshold. Without this step, received candidate symbols % consisting solely of noise (even at a low power) can trigger false % detections if (~isempty(results)) results(results.PDCCHPower < minPDCCHPower,:) = []; end % Check if results are empty if (isempty(results)) disp('No RNTIs found.'); return; end % In any given subframe, in the case of overlapping results (i.e. where the % candidate indices of one result are a subset of another), the result with % the lowest number of bit errors will be selected overlapping = []; for i = unique(results.Subframe).' % Find result rows which correspond to the current subframe and extract % those results sf = find(results.Subframe == i).'; % For each pair of results in this subframe for a = sf for b = sf ca = results{a,'Candidate'}; cb = results{b,'Candidate'}; % If the first result's candidate indices are a subset of the % second result's candidate indices if (ca(1)>=cb(1) && ca(2)<=cb(2)) % If the first result has more errors if (results{a,'NumErrors'}>results{b,'NumErrors'}) % Mark the first result in the pair as overlapping % (i.e. mark it for removal) overlapping = [overlapping a]; %#ok<AGROW> end end end end end % Remove overlapping results results(overlapping,:) = []; % Add a label for each row of the results table results.Properties.RowNames = strsplit(num2str(1:height(results)));
Отображается таблица обнаруженных RNTI и другая информация, связанная с обнаруженными сообщениями DCI. Каждая строка этой таблицы включает:
Subframe
: Номер подкадра (относительно начала принятой формы волны), в котором происходит обнаруженный RNTI.
DetectedRNTI
: Обнаруженный RNTI.
NumErrors
: Количество битовых ошибок между перекодированными битами и полученными битами (меньше или равно maxErrors
).
DCIFormat
: Формат DCI сообщения DCI. Обратите внимание, что во время процесса обнаружения UE использовались только форматы DCI с уникальными длинами, поскольку только длина выходного сообщения DCI влияет на процесс декодирования (в частности, согласование скорости перед сверточным декодированием). В системе LTE несколько сообщений DCI могут иметь одинаковую длину для одного и того же строения eNodeB. Эта неоднозначность устраняется при нормальной операции системы каждым UE назначается режим передачи (TM). TS 36.213 Таблица 7.1-5 [3] показывает, какие форматы DCI применимы для данного TM, и все форматы для данного TM будут иметь уникальные длины. Поскольку этот пример действует без знания UE и их TM, истинный формат DCI, обнаруженный для UE, может не совпадать с форматом DCI здесь, но длина будет совпадать. Функция lteDCIInfo
может использоваться, чтобы установить, какие другие форматы DCI имеют ту же длину, что и формат DCI, здесь.
PDCCHFormat
: Формат PDCCH полученных битов-кандидатов для сообщения DCI. Для получения дополнительной информации о форматах PDCCH, смотрите пример PDCCH Blind Search и DCI Decoding.
Candidate
: Включенные [начальные, конечные] индексы (на основе 1) местоположения кандидата PDCCH для сообщения DCI, т.е. местоположение принятых бит кандидата в наборе всех принятых бит PDCCH. Полный набор кандидатов пространства поиска PDCCH для заданного строения eNodeB, формата PDCCH и RNTI можно найти с помощью ltePDCCHSpace
функция.
PDCCHPower
: Степень принятых символов кандидата (в дБ), сопоставленных с этим сообщением DCI.
DCI
Декодированная структура сообщений DCI, принимая, что формат DCI, отмеченный выше, является истинным форматом DCI для сообщения.
disp(results);
Subframe DetectedRNTI NumErrors DCIFormat PDCCHFormat Candidate PDCCHPower DCI ________ ____________ _________ __________ ___________ ___________ __________ ____________ 1 0 "9397" 1 "Format0" 1 1 144 0.32 {1x1 struct} 2 0 "F24A" 0 "Format0" 2 289 576 3.24 {1x1 struct} 3 0 "717A" 0 "Format2A" 2 577 864 3.36 {1x1 struct} 4 1 "717A" 0 "Format2A" 2 1 288 2.99 {1x1 struct} 5 1 "717A" 0 "Format0" 2 289 576 3.02 {1x1 struct} 6 1 "9397" 0 "Format0" 1 577 720 -0.22 {1x1 struct} 7 2 "717A" 0 "Format2A" 2 1 288 3.19 {1x1 struct} 8 2 "9397" 0 "Format0" 1 289 432 0.52 {1x1 struct} 9 3 "4C87" 0 "Format2A" 2 1 288 3.16 {1x1 struct} 10 3 "9397" 0 "Format0" 1 289 432 -0.11 {1x1 struct} 11 3 "96C1" 0 "Format2A" 1 577 720 3.27 {1x1 struct} 12 4 "717A" 0 "Format0" 2 1 288 3.41 {1x1 struct} 13 4 "9397" 2 "Format0" 0 433 504 1.07 {1x1 struct} 14 4 "717A" 1 "Format2A" 1 577 720 3.57 {1x1 struct} 15 5 "9397" 0 "Format0" 0 1 72 2.42 {1x1 struct} 16 5 "96C1" 1 "Format0" 0 145 216 0.6 {1x1 struct} 17 5 "6C27" 2 "Format2C" 0 217 288 1.14 {1x1 struct} 18 5 "717A" 0 "Format0" 1 289 432 5.68 {1x1 struct} 19 5 "4C87" 2 "Format2A" 0 577 648 1.66 {1x1 struct} 20 6 "717A" 0 "Format2A" 2 1 288 2.95 {1x1 struct} 21 6 "9397" 0 "Format0" 1 289 432 0.27 {1x1 struct} 22 6 "077B" 0 "Format0" 1 433 576 6.17 {1x1 struct} 23 7 "FFFF" 0 "Format1A" 2 1 288 0.14 {1x1 struct} 24 7 "9397" 1 "Format0" 1 289 432 1.38 {1x1 struct} 25 7 "4C87" 0 "Format2A" 1 577 720 6.21 {1x1 struct} 26 8 "4C87" 0 "Format2A" 2 1 288 3.03 {1x1 struct} 27 8 "717A" 0 "Format2A" 2 577 864 3.05 {1x1 struct} 28 9 "717A" 0 "Format2A" 2 577 864 3.05 {1x1 struct} 29 10 "4C87" 0 "Format2A" 2 1 288 3.11 {1x1 struct} 30 10 "F24A" 0 "Format0" 2 289 576 3.25 {1x1 struct} 31 10 "9397" 0 "Format2A" 1 721 864 2.98 {1x1 struct} 32 11 "4C87" 0 "Format2A" 2 1 288 2.27 {1x1 struct} 33 11 "717A" 0 "Format0" 2 289 576 2.37 {1x1 struct} 34 11 "F24A" 0 "Format2A" 2 577 864 2.38 {1x1 struct} 35 12 "FFFF" 2 "Format1A" 1 1 144 0.7 {1x1 struct} 36 12 "4C87" 0 "Format2A" 2 865 1152 3.85 {1x1 struct} 37 14 "717A" 2 "Format0" 1 1 144 2.64 {1x1 struct} 38 14 "B073" 2 "Format2" 0 145 216 3.01 {1x1 struct} 39 14 "717A" 0 "Format2A" 2 577 864 3.58 {1x1 struct}
Создается график, показывающий обнаруженные RNTI в зависимости от номера субкадра. Полученная нисходящая ресурсная сетка отображается, и RNTI используются для маркировки ресурсов PDSCH, сигнализированных соответствующими сообщениями DCI. Также отображается пустая ресурсная сетка восходящей линии связи, и отображаются ресурсы PUSCH, сигнализируемые любыми сообщениями формата 0 или формата 4 DCI, которые маркируются соответствующими RNTI. Вопросительный знак появляется после любого RNTI, для которого количество битовых ошибок между перекодированными битами кандидата и принятыми битами кандидата NumErrors
, больше нуля (и меньше или равно maxErrors
). Используемые здесь системные номера систем координат (SFN) используют целые числа для представления SFN и десятичных чисел (десятых) для представления подрамника в SFN.
enb.NFrame = startFrame; enb.NSubframe = startSubframe; enb.CFI = CFIs; summary = hPlotDetectedRNTIs(results,enb,rxgrid);
Наконец, отображаются сводные данные обнаруженных выделений ресурсов PDSCH или PUSCH. Для каждого обнаруженного сообщения DCI отображается следующее:
Номер системной системы координат (SFN)
RNTI
Количество ошибок
Формат DCI (и связанное направление ссылки)
Выделенные PRB
Оценка мощности приемника в распределенных PRB
Обратите внимание, что, поскольку не существует сетки ресурсов восходящей линии связи, степень, оцененная для сообщений DCI восходящей линии связи, будет -Inf. Обратите внимание, что если требуется сводные данные на RNTI, сводную таблицу можно легко отсортировать, чтобы сгруппировать результаты для того же RNTI с помощью sortrows(summary,'RNTI')
.
disp(summary);
SFN RNTI NumErrors DCIFormat LinkDirection PRBSet Power _____ ______ _________ __________ _____________ _______________________________________ _____ 833.3 "9397" 1 "Format0" "Uplink" "[7 8]" -Inf 833.3 "F24A" 0 "Format0" "Uplink" "[9...23]" -Inf 833.3 "717A" 0 "Format2A" "Downlink" "[0...24]" 15.98 833.4 "717A" 0 "Format2A" "Downlink" "[0...24]" 16.24 833.4 "717A" 0 "Format0" "Uplink" "[22 23]" -Inf 833.4 "9397" 0 "Format0" "Uplink" "[20 21]" -Inf 833.5 "717A" 0 "Format2A" "Downlink" "[2 3 6 7 10 11 14 15 18 19 22 23]" 15.95 833.5 "9397" 0 "Format0" "Uplink" "[22 23]" -Inf 833.6 "4C87" 0 "Format2A" "Downlink" "[0 1 4 5 8 9 12 13 16 17 20...24]" 14.9 833.6 "9397" 0 "Format0" "Uplink" "[22 23]" -Inf 833.6 "96C1" 0 "Format2A" "Downlink" "[2 3 6 7 10 11 14 15 18 19]" 15.38 833.7 "717A" 0 "Format0" "Uplink" "[16 17]" -Inf 833.7 "9397" 2 "Format0" "Uplink" "[14 15]" -Inf 833.7 "717A" 1 "Format2A" "Downlink" "[0...24]" 13.96 833.8 "9397" 0 "Format0" "Uplink" "[16 17]" -Inf 833.8 "96C1" 1 "Format0" "Uplink" "[14 15]" -Inf 833.8 "6C27" 2 "Format2C" "Downlink" "[0...3 8 9 12...17 20 21 24]" 13.98 833.8 "717A" 0 "Format0" "Uplink" "[12 13]" -Inf 833.8 "4C87" 2 "Format2A" "Downlink" "[0...24]" 13.98 833.9 "717A" 0 "Format2A" "Downlink" "[0...24]" 15.32 833.9 "9397" 0 "Format0" "Uplink" "[20 21]" -Inf 833.9 "077B" 0 "Format0" "Uplink" "[18 19]" -Inf 834 "FFFF" 0 "Format1A" "Downlink" "[0...7]" 17.31 834 "9397" 1 "Format0" "Uplink" "[20 21]" -Inf 834 "4C87" 0 "Format2A" "Downlink" "[8...24]" 16.71 834.1 "4C87" 0 "Format2A" "Downlink" "[20 21]" 17.68 834.1 "717A" 0 "Format2A" "Downlink" "[0...19 22...24]" 18.11 834.2 "717A" 0 "Format2A" "Downlink" "[0...24]" 18.38 834.3 "4C87" 0 "Format2A" "Downlink" "[0 1 4...24]" 17.51 834.3 "F24A" 0 "Format0" "Uplink" "[22 23]" -Inf 834.3 "9397" 0 "Format2A" "Downlink" "[2]" 18.42 834.4 "4C87" 0 "Format2A" "Downlink" "[0...3 6 7 10 11 14 15 18 19 22...24]" 15.9 834.4 "717A" 0 "Format0" "Uplink" "[22 23]" -Inf 834.4 "F24A" 0 "Format2A" "Downlink" "[4]" 16.8 834.5 "FFFF" 2 "Format1A" "Downlink" "[0...13]" 14.12 834.5 "4C87" 0 "Format2A" "Downlink" "[14...24]" 10.18 834.7 "717A" 2 "Format0" "Uplink" "[16 17]" -Inf 834.7 "B073" 2 "Format2" "Downlink" "[7 11 15 19]" 14.08 834.7 "717A" 0 "Format2A" "Downlink" "[0...24]" 14.32
Следующие наблюдения могут быть сделаны с помощью сводных данных результатов и графика:
Информация о системе (СИ): RNTI, используемый для системной информации (СИ-RNTI), является FFFF hex. Сообщения DCI, сопоставленные с блоками системной информации (SIBs), можно увидеть в SFN = 834,0 (NFrame = 834, NSubframe = 0) и SFN = 834,5 (NFrame = 834, NSubframe = 5). SystemInformationBlockType1 (SIB1) происходит в подкадре 5 четных систем координат, поэтому вхождение в SFN = 834,5 SIB1. Другие SIB динамически планируются, причем информация о планировании содержится в SIB1.
RNTI, встречающиеся в нескольких подкадрах: RNTI 717A и 4C87 часто встречаются на протяжении всей формы волны, обычно с нулем ошибок, поэтому они, вероятно, соответствуют активным UE.
Процесс обнаружения может привести к ошибкам из-за шума и искажений в нисходящих сигналах. Существует два основных типа ошибок, которые описаны ниже с помощью примеров:
Пропущенное обнаружение: Наблюдайте SFN 834.6. В ресурсных блоках PDSCH есть энергия от 0 до 7. Однако никаких сообщений DCI не обнаружено. Перезапустите настройку симуляции maxErrors=3
. Сейчас в этой области обнаружена 4C87 RNTI. Этот RNTI присутствует в других подкадрах, что означает, что это, вероятно, будет подлинным UE.
Ложный позитив: Наблюдайте выделение PDSCH с B073 RNTI в конечном подкадре формы волны. Он перекрывается с 717A выделения PDSCH. Учитывая, что 717A RNTI часто происходят в течение всей формы волны и что RNTI B073 декодируется с 2 ошибками, вероятно, что B073 RNTI является «ложноположительным» обнаружением.
В этом примере используется функция helper:
3GPP TS 36.321 «Протокол управления средним доступом (MAC) спецификации»
Кумар, Хамед, Катаби и Ли. «LTE Radio Analytics сделал легким и доступным», SIGCOMM '14 (2014): 211-222
3GPP TS 36.213 «Процедуры физического слоя»
В этом примере используются следующие локальные функции:
getUniqueDCILengths
: Получите информацию о сообщениях DCI для форматов DCI с уникальными длинами
decodeMIB
: Декодируйте главный информационный блок (MIB), чтобы получить номер системы координат
getPDCCHCandidates
: Получите всех кандидатов PDCCH
% Get DCI message information for DCI formats with unique lengths, across % all UE-specific higher-layer parameters function [infoOut,pdcchOut] = getUniqueDCILengths(enb,pdcchIn) infoOut = []; for EnableSRSRequest = {'Off' 'On'} pdcchIn.EnableSRSRequest = EnableSRSRequest{1}; for EnableMultipleCSIRequest = {'Off' 'On'} pdcchIn.EnableMultipleCSIRequest = EnableMultipleCSIRequest{1}; for NTxAnts = [1 2 4] pdcchIn.NTxAnts = NTxAnts; % Get the DCI message lengths for all formats, as a % structure info = lteDCIInfo(enb,pdcchIn); % Convert the structure into a cell array of field names % and values formats = fieldnames(info); sizes = struct2cell(info); % Remove DCI format 3 and 3A as these DCI formats are used % for conveying power control commands rather than resource % allocations dci3idx = ismember(formats,{'Format3','Format3A'}); formats(dci3idx) = []; sizes(dci3idx) = []; % Keep only DCI format 1A and 1C for the common search % space if (strcmpi(pdcchIn.SearchSpace,'Common')) commonidx = ismember(formats,{'Format1A','Format1C'}); formats = formats(commonidx); sizes = sizes(commonidx); end % Find the indices of the unique sizes, the first % occurrence of each unique size will be retained in the % original order [~,idxs] = unique(cat(2,sizes{:}),'stable'); % If the current UE-specific settings yield unique sizes % for any format (compared to all other formats and % UE-specific settings thus far), then record them if (isempty(infoOut)) infoOut = cell2struct(sizes(idxs),formats(idxs)); pdcchOut = cell2struct(repmat({pdcchIn},size(idxs)),formats(idxs)); else sizes_out = struct2cell(infoOut); sizes_out = cat(2,sizes_out{:}); for i = idxs.' if (~any(sizes_out==sizes{i})) format = formats{i}; infoOut.(format) = [infoOut.(format) sizes{i}]; pdcchOut.(format) = [pdcchOut.(format) pdcchIn]; end end end end end end end % Decode the Master Information Block (MIB) to get frame number function startFrame = decodeMIB(enb,rxSubframe,hest,nest,i) pbchIndices = ltePBCHIndices(enb); [pbchRx, pbchHest] = lteExtractResources(pbchIndices,rxSubframe,hest); [~,~,nfmod4,mibbits] = ltePBCHDecode(enb,pbchRx,pbchHest,nest); mib = lteMIB(mibbits); startFrame = double(mib.NFrame) + nfmod4; if (i>0) startFrame = mod(startFrame - 1,1024); end end % Get all PDCCH candidates for a given eNodeB configuration and UE % configuration, without having to evaluate all possible RNTIs function pdcchCandidates = getPDCCHCandidates(enb,ue) % PDCCH dimensionality information pdcchInfo = ltePDCCHInfo(enb); % Aggregation level L = 2 ^ ue.PDCCHFormat; % Number of candidates M = floor(double(pdcchInfo.NCCE)/L); % 1 CCE = 9 REGs = 36 REs = 72 bits bitsPerCCE = 72; % PDCCH candidate indices within PDCCH bits (1-based) pdcchCandidates = L*bitsPerCCE*(0:M-1).' + [1 L*bitsPerCCE]; end