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

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

Введение

Введение LTE-M к стандарту LTE добавленная поддержка, в частности нацеленная на Machine-Type Communications (MTC). Начиная с устройств CAT 0 в Релизе 12 это было далее расширено в более поздних релизах, чтобы задать отдельный класс Cat-M устройств. Две категории были теперь добавлены к LTE, Cat-M1 в Релизе 13 (через eMTC работают элементы), сопровождаемый Cat-M2 в Релизе 14 (feMTC).

Существует два режима работы улучшения покрытия (CE) для устройств Cat-M (также называемы BL/CE UEs в 3GPP стандартные документы), режим A и CE режима CE B. Режим CE цели скромное улучшение покрытия максимум с 32 повторениями, тогда как режим CE B предназначается для обширного улучшения покрытия максимум с 2 048 повторениями для канала данных. Режим CE A сообщен через формат DCI, 6-0A/6-1A обменивается сообщениями и режим CE B с помощью 6-0B/6-1B сообщений. MPDCCH обработка цепи, создания DM-RS и отображения почти идентичен тому из Расширенного Физического Нисходящего Канала Управления (EPDCCH) плюс сложение повторений и поведения скачкообразного движения частоты. Этот пример делает определенное использование функциональности LTE Toolbox™ EPDCCH, чтобы реализовать модель MPDCCH. Канал данных LTE-M является LTE PDSCH со сложением скачкообразного движения частоты и повторений. Канал телевизионного вещания LTE-M состоит из двух частей; 'базовая' часть, соответствующая LTE PBCH и LTE-M определенная часть 'повторения', где символы и сигналы ячейки RS в 'базовой' части повторяются.

LTE-M может быть развернут в стандартных ячейках LTE, поэтому не, все подкадры обязательно используются для передачи BL/CE. Подкадры BL/CE обозначаются битовым массивом, отправленным в сообщении MIB-M (похожий на механизм в NB-IoT). Для простоты, в этом примере, мы принимаем, что все подкадры заданы, чтобы быть BL/CE. MPDCCH/PDSCH, начинающие символ OFDM для передач LTE-M, специфичны для ячейки, и широковещательно передан в Информации о системе (SI).

Основной выход этого примера MATLAB® является мультиподкадром Cat-M1/Cat-M2, сетка ресурса, содержащая Элементы ресурса (RE) MPDCCH, сопоставила DM-RS, LTE-M PDSCH REs, PBCH REs (и 'ядро' и части 'повторения' наряду с соответствующими сигналами ссылки на ячейку) и другие опорные сигналы, как сконфигурировано для полной последовательности передачи. Этой сеткой является также OFDM, модулируемый, чтобы сгенерировать связанную основополосную форму волны временного интервала. Графики создаются, чтобы обеспечить визуализацию присвоения RE в сетке и величины сгенерированного модулированного сигнала.

Концепции физического уровня LTE-M

  • Повторения - Чтобы включить значительно расширенное покрытие для устройств LTE-M, повторения для MPDCCH, PDSCH и PBCH были введены для устройств Cat-M в Релизе 13. Это обеспечило бы повышение производительности на по крайней мере 15 дБ по предварительному выпуску 13 устройств. MPDCCH может быть повторен максимум до 256 раз, PDSCH до 2 048 и PBCH до 5 включая 'базовую' часть.

  • Узкополосная связь - LTE-M использует концепцию узкополосной связи, чтобы выделить поднесущие в широкополосной несущей LTE для каналов управления и данных. Каждая узкополосная связь состоит из 6 последовательных PRBs, но не весь PRBs обязательно часть узкополосной связи (зависящий от полного BW несущей).

  • Widebands - Релиз 14 LTE-M использует концепцию widebands, чтобы выделить более высокую полосу пропускания для канала данных. Может быть один или несколько widebands, каждый состоящий из 4 узкополосной связи или сингла, широкополосного состоящий из 1,2 или 3 узкополосной связи. Для устройства Cat-M2, сконфигурированного в режиме CE (6-1A формат DCI), канал данных передается на сингле, широкополосном если ce-pdsch-maxBandwidth-config установлен в 5 МГц или resource block assignment flag установлен в 1 или через полную полосу пропускания несущей LTE через битовый массив RBG в случае resource block assignment flag установлен в 0. resource block assignment flag только присутствует если ce-pdsch-maxBandwidth-config установлен в 20 МГц. Для устройства Cat-M2, сконфигурированного в режиме CE B (6-1B формат DCI), канал данных передается на сингле, широкополосном если ce-pdsch-maxBandwidth-config установлен в 5 МГц и до 4 widebands если ce-pdsch-maxBandwidth-config установлен в 20 МГц.

  • Скачкообразное движение частоты - Несмотря на то, что Релиз 13 eMTC устройство имеет мгновенную полосу пропускания 1.4 МГц (самые простые устройства LTE-M имеют максимальную полосу пропускания 1.4 МГц), она может получить доступ к более широкой несущей LTE через различную узкополосную связь между подкадрами. Если передача включает повторение по нескольким подкадрам, дополнительное скачкообразное движение частоты межподкадра может быть применено. Скачкообразное движение частоты происходит между различной узкополосной связью и в блоках 1 - 16 подкадров в зависимости от режима CE. Скачкообразно двигающаяся длина блока и скачкообразное движение смещения являются специфичными для ячейки параметрами. В нисходящем канале, и для управления и для данных, скачкообразное движение частоты может быть более чем 2 узкополосной связью или 4 равномерно распределенной узкополосной связью.

Обработка физического уровня PDSCH и процедуры

