exponenta event banner

Генерация сигнала восходящей линии связи LTE-M

Этот пример показывает, как создать передачу LTE-M восходящей линии связи, состоящую из физического общего канала восходящей линии связи (PUSCH) и связанных опорных сигналов демодуляции (DM-RS), включая повторы и скачкообразную перестройку частоты. По сравнению с устройствами предварительного выпуска 13, устройства Cat-M предлагают более низкую стоимость и сложность, улучшенный охват за счет введения повторов и расширенного DRX для дальнейшего энергосбережения.

Введение

Битовая карта субкадра соты, передаваемая широковещательно по системной информации (SI), указывает, какие субкадры способны к LTE-M передачам. Устройства LTE-M могут дополнительно разрешать повторы для PUSCH и PUCCH для улучшения покрытия. Сеть конфигурирует набор возможных повторов, содержащих 4 значения для режима CE A (pusch-maxNumRepetitionCEmodeA согласно ТУ 36.213 Таблица 8-2b [3]) и 8 значений для режима СЕ Б (pusch-maxNumRepetitionCEmodeB как указано в TS 36.213 Таблица 8-2c [3]). Из этого набора сеть динамически выбирает фактические повторения и сигнализирует об этом UE как часть разрешения планирования. Разрешения планирования восходящей линии связи для устройств LTE-M передаются по MPDCCH с использованием формата DCI 6-0A для устройств, работающих в режиме CE A, и 6-0B для устройств, работающих в режиме CE B. Разрешение планирования, заканчивающееся в подкадре n нисходящей линии связи, является действительным для передачи PUSCH восходящей линии связи, начинающейся в подкадре n + 4 восходящей линии связи. В случае передач со скачкообразной перестройкой частоты разрешение указывает узкополосность для первой передачи. Последующие распределения могут переходить между узкими полосами, как определено в TS 36.211 Раздел 5.3.4 [1].

PUSCH

Для устройств Cat-M1 (Release 13) PUSCH всегда передается в одном узком диапазоне. В Cat-M2 (версия 14) устройства в режиме CE A могут дополнительно передавать до 24 PRB, если параметр более высокого уровня ce-pusch-maxBandwidth-config установлен в 5MHz, как указано в TS 36.211 Раздел 5.3.4 [1 ]/TS 36.306 Раздел 4.3.4.64 [4]. LTE-M PUSCH может иметь до 32 повторов в режиме CE A (см. TS 36.213 Таблица 8-2b [3]) и до 2048 повторов в режиме CE B (см. TS 36.213 Таблица 8-2c [3]). Для UE BL/CE в режиме CE A скачкообразная перестройка частоты PUSCH активируется, когда параметр более высокого уровня pusch-HoppingConfig устанавливается, и флаг скачкообразной перестройки частоты в формате DCI 6-0A указывает скачкообразную перестройку частоты. Для UE BL/CE в режиме CE B скачкообразная перестройка частоты PUSCH активируется, когда параметр более высокого уровня pusch-HoppingConfig установлен. Если скачкообразная перестройка частоты не активизирована для PUSCH, все повторы PUSCH располагаются в одних и тех же ресурсах PRB. Если скачкообразная перестройка частоты активизирована для PUSCH, PUSCH передается в подкадре в пределах NabsPUSCH последовательные подкадры восходящей линии связи, использующие то же количество последовательных PRB, что и в предыдущем подкадре, начиная с того же самого начального ресурса PRB в узком диапазоне. Если назначение ресурсов или скачкообразная перестройка частоты приведет к выделению ресурсов PUSCH вне распределяемых PRB, то передача PUSCH в этом подкадре отбрасывается.

ue = struct();                % Initialize the structure
ue.NULRB = 50;                % Bandwidth
ue.DuplexMode = 'FDD';        % Duplex mode
ue.TDDConfig = 1;             % UL/DL configuration if TDD duplex mode
ue.CyclicPrefixUL = 'Normal'; % The cyclic prefix length
ue.NCellID = 1;               % Cell identity
ue.RNTI = 1;                  % RNTI value
ue.NFrame = 0;                % Frame number
ue.NSubframe = 0;             % Subframe number
ue.NTxAnts = 1;               % Number of transmit antennas
ue.Shortened = 1;             % Last symbol availability (allocation for SRS)

