Этот пример показывает, как создать восходящую передачу 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].
Для 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, заданном параметрами InitNarrowbandIndex
и InitPRBSet
. Если скачкообразное движение включено, скачкообразно двигающиеся правила определяют узкополосную связь, используемую на подкадр. Пропускная способность на 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
Для 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 и соответствующие сигналы 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 image(plotgrid); 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 % Get the color map cmap = colormap(gcf); 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
3GPP TS 36.211 "Физические каналы и модуляция"
3GPP TS 36.212 "Мультиплексирование и кодирование канала"
3GPP TS 36.213 "Процедуры физического уровня"
3GPP TS 36.306 "Возможности доступа радио оборудования пользователя (UE)"
3GPP TS 36.331 "Спецификация Протокола Радио-управления ресурсами (RRC)"
О. Либерг, М. Зундберг, Y.-P. Ван, Дж. Бергман и Дж. Сакс, сотовый Интернет вещей: технологии, стандарты и производительность, Elsevier, 2018.
Э. Дэхлмен, С. Парквол и 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