Передача данных LTE-M использует тот же физический канал (PDSCH) в качестве в случае LTE. Различие однако - то, что LTE-M включает дополнительные повторения и скачкообразное движение частоты.

  • Режимы передачи - допустимые режимы передачи для PDSCH для LTE-M равняются 1 (одна антенна), 2 (разнообразие передачи), 6 (замкнутый цикл основанное на книге шифров предварительное кодирование) и 9 (основанное на некниге шифров предварительное кодирование, единственный слой). Режим Transmission 6 только поддерживается в режиме CE A, тогда как 1, 2 и 9 поддерживаются в обоих режимах A и CE режима CE B. В отличие от LTE PDSCH, операция нескольких вводят несколько выходов (MIMO) не поддерживается в LTE-M, потому что большинство устройств LTE-M, как ожидают, будет недорогими устройствами с синглом, получают антенну.

  • Повторения и борющиеся блоки - PDSCH передаются в NRepPDSCH (> =1), последовательный BL/CE передают в нисходящем направлении подкадры. Они NRepPDSCH подкадры передаются в блоках Nacc подкадры (см. раздел TS 36.211 6.8B.2 [1]) и та же последовательность скремблирования применяются ко всем подкадрам в блоке. Nacc может быть 1 или 4 в дуплексном режиме FDD и 1 или 10 в дуплексном режиме TDD. Может быть до 32 повторений в режиме CE A и до 2 048 повторений в режиме CE B. Количество повторений PDSCH задано комбинацией полустатической настройки и динамического выбора для особой передачи.

  • Narrowbands и Widebands - PRBs, используемый для передач LTE-M PDSCH, должен принадлежать узкополосной связи (связи) (и широкополосный (s) если Cat-M2). Устройства Cat-M1 имеют мгновенную полосу пропускания передачи 1.4 МГц в узкополосной связи. Устройства Cat-M2 имеют полосу пропускания 5 МГц или 20 МГц, как обозначено более высоким параметром слоя ce-pdsch-maxBandwidth-config, в этом случае передача PDSCH может быть в широкополосном (s), где каждый широкополосный состоит максимум из 4 неперекрывающейся узкополосной связи.

  • Скачкообразное движение частоты - Если PDSCH повторяется по нескольким подкадрам, скачкообразное движение частоты межподкадра, может быть опционально применено, где скачкообразное движение происходит для блоков подкадров длины 1,2,4,8 для устройств в режиме CE A и 2,4,8,16 в режиме CE B. Скачкообразно двигающаяся длина блока и скачкообразное движение смещения являются специфичными для ячейки параметрами. Скачкообразное движение частоты может быть более чем 2 узкополосной связью или 4 равномерно распределенной узкополосной связью. Относительные позиции RBS, несущего PDSCH в рамках каждого скачкообразного движения узкополосная связь, остаются то же самое.

Обработка физического уровня MPDCCH и процедуры

MPDCCH несет нисходящую управляющую информацию (DCI) LTE-M. MPDCCH и соответствующие Опорные сигналы Демодуляции (DM-RS) передаются на одном или нескольких портах от набора (107,108,109,110). Этапы обработки физического уровня и операции MPDCCH и EPDCCH очень похожи, с различиями, являющимися повторениями, дополнительным скачкообразным движением частоты и как скремблирование применяется.

  • Повторения и борющиеся блоки - MPDCCH передаются с помощью агрегации одного или нескольких последовательных Расширенных Элементов Канала Управления (ECCEs) в NRepMPDCCH (> =1), последовательный BL/CE передают в нисходящем направлении подкадры. Они NRepMPDCCH подкадры передаются в блоках Nacc подкадры (см. раздел TS 36.211 6.8B.2 [1]) и та же последовательность скремблирования применяются ко всем подкадрам в блоке. Как пример, для MPDCCH, не сопоставленного с P-RNTI или SC-RNTI и сконфигурированный с режимом CE A, Nacc = 1 как описано в разделе TS 36.211 6.8B.2 [1], таким образом, скремблирование инициализируется каждый подкадр BL/CE, как в случае EPDCCH. Nacc может быть 1 или 4 в дуплексном режиме FDD и 1 или 10 в дуплексном режиме TDD. Количество повторений MPDCCH задано комбинацией полустатической настройки и динамического выбора для особой передачи. Сеть полустатически конфигурирует максимальные повторения Rmax от набора (1 2 4 8 16 32 64 128 256) затем динамически выбирает фактические повторения для определенной передачи от набора (Rmax, Rmax/2, Rmax/4, Rmax/8).

  • Узкополосная связь - MPDCCH передается в 2, 4 или 6 RBS в одной узкополосной связи в каждом подкадре. MPDCCH PRB установил, состоит из ECCEs, пронумерованного от 0... N'ECCEpk, где N'ECCEpk является количеством ECCEs в MPDCCH-PRB-set p подкадра k. Количество ECCEs, используемого для одного MPDCCH, дано таблицей 6.8A.1-2 [1] TS 36.211 для 2 или 4 PRBs, если повторение не сконфигурировано и Таблица 6.8B.1-2 для всех других случаев.

  • Скачкообразное движение частоты - Если MPDCCH повторяется по нескольким подкадрам, скачкообразное движение частоты межподкадра, может быть опционально применено, где скачкообразное движение происходит для блоков подкадров длины 1,2,4,8 для устройств в режиме CE A и 2,4,8,16 в режиме CE B. Скачкообразно двигающаяся длина блока и скачкообразное движение смещения являются специфичными для ячейки параметрами. Скачкообразное движение частоты может быть более чем 2 узкополосной связью или 4 равномерно распределенной узкополосной связью. Относительные позиции RBS, несущего MPDCCH в рамках каждого скачкообразного движения узкополосная связь, остаются то же самое.

Обработка физического уровня PBCH и процедуры

Подобно PDSCH LTE-M использует тот же физический канал телевизионного вещания (PBCH) в качестве в случае LTE, но с дополнительными повторениями.

  • Базовый PBCH и Неосновной - LTE-M PBCH PBCH разделены на две части; 'базовый' PBCH, который является нормальным LTE PBCH и передается в первом подкадре каждой системы координат с периодичностью на 40 мс. Неосновной частью является LTE-M определенные повторения, где 'базовые' символы PBCH повторяются до 5 раз в зависимости от дуплексного режима и длины циклического префикса.

  • Повторения - повторения PBCH происходят в подкадре 9 из предыдущей системы координат и подкадра 0 из текущей радио-системы координат для FDD, как дано таблицей 6.6.4-1 [1] TS 36.211. Для TDD повторения происходят в подкадрах 0 и 5 из той же радио-системы координат, как дано Таблицей 6.6.4-2. Поднесущие остаются то же самое для базовой части и повторений. Обратите внимание на то, что различающийся базовая часть, повторения PBCH не должны сопоставлять с REs, используемым опорными сигналами CSI. Повторения заданы согласно дуплексному режиму и длине циклического префикса. Для FDD все базовые символы PBCH повторяются 4 раза если нормальный циклический префикс и 3 раза, если расширено циклический префикс. Для TDD, если расширено циклический префикс, все символы повторяются 3 раза. Для TDD и нормального циклического префикса, символы ядра PBCH 0 и 1 повторяются 5 раз, и символы 2 и 3 повторяются 3 раза.

