Этот пример показывает, как создать передачу 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].
Для устройств 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
Для 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 и соответствующие сигналы 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
3GPP ТС 36.211 «Физические каналы и модуляция»
3GPP TS 36.212 «Мультиплексирование и канальное кодирование»
3GPP ТС 36.213 «Процедуры физического уровня»
3GPP TS 36.306 «Возможности радиодоступа пользовательского оборудования (UE)»
3GPP TS 36.331 «Спецификация протокола управления радиоресурсами (RRC)»
О. Либерг, М. Сундберг, Я. -П. Ван, Дж. Бергман и Дж. Сакс, Сотовый интернет вещей: технологии, стандарты и производительность, Elsevier, 2018.
Э. Дальман, С. Парквалл и Дж. Сколд 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