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

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

Введение

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

PUSCH

Для устройств Cat-M1 (Release 13) PUSCH всегда передается в одной узкополосной полосе. В Cat-M2 (Release 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]. PUSCH LTE-M может иметь до 32 повторов в режиме CE (см. TS 36.213 Таблица 8-2b [3]) и до 2048 повторов в режиме CE B (см. TS 36.213 Таблица 8-2c [3]). Для BL/CE UE в режиме CE A, скачкообразное изменение частоты PUSCH активируется, когда параметр более высокого уровня pusch-HoppingConfig установлен, и флаг скачкообразного изменения частоты в формате DCI 6-0A указывает скачкообразное изменение частоты. Для BL/CE UE в режиме 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 RB, все могут быть выделены в режиме CE A и 1 или 2 RB в режиме CE B. Расширенная BW 5MHz возможной в Cat-M2 режиме CE A (См. раздел 4.3.4.64 TS 36.306 [4]). Используем 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 в режиме B 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

В этом примере мы генерируем LTE-M PUSCH и соответствующие сигналы 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

Создайте Временной интервал Baseband Waveform

Создайте форму полосы частот во временном интервале путем 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 TS 36.213 «Процедуры физического слоя»

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

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

  6. О. Либерг, М. Сундберг, Я.-П. Wang, J. Bergman and J. Sachs, Cellular Internet of Things: Technologies, Standards and Performance, Elsevier, 2018.

  7. Э. Дальман, С. Парквалл и J Skold 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