Настройки симуляции

Этот пример разделен на следующие шаги:

  • Сконфигурируйте параметры симуляции (всей ячейки и MPDCCH/PDSCH конкретный)

  • Создайте и закодируйте полезную нагрузку сообщения DCI для передачи на MPDCCH

  • Создайте и закодируйте полезную нагрузку DL-SCH для передачи на PDSCH

  • Сгенерируйте символы для последовательности подкадра MPDCCH и DM-RS, и сопоставьте их в элементы ресурса сетки ресурса мультиподкадра

  • Сгенерируйте символы для последовательности подкадра LTE-M PDSCH, сопоставьте их в элементы ресурса сетки ресурса мультиподкадра

  • Сгенерируйте символы для последовательности подкадра LTE-M PBCH, сопоставьте их в элементы ресурса сетки ресурса мультиподкадра

  • Примените модуляцию CP-OFDM к итоговой сетке, чтобы создать связанную основополосную форму волны

  • Отобразите графики сетки ресурса и формы волны timeseries

В этом первом разделе мы задаем параметры симуляции, которые будут использоваться в более поздних разделах для DCI, MPDCCH и создания DM-RS. Этот пример использует LTE несущая FDD с полосой пропускания 5 МГц и нормальным циклическим префиксом. Настройки всей ячейки содержатся в структуре enb, MPDCCH определенные параметры содержатся в структуре mpdcch и PDSCH определенные параметры содержатся в структуре pdsch.

enb = struct();
enb.NDLRB = 25;                       % LTE carrier BW
enb.NCellID = 1;                      % The cell ID
enb.CellRefP = 1;                     % Number of cell-specific ports
enb.CFI = 3;                          % CFI indicator
enb.DuplexMode = 'FDD';               % Duplex mode
enb.TDDConfig = 1;                    % Uplink/Downlink configuration (TDD)
enb.CyclicPrefix = 'Normal';          % Cyclic prefix duration
enb.NSubframe = 0;                    % Subframe number
enb.NFrame = 0;                       % Frame number
enb.CSIRSPeriod = 'Off';              % CSI-RS period control
enb.CSIRSConfig = 0;                  % CSI-RS configuration
enb.CSIRefP = enb.CellRefP;           % Number of CSI-RS antenna ports
enb.ZeroPowerCSIRSPeriod = 'Off';     % Zero power CSI-RS period control
enb.ZeroPowerCSIRSConfig = 0;         % Zero power CSI-RS configuration
enb.Ng = 'Sixth';                     % HICH group multiplier
enb.PHICHDuration = 'Extended';       % PHICH duration

% Set up hopping specific parameters
enb.HoppingOffset = 1;% Hopping offset 1...maxAvailableNarrowbands (TS 36.331)
enb.NChDLNBhop = 2;   % Number of narrowbands over which MPDCCH/PDSCH hops (2 or 4)
enb.NChDLNB = 2;      % Number of subframes in one hop/hopping block length
% MPDCCH Configuration
mpdcch = struct();
mpdcch.Hopping = true;          % Enable/Disable frequency hopping (only for 1.4MHz)
mpdcch.NRepMPDCCH = 8;          % The total number of MPDCCH repetitions
mpdcch.EPDCCHECCE = [0 7];      % ECCE range used for this MPDCCH (8 ECCE)
mpdcch.EPDCCHType = 'Localized';% Transmission type ('Localized', 'Distributed')
mpdcch.EPDCCHNID = 1;           % Cell ID/MPDCCH ID depending on search space type
mpdcch.EPDCCHStart = 4;         % MPDCCH start OFDM symbol in each subframe
mpdcch.RNTI = 1;                % RNTI for use with 'Localized' transmission

Выделение MPDCCH - (начальный) набор PRBs, используемого для передачи MPDCCH, задан вектором из индексов PRB на основе 0, задающих абсолютные положения PRB в широкополосной несущей. Эти PRBs должны находиться в пределах допустимой узкополосной связи. Если скачкообразное движение частоты будет отключено для MPDCCH, кандидат MPDCCH будет всегда передаваться в PRBs, заданном параметром 'InitPRBSet'. Если скачкообразное движение частоты будет включено для MPDCCH, кандидат MPDCCH будет передан в тех же относительных положениях PRBs, но в различной узкополосной связи, как задано в разделе TS 36.211 6.8B.5. Для несущей LTE на 5 МГц, используемой в этом примере, существует четыре узкополосной связи, как дано разделом TS 36.211 6.2.7 [1]. Первая узкополосная связь имеет PRBs 0... 5, второй имеет PRBs 6... 11, треть имеет PRBs 13... 18 и четвертое имеет PRBs 19... 24. Все другие PRBs в полосе на 5 МГц выходят за пределы узкополосной связи и не могут использоваться для передачи LTE-M. В этом примере мы используем формат 2 MPDCCH, где 8 ECCEs используются для передачи MPDCCH. Каждая пара паза PRB состоит из 4 ECCEs поэтому, мы должны задать минимальное выделение 2 PRB. В этом примере мы выбираем 3-й и 4-й PRBs в первой узкополосной связи

mpdcch.InitPRBSet = (2:3)';
mpdcch.InitNSubframe = 0; % Absolute subframe number of first MPDCCH subframe
% PDSCH Configuration
pdsch = struct();
pdsch.Hopping = true;      % Enable/Disable frequency hopping (only for 1.4MHz)
pdsch.NRepPDSCH = 16;      % The total number of PDSCH repetitions
pdsch.CEMode = 'A';        % A for CE mode A and B for CE mode B
pdsch.TxScheme = 'Port0';  % Port 0 or TxDiversity or Spatial Mux or Port 7
pdsch.Modulation  = 'QPSK';% Modulation scheme (QPSK/16QAM)
pdsch.NLayers = 1;         % Number of layers
pdsch.RV = 0;              % Redundancy version for DL-SCH processing
pdsch.RNTI = 1;            % RNTI used for the UE
pdsch.NSCID = 0;           % Scrambling identity
pdsch.TrBlkSizes = 100;    % Transport block size