% Set up hopping specific parameters
ue.HoppingOffset = 1;% Narrowband offset between one narrowband and the next narrowband
                     % a PUSCH hops to, expressed as a number of uplink narrowbands
ue.NChULNB = 2;      % Number of consecutive absolute subframes over which
                     % PUCCH or PUSCH stays at the same

pusch  = struct();
pusch.CEMode = 'A';         % CE mode A or CE mode B
pusch.Hopping = true;       % Enable/Disable frequency hopping
pusch.NRepPUSCH = 8;        % The total number of PUSCH repetitions
pusch.Modulation = 'QPSK';  % Symbol modulation
pusch.RV = 0;               % Redundancy version for UL-SCH processing
pusch.NLayers = 1;          % Number of layers
pusch.TrBlkSizes = 100;     % Transport block size

Выделение PUSCH - полоса пропускания PUSCH обычно представляет собой один 1.4MHz узкополосный канал. Есть 6 RBS в каждом узкополосном, все могут быть ассигнованы в способе A CE и 1 или 2 RBS в методе B CE. Расширенный BW 5 МГц, возможных в способе Кошки-M2 CE конфигурация (См. раздел 4.3.4.64 [4] TS 36.306). Мы используем InitPRBSet и InitNarrowbandIndex для определения PRB в узкополосном диапазоне и узкополосном диапазоне, используемом при передаче. Если скачкообразная перестройка частоты отключена, PDSCH LTE-M будет передаваться в PRB, определенных InitPRBSet и InitNarrowbandIndex параметры. Если скачкообразная перестройка включена, правила скачкообразной перестройки определяют узкополосность, используемую для каждого подкадра. Ширина полосы пропускания 5MHz определяется использованием более 6 PRB в InitPRBSet параметр. В этом случае скачкообразная перестройка будет отключена, и InitNarrowbandIndex игнорируется.

% Specify 1-based relative indices of RBs within a narrowband for all cases
% except 5MHz Cat-M2 CE mode A. If 5MHz Cat-M2 CE mode A, these are the
% absolute PRBs used for transmission
pusch.InitPRBSet = (2:3)';
% Narrowband used for transmission (non-hopping, non-5MHz)
pusch.InitNarrowbandIndex = 1;

% Specify the power scaling in dB for PUSCH, PUSCH DM-RS
pusch.PUSCHPower = 30;
pusch.PUSCHDMRSPower = 100;

% Turn off hopping if allocation spans multiple narrowbands
if numel(pusch.InitPRBSet) > 6
    pusch.Hopping = false;
end

Кодирование UL-SCH

Для UE BL/CE в режиме В CE элементы ресурса в последнем символе SC-FDMA в подкадре, сконфигурированном с помощью конкретных SRS соты, должны быть подсчитаны в отображении PUSCH, но не использоваться для передачи PUSCH. Следовательно, если CE режим B, выключите укорочение при создании кодированного транспортного блока.

% Identify all uplink subframes in a frame
info = arrayfun(@(x)lteDuplexingInfo(setfield(ue,'NSubframe',x)),0:9);
ulsfs = arrayfun(@(x)strcmpi(x.SubframeType,'Uplink'),info);
% In this example, we assume that the first absolute subframe in which
% PUSCH is transmitted is the first available uplink subframe
pusch.InitNSubframe = find(ulsfs,1)-1;

% Calculate the allocation
pusch.PRBSet = getPUSCHAllocation(ue,pusch);
ueTemp = ue;
% Create coded transport block for all symbols
if strcmpi(pusch.CEMode,'B') && ue.Shortened
    ueTemp.Shortened = 0;
end
[~,info] = ltePUSCHIndices(ueTemp,pusch);
% Define UL-SCH message bits
trData = ones(pusch.TrBlkSizes(1),1);
% Create the coded UL-SCH bits
pusch.BetaCQI = 2.0;
pusch.BetaRI = 2.0;
pusch.BetaACK = 2.0;
codedTrBlock = lteULSCH(ueTemp,pusch,info.G,trData);

