Этот пример показывает, как создать передачу 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].
Для устройств 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
Для 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);
В этом примере мы генерируем 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
Создайте форму полосы частот во временном интервале путем 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 TS 36.213 «Процедуры физического слоя»
3GPP TS 36.306 «Возможности радиодоступа пользовательского оборудования (UE)»
3GPP TS 36.331 «Протокол управления радиоресурсами (RRC) спецификации»
О. Либерг, М. Сундберг, Я.-П. Wang, J. Bergman and J. Sachs, Cellular Internet of Things: Technologies, Standards and Performance, Elsevier, 2018.
Э. Дальман, С. Парквалл и 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