Выделение PDSCH - выделение PRB гибко в случае режима CE (сообщенный через 6-1A формат DCI) и зафиксированный в случае режима CE B (сообщенный через 6-1B формат DCI). В режиме CE A, выделение может быть на 1 - 6 PRBs в одной или нескольких узкополосной связи, как задано типом 2 распределения ресурсов или для целой полосы пропускания несущей LTE через тип 0 распределения ресурсов. В режиме CE B, выделение охватывает или целые 6 PRBs или первые 4 PRBs сконфигурированной узкополосной связи (связи). Для устройств Cat-M1 передача находится в одной узкополосной связи. Для устройств Cat-M2, если более высокий параметр слоя ce-pdsch-maxBandwidth-config установлен в 20 МГц в режиме CE B, передача может охватить несколько узкополосной связи, и полное выделение может быть максимум до 96 PRBs (сгруппированный в widebands, где каждый широкополосный состоит из 4 узкополосной связи). Используемые widebands сообщены через широкополосное поле индекса комбинации в DCI как описано в таблице 7.1.6-2 [3] TS 36.213. Если ce-pdsch-maxBandwidth-config установлен в 5 МГц, передача происходит на сингле, широкополосном состоящий из 1,2,3 или 4 узкополосной связи в зависимости от полосы пропускания несущей LTE (NDLRB).

В этом примере мы задаем выделение с помощью InitPRBSet параметр и InitNarrowbandIndex. Если скачкообразное движение частоты будет отключено, LTE-M PDSCH будет всегда передаваться в PRBs, заданном InitPRBSet и InitNarrowbandIndex параметры. Если скачкообразное движение частоты будет включено, PDSCH будет передан в тех же относительных положениях PRBs, но в различной узкополосной связи, как задано в разделе TS 36.211 6.4.1 [1]. Если выделение охватывает больше чем одну узкополосную связь или один или несколько widebands, InitNarrowbandIndex должен быть вектор, задающий составляющие узкополосные индексы. Как пример, если ce-pdsch-maxBandwidth-config 20 МГц, и передача LTE-M в несущей LTE на 20 МГц, существует 4 widebands (0,1,2,3) доступны для передачи LTE-M PDSCH с соответствующими узкополосными индексами {(0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15)}. Если желаемое выделение является widebands 2 & 3, то InitNarrowbandIndex должен быть затем установлен в [8 9 10 11 12 13 14 15].

pdsch.InitPRBSet = (1:2)';     % 0-based PRB index
pdsch.InitNarrowbandIndex = 0; % 0-based wideband index
% In this example, we disable frequency hopping when transmission is over 2
% or more narrowbands
if numel(pdsch.InitNarrowbandIndex) > 1
    pdsch.Hopping = false;
    mpdcch.Hopping = false;
end

Включите или отключите повторения PBCH

enb.RepPBCHEnable = true;

% Specify the power scaling in dB for MPDCCH, MPDCCH DM-RS, PDSCH and
% reference signals (Cell RS or DM-RS)
mpdcch.MPDCCHPower = 30;
mpdcch.MPDCCHDMRSPower = 32;
pdsch.Rho = 25;
pdsch.RSPower = 80;
% Power levels for the PBCH core and reps parts
enb.PBCHPower = 33;
enb.PBCHRepsPower = 36;
% Power level for the PBCH Cell RS reps
enb.PBCHCellRSRepsPower = 28;

Общие подкадры, чтобы симулировать (все нисходящие подкадры являются подкадрами BL/CE) и MPDCCH и PDSCH передаются без любых разрывов подкадра

totmtcSubframes = mpdcch.InitNSubframe+mpdcch.NRepMPDCCH+2+pdsch.NRepPDSCH;
% Identify all downlink subframes in a frame
info = arrayfun(@(x)lteDuplexingInfo(setfield(enb,'NSubframe',x)),0:9);
dlsfs = arrayfun(@(x)strcmpi(x.SubframeType,'Downlink'),info);

% Total absolute subframes to simulate
sfsnumlastFrame = getlastabsSF(dlsfs,totmtcSubframes);
totSubframes = floor(totmtcSubframes/sum(dlsfs)) *10 + sfsnumlastFrame;

% Absolute subframe number of first PDSCH subframe, this would be two
% subframes after the MPDCCH subframes (assuming no non BL/CE subframes)
lastSfForMPDCCHPlus2 = getlastabsSF(dlsfs,mpdcch.NRepMPDCCH + 2); % Last subframe number in last frame for MPDCCH+2
pdsch.InitNSubframe = mpdcch.InitNSubframe + floor((mpdcch.NRepMPDCCH + 2)/sum(dlsfs)) *10 + lastSfForMPDCCHPlus2;

% Find the last absolute subframe for MPDCCH transmission
lastSfForMPDCCH = getlastabsSF(dlsfs,mpdcch.NRepMPDCCH); % Last subframe number in last frame for MPDCCH
mtclastabsSfForMPDCCH = mpdcch.InitNSubframe + floor((mpdcch.NRepMPDCCH)/sum(dlsfs)) *10 + lastSfForMPDCCH;

Кодирование сообщения DCI

Битовый вектор dciBits передается функциональному lteDCIEncode который выполняет маскирование CRC и вставку, кусающее хвост сверточное соответствие кодирования и уровня, после TS 36.212 разделяет 5.3.3.2 к 5.3.3.4. Обратите внимание на то, что третий аргумент к lteDCIEncode задает соответствие уровня выходной размер, равный способности бита данных MPDCCH в подкадре. Здесь мы используем фиктивное сообщение DCI на 26 битов из всех единиц, соответствуя Формату DCI 6-1A сообщение, как задано в разделе TS 36.212 5.3.3.1.12.

% Find the MPDCCH data bit capacity
[~,info] = lteEPDCCHIndices(enb,setfield(mpdcch,'EPDCCHPRBSet',mpdcch.InitPRBSet)); %#ok<SFLD>
% Define DCI message bits
dciBits = ones(26,1);
% Create the coded DCI bits
codedDciBits = lteDCIEncode(mpdcch,dciBits,info.EPDCCHG);

Кодирование DL-SCH

% Find the LTE-M PDSCH data bit capacity, this should not include the PBCH,
% PSS, SSS and CSI-RS REs. So we select the subframe 9 which is a DL
% subframe in both FDD and TDD duplex modes (Note: subframe 9 is not DL for
% TDDConfig 0, TDDConfig 0 does not have a 'normal' DL subframe)
fullPDSCHsf = 9;