Генерация PUSCH LTE-M

В этом примере мы генерируем PUSCH LTE-M и соответствующие сигналы DM-RS с повторениями и необязательной скачкообразной перестройкой частоты. pusch.NRepPUSCH управляет количеством повторений PUSCH. Параметр, специфичный для UE pusch.Hopping активизирует скачкообразную перестройку и параметры для всей соты ue.HoppingOffset и ue.NChULNB определяет шаблон скачкообразного изменения. В этом примере, если распределение охватывает более одного узкополосного диапазона, скачкообразная перестройка частоты будет отключена. Для LTE-M одна и та же последовательность скремблирования применяется для подкадра к PUSCH для блока из Nacc подкадры, все другие этапы обработки, т.е. модуляция символов, отображение уровня, предварительное кодирование и отображение на элементы ресурсов, являются одинаковыми для LTE PUSCH.

% Number of subframes in a scrambling block
Nacc = 1;
if strcmpi(ue.DuplexMode,'FDD') && strcmpi(pusch.CEMode,'B')
    Nacc = 4;
elseif strcmpi(ue.DuplexMode,'TDD') && strcmpi(pusch.CEMode,'B')
    Nacc = 5;
end

% Total BL/CE subframes to simulate (all uplink subframes are BL/CE
% subframes) and the PUSCH is transmitted without any subframe gaps
totmtcSubframes = pusch.NRepPUSCH;

% Total absolute subframes to simulate
startSubframe = ue.NFrame*10+ue.NSubframe; % Initial absolute subframe number
lastabssf = getlastabsSF(ulsfs,pusch.InitNSubframe,totmtcSubframes);
totSubframes = lastabssf-startSubframe+1;

% Create a resource grid for the entire transmission. The PUSCH and
% DM-RS symbols will be mapped in this array
subframeSize = lteULResourceGridSize(ue);
sfgrid = zeros([subframeSize(1) subframeSize(2)*totSubframes subframeSize(3:end)]);

mpuschSym = []; % Initialize PUSCH symbols

for sf = startSubframe + (0:totSubframes -1)

    % Set current absolute subframe and frame numbers
    ue.NSubframe = mod(sf,10);
    ue.NFrame = floor((sf)/10);

    % Skip processing if this is not an uplink subframe
    duplexInfo = lteDuplexingInfo(ue);
    if ~strcmpi(duplexInfo.SubframeType,'Uplink')
        continue
    end

   % Calculate the PRBSet used in the current subframe
    prbset = getPUSCHAllocation(ue,pusch);

    % Calculate the PDSCH indices for the current subframe. For BL/CE UEs
    % in CE mode B, resource elements in the last SC-FDMA symbol in a
    % subframe configured with cell specific SRS shall be counted in the
    % PUSCH mapping but not used for transmission of the PUSCH
    pusch.PRBSet = prbset;
    mpuschIndices = ltePUSCHIndices(ue,pusch);

    % Create an empty subframe grid
    subframe = lteULResourceGrid(ue);

    % Encode PUSCH symbols from the codeword
    % In the case of repetition, the same symbols are repeated in each of
    % a block of NRepPUSCH subframes. Frequency hopping is applied as required
    if ~mod(sf,Nacc) || isempty(mpuschSym)
        ueTemp = ue;
        if strcmpi(pusch.CEMode,'B') && ue.Shortened
            ueTemp.Shortened = 0;  % Create symbols for full subframe
        end
        mpuschSym = ltePUSCH(ueTemp,pusch,codedTrBlock)*db2mag(pusch.PUSCHPower);
    end
    % Map SRS punctured PUSCH symbols to the subframe grid
    subframe(mpuschIndices) = mpuschSym(1:numel(mpuschIndices));


    % Create and map the DMRS symbols.
    ue.Hopping = 'Off';    % DRS hopping
    ue.SeqGroup = 0;       % PUSCH sequence group
    ue.CyclicShift = 0;    % Used for n1DMRS
    % For LTE-M UEs, a cyclic shift field of '000' shall be assumed when
    % determining n2DMRS from Table 5.5.2.1.1-1 of TS 36.211
    pusch.DynCyclicShift = 0; % Cyclic shift of '000' for n2DMRS
    pusch.OrthCover = 'Off';  % No orthogonal cover sequence
    mpuschDrs = ltePUSCHDRS(ue,pusch)*db2mag(pusch.PUSCHDMRSPower);
    mpuschDrsIndices = ltePUSCHDRSIndices(ue,pusch);
    subframe(mpuschDrsIndices) = mpuschDrs;

    % Now assign the current subframe into the overall grid
    sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:) = subframe;

