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

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

Введение

Специфичный для ячейки битовый массив подкадра, широковещательно переданный на Информации о системе (SI), указывает, какие подкадры способны к передачам LTE-M. Устройства LTE-M могут опционально позволить повторениям для PUSCH и PUCCH улучшить покрытие. Сеть конфигурирует набор возможных повторений, содержащих 4 значения для режима CE (pusch-maxNumRepetitionCEmodeA как дали в таблице TS 36.213, 8-2b [3]) и 8 значений для режима CE B (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 (Релиз 13) устройства PUSCH всегда передается в одной узкополосной связи. В Cat-M2 (Релиз 14) устройства в режиме CE A могут опционально передать максимум по 24 PRBs если более высокий параметр слоя ce-pusch-maxBandwidth-config установлен в 5 МГц, как обозначено в Разделе TS 36.211 5.3.4 [1] Раздел/TS 36.306 4.3.4.64 [4]. LTE-M PUSCH может иметь до 32 повторений в режиме CE (см. таблицу TS 36.213, 8-2b [3]), и до 2 048 повторений в режиме CE B (см. таблицу TS 36.213, 8-2c [3]). Для BL/CE UE в режиме CE A, скачкообразное движение частоты PUSCH включено когда параметр более высокого слоя pusch-HoppingConfig установлен и флаг скачкообразного движения частоты в 6-0A формате DCI указывает на скачкообразное движение частоты. Для BL/CE UE в режиме CE B, скачкообразное движение частоты PUSCH включено когда параметр более высокого слоя pusch-HoppingConfig установлен. Если скачкообразное движение частоты не включено для PUSCH, все повторения PUSCH расположены в тех же ресурсах PRB. Если скачкообразное движение частоты включено для PUSCH, PUSCH передается в подкадре в NabsPUSCH последовательные восходящие подкадры с помощью того же количества последовательного PRBs как в предыдущем подкадре, начинающем с того же запуска ресурс PRB в узкополосной связи. Если бы скачкообразное движение присвоения или частоты ресурса привело бы к распределению ресурсов PUSCH вне allocatable PRBs затем, передача 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.4 МГц. Существует 6 RBS в каждой узкополосной связи, все могут быть выделены в режиме CE A и 1 или 2 RBS в режиме CE B. Расширенный BW 5 МГц, возможных в режиме Cat-M2 CE настройка (См. Раздел TS 36.306 4.3.4.64 [4]). Мы используем InitPRBSet и InitNarrowbandIndex задавать PRBs в узкополосной связи и узкополосной связи, используемой в передаче. Если скачкообразное движение частоты будет отключено, LTE-M PDSCH будет передан в PRBs, заданном InitPRBSet и InitNarrowbandIndex параметры. Если скачкообразное движение включено, скачкообразно двигающиеся правила определяют узкополосную связь, используемую на подкадр. Пропускная способность на 5 МГц выведена через использование больше чем 6 PRBs в 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

Для BL/CE UEs в режиме CE B, элементах ресурса в последнем символе 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);

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

В этом примере мы генерируем LTE-M PUSCH и соответствующие сигналы DM-RS с повторениями и дополнительным скачкообразным движением частоты. pusch.NRepPUSCH управляет количеством повторений PUSCH. Параметр UE-specific 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 - Вычислите узкополосную связь и сопоставленный PRBs

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

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

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

  1. 3GPP TS 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. О. Либерг, М. Зундберг, Y.-P. Ван, Дж. Бергман и Дж. Сакс, сотовый Интернет вещей: технологии, стандарты и производительность, Elsevier, 2018.

  7. Э. Дэхлмен, С. Парквол и 4G Дж Сколда, усовершенствованная LTE Pro и дорога к 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 (upto 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