[~,fullInfo] = ltePDSCHIndices(setfield(enb,'NSubframe',fullPDSCHsf),pdsch,getPDSCHAllocation(enb,pdsch));  %#ok<SFLD>
% Define DL-SCH message bits
trData = ones(pdsch.TrBlkSizes(1),1);
% Create the coded DL-SCH bits
codedTrBlock = lteDLSCH(enb,pdsch,fullInfo.G,trData);

Генерация MPDCCH

В этом примере мы используем локализованный тип с форматом 2 и 2 MPDCCH PRBs. MPDCCH с 2 или 4 PRBs и никакими повторениями используют ту же таблицу формата в качестве EPDCCH (таблица 6.8A.1-2 TS 36.211). Для всех других случаев форматы даны таблицей 6.8B.1-2 TS 36.211. Также с режимом CE A, никакие повторения и все подкадры LTE-M, скремблирование инициализируется каждый подкадр что касается EPDCCH и cinit то же самое (потому что Nacc = 1 для CEmodeA и NabsMPDCCH = 1). Все другие этапы обработки i.e. модуляция символа, отображение слоя, предварительное кодирование и отображение с элементами ресурса являются тем же самым для EPDCCH и MPDCCH. Следовательно, мы используем функции EPDCCH, чтобы сгенерировать символы MPDCCH и индексы.

% Number of subframes in a scrambling block
Nacc = 1;
if strcmpi(enb.DuplexMode,'FDD') && mpdcch.NRepMPDCCH >= 4
    Nacc = 4;
elseif strcmpi(enb.DuplexMode,'TDD') && mpdcch.NRepMPDCCH >= 10
    Nacc = 10;
end

% Create a resource grid for the entire transmission. The MPDCCH, PDSCH and
% DM-RS symbols will be mapped in this array. Note that we are creating the
% grid for 4 antenna planes as the MPDCCH transmission can be sent on ports
% selected from the set (107, 108, 109 and 110)
subframeSize = lteDLResourceGridSize(enb,4);
sfgrid = zeros([subframeSize(1) subframeSize(2)*totSubframes subframeSize(3:end)]);

mpdcchSym = []; % Initialize MPDCCH symbols
mpdschSym = []; % Initialize PDSCH symbols
mpbchCoreSymFull = [];  % Initialize PBCH symbols
startSubframe = enb.NFrame*10+enb.NSubframe; % Initial absolute subframe number
for sf = startSubframe + (0:totSubframes -1)
    % Set current absolute subframe and frame numbers
    enb.NSubframe = mod(sf,10);
    enb.NFrame = floor((sf)/10);

    % Skip processing if this is not a downlink subframe
    duplexInfo = lteDuplexingInfo(enb);
    if ~strcmpi(duplexInfo.SubframeType,'Downlink')
        continue
    end

    % Transmitting the MPDCCH
    if (sf >= mpdcch.InitNSubframe) && (sf < mtclastabsSfForMPDCCH)
        % Calculate the PRBSet used in the current subframe
        prbset = getHoppingAllocation(enb,mpdcch);

        % Calculate the MPDCCH indices for the current subframe
        mpdcch.EPDCCHPRBSet = prbset;
        [mpdcchIndices,info] = lteEPDCCHIndices(enb,mpdcch);

        % Create an empty subframe grid
        subframe = lteDLResourceGrid(enb,4);

        % Encode MPDCCH symbols from DCI codeword
        % In the case of repetition, the same symbols are repeated in each of
        % a block of NRepMPDCCH subframes. Frequency hopping is applied as required
        if ~mod(sf,Nacc) || isempty(mpdcchSym)
            mpdcchSym = lteEPDCCH(enb,mpdcch,codedDciBits)*db2mag(mpdcch.MPDCCHPower);
        end
        % Map MPDCCH symbols to the subframe grid
        subframe(mpdcchIndices) = mpdcchSym;

        % Create MPDCCH DM-RS
        % The MPDCCH and its reference symbols are transmitted on the same
        % port(s) and is transmitted only on the PRBs in which the
        % corresponding MPDCCH is mapped. The DM-RS sequence is the same as for
        % the EPDCCH as given by the equations in TS 36.211 section 6.10.3A
        mpdcchDMRS = lteEPDCCHDMRS(enb,mpdcch)*db2mag(mpdcch.MPDCCHDMRSPower); % MPDCCH DM-RS symbols
        mpdcchDMRSIndices = lteEPDCCHDMRSIndices(enb,mpdcch); % MPDCCH DM-RS indices
        subframe(mpdcchDMRSIndices) = mpdcchDMRS;   % Map DM-RS signals to the grid

        % Now assign the current subframe into the overall grid
        sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:) = subframe;
    end

Генерация BL/CE PDSCH

Для LTE-M PDSCH PBCH, PSS, SSS и местоположения CSI-RS RE считаются в отображении, но не используются в передаче. Это означает, что уровень соответствовал, способность должна включать эти местоположения RE, но символы для этих местоположений не передаются. Таким образом, мы создаем кодовую комбинацию соответственно и прокалываем символы, соответствующие конфликтным местоположениям

    if (sf >= pdsch.InitNSubframe)

        % Calculate the PRBSet used in the current subframe
        prbset = getPDSCHAllocation(enb,pdsch);

        % Calculate the PDSCH indices for the current subframe
        pdsch.PRBSet = prbset;
        mpdschIndices = ltePDSCHIndices(enb,pdsch,pdsch.PRBSet);
        % If the subframe contains PBCH, PSS, SSS, CSI-RS or Zero Power
        % CSI-RS REs, then we need to puncture the corresponding symbols
        % from the mapping but the rate matching should be to the full
        % PDSCH capacity ignoring the possible presence of these symbols.
        % This is done by setting the subframe and TDDConfig (if TDD mode)
        % to a subframe containing no PBCH, PSS and SSS and turning off the
        % CSI-RS and ZP CSI-RS. The full set of possible PDSCH indices are
        % recalculated every subframe as these can change when frequency
        % hopping
        enbTemp = enb;
        enbTemp.TDDConfig = 1;              % TDDConfig 0 has no full PDSCH subframe
        enbTemp.NSubframe = fullPDSCHsf;    % Set the subframe to a full PDSCH subframe
        enbTemp.CSIRSPeriod = 'Off';        % CSI-RS period control
        enbTemp.ZeroPowerCSIRSPeriod = 'Off'; % Zero power CSI-RS period control
        mpdschIndicesFull = ltePDSCHIndices(enbTemp,pdsch,pdsch.PRBSet);
        [~, txmpdschIndicesPositions] = intersect(mpdschIndicesFull,mpdschIndices);

        % Create an empty subframe grid
        subframe = lteDLResourceGrid(enb,4);

        % Encode PDSCH symbols from the codeword
        % In the case of repetition, the same symbols are repeated in each of
        % a block of NRepPDSCH subframes. Frequency hopping is applied as required
        if ~mod(sf,Nacc) || isempty(mpdschSym)
            mpdschSym = ltePDSCH(enb,pdsch,codedTrBlock)*db2mag(pdsch.Rho);
        end
        % Map punctured PDSCH symbols to the subframe grid
        subframe(mpdschIndices) = mpdschSym(txmpdschIndicesPositions);

        % Transmit UE-specific reference signal (DM-RS) if applicable
        if any(strcmpi(pdsch.TxScheme,{'Port5' 'Port7-8' 'Port8' 'Port7-14'}))
            ueRSIndices = lteDMRSIndices(enb,pdsch);
            ueRSSymbols = lteDMRS(enb,pdsch);
            subframe(ueRSIndices) = ueRSSymbols*db2mag(pdsch.RSPower);  % Map symbols to the grid
        end

        % Now assign the current subframe into the overall grid
        sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:) = subframe;
    end