end

Создание сигнала основной полосы частот временной области

Создайте форму сигнала основной полосы частот во временной области посредством OFDM-модуляции сетки ресурсов. Полученная матрица имеет четыре столбца; один из которых будет содержать комплексные выборки формы сигнала во временной области основной полосы для MPDCCH

waveform = lteSCFDMAModulate(ue,sfgrid);

График передачи сигналов сети и основной полосы частот

Постройте график сигнала основной полосы частот сетки и временной области. Если передача использует более одного порта, отображается только первый порт. Обратите внимание, что график сетки ресурсов использует уровни мощности PUSCH и DM-RS для назначения цветов элементам ресурса.

% Create an image of overall resource grid. Since the PUSCH undergo
% transform precoding, we need to assign a single power level to all
% symbols to visualize in the plot
plotgrid = abs(sfgrid(:,:,1));
% Get the DM-RS positions
drspos = (plotgrid==db2mag(pusch.PUSCHDMRSPower));
plotgrid(drspos) = 0;
% Now set all PUSCH symbols to one power level to plot
plotgrid(plotgrid~=0) = db2mag(pusch.PUSCHPower);
% Now write back the DRS and plot
plotgrid(drspos) = db2mag(pusch.PUSCHDMRSPower);
figure
im = image(plotgrid);
cmap = parula(64);
colormap(im.Parent,cmap);
axis xy;
title(sprintf('LTE-M CEMode%s Uplink RE Grid (NRepPUSCH = %d)',pusch.CEMode,pusch.NRepPUSCH))
xlabel('OFDM symbols')
ylabel('Subcarriers')
% Create the legend box to indicate the channel/signal types associated with the REs
reNames = {'PUSCH';'PUSCH DRS'};
clevels = round(db2mag([pusch.PUSCHPower pusch.PUSCHDMRSPower]));
N = numel(reNames);
L = line(ones(N),ones(N), 'LineWidth',8); % Generate lines
% Set the colors according to cmap
set(L,{'color'},mat2cell(cmap( min(1+clevels,length(cmap) ),:),ones(1,N),3));   % Set the colors according to cmap
legend(reNames{:});

Локальные функции

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

  • calcNarrowbandPRBSets - Расчет узких полос и связанных PRB

  • getPDSCHAllocation - Расчет распределения подкадров PUSCH

  • getlastabsSF - Вычислить номер последнего подкадра для PUSCH

Избранная библиография

  1. 3GPP ТС 36.211 «Физические каналы и модуляция»

  2. 3GPP TS 36.212 «Мультиплексирование и канальное кодирование»

  3. 3GPP ТС 36.213 «Процедуры физического уровня»

  4. 3GPP TS 36.306 «Возможности радиодоступа пользовательского оборудования (UE)»

  5. 3GPP TS 36.331 «Спецификация протокола управления радиоресурсами (RRC)»

  6. О. Либерг, М. Сундберг, Я. -П. Ван, Дж. Бергман и Дж. Сакс, Сотовый интернет вещей: технологии, стандарты и производительность, Elsevier, 2018.

  7. Э. Дальман, С. Парквалл и Дж. Сколд 4G LTE-Advanced Pro и The Road to 5G

Локальные функции

% Calculate the widebands, narrowbands and PRBSets for the LTE carrier bandwidth
function [prbsets,nNB,nWB] = calcNarrowbandPRBSets(NULRB)
    % Narrowbands & Widebands (See 36.211 Section 5.2.4)
    NULNB = floor(NULRB/6);
    nNB = 0:(NULNB-1); % Narrowbands
    if NULNB >= 4
        NULWB = floor(NULNB/4);
    else
        NULWB = 1;
    end
    nWB = 0:(NULWB-1); % Widebands

    % PRBs in a narrowband
    ii = 0:5;
    ii0 = floor(NULRB/2) - 6*(NULNB/2);
    prbsets = zeros(6,numel(nNB));
    for nb = 1:numel(nNB)
        if mod(NULRB,2) && nNB(nb)>= (NULNB/2)
            prbsets(:,nb) = 6*(nNB(nb))+ii0+ii + 1;
        else
            prbsets(:,nb) = 6*(nNB(nb))+ii0+ii;
        end
    end
end

% Calculate the resource blocks allocated for PUSCH in the subframe
function prbset = getPUSCHAllocation(ue,chs)

    % If 5MHz mode (up to 24 PRBs can be used), the allocation is the same
    % as InitPRBSet
    if numel(chs.InitPRBSet) > 6
        prbset = chs.InitPRBSet;
        return;
    end

    % Get the narrowbands and corresponding resources
    [prbsets,nNB] = calcNarrowbandPRBSets(ue.NULRB);
    if max(chs.InitNarrowbandIndex) > max(nNB)
        error('Invalid narrowband(s) specified. There are only %d narrowbands in the bandwidth from 0...%d', nNB+1, nNB);
    end
    % If frequency hopping is disabled, the allocation is the same for
    % every subframe
    if ~chs.Hopping
        prbset = prbsets(chs.InitPRBSet,chs.InitNarrowbandIndex+1);
        return
    end

    % Hopping narrowband calculation according to TS 36.211 Section 5.3.4
    j0 = floor((chs.InitNSubframe)/ue.NChULNB);

    % Calculate the narrowband for this subframe
    ue.NSubframe = ue.NFrame*10+ue.NSubframe; % Get the absolute subframe number
    if mod(floor(ue.NSubframe/ue.NChULNB-j0),2) == 0
        nnBi = chs.InitNarrowbandIndex;
    else
        nnBi = mod(chs.InitNarrowbandIndex+ue.HoppingOffset,numel(nNB));
    end
    % Calculate the PRBSet for this subframe, they are on the same RBs
    % within the narrowband
    [rbstartIndex,nbstartIndex] = find(prbsets == chs.InitPRBSet(1));
    [rbendIndex,nbendIndex] = find(prbsets == chs.InitPRBSet(end));
    if (isempty(rbstartIndex) || isempty(rbendIndex)) || (nbstartIndex ~= nbendIndex)
       error('Invalid PRBSet specified, must be resources within single narrowband');
    end
    prbset = prbsets(rbstartIndex:rbstartIndex+numel(chs.InitPRBSet)-1,nnBi+1);

end

% Get the absolute subframe number which is used for the last transmission
% of a channel
function lastabssf = getlastabsSF(ulsfs,InitNSubframe,totmtcSubframes)

    numulsfsinFrame = sum(ulsfs); % Number of active sfs in a frame
    ulsfsinFrame = find(ulsfs);   % UL subframes in the frame (1-based)

    % Find the first absolute subframe and frame
    initabssf = mod(InitNSubframe,10);
    initabsf = floor(InitNSubframe/10);

    startIdxwithinFrame = initabssf+1; % 1-based index to the UL sf
    if ~ulsfs(startIdxwithinFrame)
        error(['Invalid absolute subframe number of the first uplink subframe', ...
              ' intended for PUSCH (%d) specified. This is not an uplink subframe'],InitNSubframe)
    end

    sfslastFrame = mod((find(ulsfsinFrame==startIdxwithinFrame)-1)+totmtcSubframes,numulsfsinFrame); % subframes to tx in the last frame
    if sfslastFrame
        % Find the subframe number corresponding to the last subframe to transmit
        sfsnumlastFrame = find(ulsfs,sfslastFrame)-1;
        sfsnumlastFrame = sfsnumlastFrame(end);
    else
        % No partial frames required
        sfsnumlastFrame = 0;
    end
    lastabssf = (initabsf + floor(((find(ulsfsinFrame==startIdxwithinFrame)-1)+totmtcSubframes)/numulsfsinFrame)) * 10 + sfsnumlastFrame;

end