Генерация BL/CE PBCH

Генерация символа PBCH и сопоставляющий на REs сетки ресурса. LTE-M PBCH состоит из нормальной части 'ядра' LTE и LTE-M определенные повторения. Базовые символы PBCH только присутствуют в первом подкадре с периодичностью 4 систем координат.

    subframe = sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:);
    if(mod(enb.NSubframe,10)==0)
        % Generate symbols if its the first simulated frame or
        % when mod(NFrame,4) is 0;
        if ~mod(enb.NFrame,4) || isempty(mpbchCoreSymFull)
            mpbchCoreSymFull = getMPBCHCore(enb);
        end
        mpbchCoreIndices = ltePBCHIndices(enb,{'1based'});
        % Now extract out the core part for the Frame
        mpbchCoreSym = mpbchCoreSymFull(:,mod(enb.NFrame,4)+1);
        % Map the PBCH core symbols to the subframe
        subframe(mpbchCoreIndices) = mpbchCoreSym*db2mag(enb.PBCHPower);

        % Now assign the current subframe into the overall grid
        sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:) = subframe;

        % Get the cell RS symbols and indices to be repeated if PBCH
        % repetitions are enabled
        [mpbchCoreCellRSSymbols,mpbchCoreCellRSIndices] = getPBCHCoreCellRS(enb);

    elseif enb.RepPBCHEnable && strcmpi(enb.DuplexMode,'FDD') && (mod(enb.NSubframe,10)==9)
        % If this is the 9th subframe in FDD mode, then create the core
        % symbols and indices for the next frame to be used for PBCH
        % repetitions in this subframe
        enbNext = enb;
        enbNext.NSubframe = 0;
        enbNext.NFrame = enbNext.NFrame+1; % Advance to the next frame
        % if the current frame contained the last PBCH block, then we need
        % the new set of PBCH symbols
        if mod(enb.NFrame,4)==3
            mpbchCoreSymFull = getMPBCHCore(enbNext);
        end
        % Now extract out the core part for the Frame
        mpbchCoreSym = mpbchCoreSymFull(:,mod(enbNext.NFrame,4)+1);
        mpbchCoreIndices = ltePBCHIndices(enbNext,{'1based'});
        [mpbchCoreCellRSSymbols,mpbchCoreCellRSIndices] = getPBCHCoreCellRS(enbNext);
    end
    % PBCH repetition part if enabled
    if (enb.RepPBCHEnable)
        % Get the PBCH repetition part consisting of repeating PBCH symbols
        % and repeating Cell RS signals and corresponding indices
        [pbchrepSymbols, pbchrepIndices, pbchCellRSrepSymbols, pbchCellRSrepIndices] = getPBCHRep(enb,mpbchCoreSym,mpbchCoreIndices,mpbchCoreCellRSSymbols,mpbchCoreCellRSIndices);
        % Map the PBCH repetitions to the grid
        subframe(pbchrepIndices) = pbchrepSymbols*db2mag(enb.PBCHRepsPower);
        % Map the Cell RS repetitions to the grid
        subframe(pbchCellRSrepIndices) = pbchCellRSrepSymbols*db2mag(enb.PBCHCellRSRepsPower);
    end

    % Now assign the current subframe into the overall grid
    sfgrid(:,(1:subframeSize(2))+sf*subframeSize(2),:) = subframe;
end

Создайте область времени основополосная форма волны

Создайте область времени основополосная форма волны OFDM модуляция сетки ресурса. Получившаяся матрица имеет четыре столбца; один из которых будет содержать комплексные основополосные выборки формы волны временного интервала для MPDCCH

waveform = lteOFDMModulate(enb,sfgrid);

Постройте переданную сетку и основополосную форму волны

Постройте сетку и область времени основополосная форма волны. Если передача использует больше чем один порт, только первый порт показывают. Обратите внимание на то, что график сетки ресурса использует уровни мощности отдельных каналов и сигналов присвоить цвета элементам ресурса.

% Create an image of overall resource grid
% Plot the port used by MPDCCH along with the first port for all other channels
figure
im = image(abs(sfgrid(:,:,info.EPDCCHPorts(1))+ sfgrid(:,:,1)));
cmap = parula(64);
colormap(im.Parent,cmap);
axis xy;
title(sprintf('LTE-M CEMode%s Downlink RE Grid (NRepMPDCCH = %d, NRepPDSCH = %d)',pdsch.CEMode,mpdcch.NRepMPDCCH,pdsch.NRepPDSCH))
xlabel('OFDM symbols')
ylabel('Subcarriers')
% Create the legend box to indicate the channel/signal types associated with the REs
reNames = {'MPDCCH';'MPDCCH DRS';'PDSCH';'PBCH Core'; 'PBCH Reps'; 'Cell RS Reps'};
clevels = round(db2mag([mpdcch.MPDCCHPower mpdcch.MPDCCHDMRSPower  pdsch.Rho enb.PBCHPower enb.PBCHRepsPower enb.PBCHCellRSRepsPower]));
% If using DM-RS, include in legend
if any(strcmpi(pdsch.TxScheme,{'Port5' 'Port7-8' 'Port8' 'Port7-14'}))
    reNames{end+1} = 'DMRS';
    clevels(end+1) = pdsch.RSPower;
end
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{:});

% Create separate plots of the control/data waveforms
figure
plot(abs(waveform(:,info.EPDCCHPorts(1))))
title('MPDCCH Time Domain Waveform')
xlabel('Samples')
ylabel('Amplitude')
figure
plot(abs(waveform(:,1)))
title('PBCH and PDSCH time domain waveform')
xlabel('Samples')
ylabel('Amplitude')

Локальные функции

Следующие локальные функции используются в этом примере:

  • calcNarrowbandPRBSets - Вычислите узкополосную связь и сопоставленный PRBs

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

  • getPDSCHAllocation - Вычислите выделение PDSCH

  • getPBCHCore - Вычислите базовые символы PBCH и индексы

  • getPBCHCoreCellRS - Вычислите базовые символы PBCH и индексы

  • getPBCHRep - Вычислите часть повторения PBCH

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

  1. 3GPP TS 36.211 "Физические каналы и модуляция"

  2. 3GPP TS 36.212 "Мультиплексирование и кодирование канала"

  3. 3GPP TS 36.213 "Процедуры физического уровня"

  4. 3GPP TS 36.331 "Спецификация Протокола Радио-управления ресурсами (RRC)"

  5. О. Либерг, М. Зундберг, Y.-P. Ван, Дж. Бергман и Дж. Сакс, сотовый Интернет вещей: технологии, стандарты и эффективность, Elsevier, 2018.

  6. Э. Дэхлмен, С. Парквол и 4G Дж Сколда, усовершенствованная LTE Pro и дорога к 5G

Локальные функции

% Calculate the widebands, narrowbands and PRBSets for the LTE carrier bandwidth
function [prbsets,nNB,nWB] = calcNarrowbandPRBSets(NDLRB)
    % Narrowbands & Widebands (See 36.211 section 6.2.7)
    NDLNB = floor(NDLRB/6);
    nNB = 0:(NDLNB-1); % Narrowbands
    if NDLNB >= 4
        NDLWB = floor(NDLNB/4);
    else
        NDLWB = 1;
    end
    nWB = 0:(NDLWB-1); % Widebands

    % PRBs in a narrowband
    ii = 0:5;
    ii0 = floor(NDLRB/2) - 6*(NDLNB/2);
    prbsets = zeros(6,numel(nNB));
    for nb = 1:numel(nNB)
        if mod(NDLRB,2) && nNB(nb)>= (NDLNB/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 in the hopping narrowband
function prbset = getHoppingAllocation(enb,chs)

    % If frequency hopping is disabled, the allocation is same as initial
    if ~chs.Hopping
        prbset = chs.InitPRBSet;
        return
    end

    % Hopping narrowband calculation according to TS 36.211 section 6.8B.5
    nNBi0ss = 0;
    % Get the possible narrowbands and associated PRBSets
    if strcmpi(enb.DuplexMode,'FDD')
        idelta = 0;
    else
        idelta = enb.NChDLNB-2;
    end
    j0 = floor((chs.InitNSubframe+idelta)/enb.NChDLNB);
    % Get the narrowbands and corresponding resources
    [prbsets,nNB] = calcNarrowbandPRBSets(enb.NDLRB);
    % Calculate the narrowband for this subframe
    enb.NSubframe = enb.NFrame*10+enb.NSubframe; % Get the absolute subframe number
    nnBi = mod( (nNBi0ss + (mod(floor((enb.NSubframe+idelta)/enb.NChDLNB - j0),enb.NChDLNBhop))*enb.HoppingOffset) ,numel(nNB));
    % 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

% Calculate the PDSCH allocation
function prbset = getPDSCHAllocation(enb,PDSCH)
    if PDSCH.Hopping
        % Cat-M1 mode with hopping
        prbset = getHoppingAllocation(enb,PDSCH);
    else
        % Calculate the allocations in narrowband(s)
        [prbsets,nNB] = calcNarrowbandPRBSets(enb.NDLRB);
        % Calculate the PRBSet for this subframe, they are on the same RBs
        % within all narrowbands
        rbstartIndex = mod(find(prbsets == PDSCH.InitPRBSet(1))-1,6)+1;
        rbendIndex = mod(find(prbsets == PDSCH.InitPRBSet(end))-1,6)+1;
        if isempty(rbstartIndex) || isempty(rbendIndex)
           error('Invalid PRBSet specified, must be resources within narrowbands');
        end
        if any(PDSCH.InitNarrowbandIndex > max(nNB))
           error('Invalid InitNarrowbandIndex specified, must be from the set 0...%d',max(nNB));
        end
        prbset = prbsets(rbstartIndex:rbendIndex,PDSCH.InitNarrowbandIndex+1);
        prbset = prbset(:);

    end

end

% Calculate the Cell RS REs and symbols corresponding to the 'core' PBCH
% part
function [pbchCoreCellRSSymbols,pbchCoreCellRSIndices] = getPBCHCoreCellRS(enb)

    % We need to repeat the cell reference signals within the (k,l) region
    NscRB = 12;
    k = (enb.NDLRB*NscRB)/2 -36 + (0:71) + 1; % 1-based full possible PBCH subcarrier locations
    if strcmpi(enb.CyclicPrefix,'Normal')
        NsymbDL = 7;
    else
        NsymbDL = 6;
    end
    l = NsymbDL+ (0:3)+ 1; % 1-based OFDM symbol numbers in the subframe corresponding to PBCH core part

    % NOTE: The cell RS symbols and indices can be looked up from the
    % grid if provided or can be created here as shown below
    cellRSIndices = lteCellRSIndices(enb);
    cellRSSymbols = lteCellRS(enb);
    rsgrid = lteDLResourceGrid(enb);
    rsgrid(cellRSIndices) = cellRSSymbols;
    % Now remove all RS symbols outside of the core PBCH band
    excludeSubs = setdiff(1:enb.NDLRB*NscRB,k);
    excludeofdmSymbols = setdiff(1:NsymbDL*2,l);
    % Now remove all the unwanted RE locations
    rsgrid(:,excludeofdmSymbols,:) = 0;
    rsgrid(excludeSubs,:,:) = 0;

    % What is in the grid is the RS symbols to be repeated
    pbchCoreCellRSIndices = find(rsgrid);
    pbchCoreCellRSSymbols = rsgrid(pbchCoreCellRSIndices);

end

% Calculate the PRBCH and Cell RS REs and symbols corresponding to the
% repetition part
function [pbchrepSymbols,pbchrepIndices, pbchCellRSrepSymbols, pbchCellRSrepIndices] = getPBCHRep(enb,pbchCoreSymbols,pbchCoreIndices,pbchCoreCellRSSymbols,pbchCoreCellRSIndices)
    pbchrepIndices = [];
    pbchrepSymbols = [];
    symMappings = {};
    pbchCellRSrepIndices = [];
    pbchCellRSrepSymbols = [];

    % For both FDD and TDD modes, there is no repetition if NDLRB = 6
    if enb.NDLRB==6
        return
    end

    % Get the subcarriers for the PBCH core part
    [pbchCoreSubcarriers,ofdmSymbols,~] = ind2sub(lteDLResourceGridSize(enb),pbchCoreIndices);
    % Get the subcarriers for the Cell RS core part
    [pbchCellRSCoreSubcarriers,ofdmSymbolsCellRS,~] = ind2sub(lteDLResourceGridSize(enb),pbchCoreCellRSIndices);

    % FDD reps only in subframes 9 (frame n-1) and 0 (frame n) and TDD only
    % reps in subframes 0 and 5 in the same frame
    % Get the subframe symbol numbers in which the reps go onto
    if strcmpi(enb.DuplexMode,'FDD')
        if strcmpi(enb.CyclicPrefix,'Normal')
            NsymbDL = 7;
            if (mod(enb.NSubframe,10) == 0)
                symMappings = { 5 ;
                               12 ;
                               13 ;
                               [4 14]};
            elseif (mod(enb.NSubframe,10)==9)
                symMappings = { [4 8 12] ;
                                [5 9 13] ;
                                [6 10 14] ;
                                [7 11]};
            end
        else
            NsymbDL = 6;
            if (mod(enb.NSubframe,10) == 0)
                symMappings = {[] ;
                               4  ;
                               11 ;
                               12};
            elseif (mod(enb.NSubframe,10)==9)
                symMappings = { [4 7] ;
                                [5 8] ;
                                [6 9] ;
                                [10 11]};
            end
        end

    else
        if strcmpi(enb.CyclicPrefix,'Normal')
            NsymbDL = 7;
            if (mod(enb.NSubframe,10) == 0)
                symMappings = { [4 12]  ;
                                [5 13] ;
                                6 ;
                                7};
            elseif (mod(enb.NSubframe,10)==5) && enb.NDLRB>15
                symMappings = { [4 8 12] ;
                                [5 9 13] ;
                                [6 10] ;
                                [7 11]};
            end
        else
            NsymbDL = 6;
            if (mod(enb.NSubframe,10) == 0)
                symMappings = {4 ;
                               5 ;
                               6 ;
                               11};
            elseif (mod(enb.NSubframe,10)==5) && enb.NDLRB>15
                symMappings = { [4 7] ;
                                [5 8] ;
                                [6 9] ;
                                [10 11]};
            end
        end

    end

    % If this is a repetition subframe, find the indices
    if ~isempty(symMappings)

        % Create an empty subframe grid
        sfgrid = lteDLResourceGrid(enb);
        sfgridRS = lteDLResourceGrid(enb);
        for osymb = 1:4 % For all 4 PBCH symbols
            % Extract out each core symbol to map to one or more OFDM
            % symbols
            coreOFDMsymb = pbchCoreSymbols(ofdmSymbols==(osymb+NsymbDL));
            coreOFDMsymbRS = pbchCoreCellRSSymbols(ofdmSymbolsCellRS==(osymb+NsymbDL));

            % Map to all new repetition OFDM symbols in the current
            % subframe
            for m = 1:numel(symMappings{osymb,1})
                % create the indices for the current symbol (subcarriers
                % are the same as core symbols)
                symtoMap = symMappings{osymb,1}(m);
                sfgrid(pbchCoreSubcarriers(ofdmSymbols==(osymb+NsymbDL)),symtoMap,:) = coreOFDMsymb;
                sfgridRS(pbchCellRSCoreSubcarriers(ofdmSymbolsCellRS==(osymb+NsymbDL)),symtoMap,:) = coreOFDMsymbRS;

            end

        end

        % As per TS 36.211 section 6.6.4, the PBCH repetitions and cell RS
        % repetitions are punctured by CSI (& ZP CSI) RS signals. So clear
        % these positions
        csirsIndices = lteCSIRSIndices(enb);
        sfgrid(csirsIndices) = 0;
        sfgridRS(csirsIndices) = 0;

        % Now get the PBCH repeating symbols and indices
        pbchrepIndices = find(sfgrid);
        pbchrepSymbols = sfgrid(pbchrepIndices);
        % Now get the CellRS repeating symbols and indices
        pbchCellRSrepIndices = find(sfgridRS);
        pbchCellRSrepSymbols = sfgridRS(pbchCellRSrepIndices);

    end
end

% Get the MPBCH Core part symbols
function mpbchCoreSym = getMPBCHCore(enb)

    bchBits = lteMIB(enb);
    pbchBits = lteBCH(enb,bchBits);
    mpbchCoreSym = ltePBCH(enb,pbchBits);
    % Reshape to the four parts to go on to 4 frames
    mpbchCoreSym = reshape(mpbchCoreSym,numel(mpbchCoreSym)/4,4);
end

% Get the absolute subframe number in a frame which is used for the last
% transmission of a channel
function sfsnumlastFrame = getlastabsSF(dlsfs,totmtcSubframes)
    sfslastFrame = mod(totmtcSubframes,sum(dlsfs)); % subframes to tx in the last frame
    if sfslastFrame
        % Find the subframe number corresponding to the last subframe to transmit
        sfsnumlastFrame = find(dlsfs,sfslastFrame);
        sfsnumlastFrame = sfsnumlastFrame(end);
    else
        % No partial frames required
        sfsnumlastFrame = 0;
    end

end