Этот пример показывает, как выполнить Отношение Блочной ошибки (BLER) симуляция 3GPP Релиз 12 непрямое управление и совместно использованные каналы в выборочном частотой исчезновении и Аддитивном белом гауссовом шуме (AWGN) с помощью LTE Toolbox™.
3GPP Релиз 12 ввел непрямые коммуникации от устройства к устройству для общественной безопасности в LTE. Этот пример генерирует несколько Релиз 12 Физический Канал Управления Sidelink (PSCCH), периоды, содержащие, закодировали PSCCH и Физический Sidelink Разделяемый Канал (PSSCH) передачи. Получившиеся формы волны периода PSCCH затем передаются через выборочный частотой исчезающий канал с AWGN и канал управления и совместно использовали Отношения Блочной ошибки канала (ЧАСТОТЫ БЛОКОВ С ОШИБКАМИ), вычисляются для области значений SNRs. Среднее количество экземпляров передачи управления и совместно использованных каналов, требуемых для успешного декодирования в каждом ОСШ, также вычисляется. Для получения информации о том, как смоделировать непрямой Релиз 14 V2X, проверяйте следующий пример: Релиз 14 V2X Sidelink PSCCH и Пропускная способность PSSCH.
Пример выполняется в течение продолжительности симуляции 5 периодов PSCCH, чтобы поддержать время симуляции на низком уровне. Большое количество периодов, nPeriods
, должно использоваться, чтобы привести к статистически значимым результатам.
nPeriods = 5;
Выборочный частотой исчезающий канал сконфигурирован согласно таблице 12.2.1-1 [1] TS 36.101. Профиль задержки EVA с Доплеровской частотой 70 Гц и 2 антеннами получателя с низкой корреляцией используется. Seed канала задан так, чтобы каждое выполнение этого примера использовало ту же реализацию процесса исчезновения. Модель Релеевского замирания использует случайную инициализацию фазы, и вывод нормирован так, чтобы средняя степень была единицей.
channel.DelayProfile = 'EVA'; channel.DopplerFreq = 70.0; channel.NRxAnts = 2; channel.MIMOCorrelation = 'Low'; channel.Seed = 1; channel.ModelType = 'GMEDS'; channel.NTerms = 16; channel.NormalizeTxAnts = 'On'; channel.NormalizePathGains = 'On'; channel.InitPhase = 'Random';
Сконфигурируйте область значений точек ОСШ, предназначенных, чтобы покрыть и высокие и низкие условия работы BLER.
SNRIn = [-10.0 -5.0 0.0 5.0];
Переменная perfectChanEstimator
управляет поведением средства оценки канала. Допустимыми значениями является true
или false
. Когда установлено в true
совершенный ответ канала используется в качестве оценки, в противном случае несовершенная оценка на основе значений полученных Сигналов ссылки демодуляции (DRS) получена. Если perfectChanEstimator
установлен в false
, конфигурационная структура, cec
необходим, чтобы параметризовать средство оценки канала.
% Perfect channel estimator flag
perfectChanEstimator = false;
Практическая настройка оценки канала для PSCCH и средств оценки канала PSSCH задана ниже. Экспериментальное окно времени усреднения 15 элементов ресурса используется и для PSCCH и для PSSCH, чтобы гарантировать, что шум на Сигналах ссылки демодуляции (DRS), происходящих в обоих слотах, усреднен. Это усреднение приоритизирует экспериментальное улучшение ОСШ по сравнению с точной оценкой изменения времени канала, которое разумно как даже на уровне 70 Гц Доплеровская частота, изменение канала через подкадр ограничивается. Экспериментальное окно частоты усреднения 23 элементов ресурса гарантирует, что шум на каждом элементе ресурса DRS через частоту усреднен для PSCCH. Это усреднение приоритизирует экспериментальное улучшение ОСШ по сравнению с точной оценкой селективности частоты канала, которая разумна для PSCCH, когда это всегда - модулируемый QPSK (таким образом, точность оценки канала не так очень важна), и это только занимает один блок ресурса (канал ограничил селективность частоты по этому промежутку частоты). Для PSSCH это экспериментальное окно частоты усреднения составляет в среднем примерно по 2 блокам ресурса (10 блоков ресурса выделяются для PSSCH для параметров, используемых в этом примере). Обратите внимание на то, что в зависимости от профиля задержки канала и Доплеровской частоты, операционного ОСШ, и порядка модуляции PSSCH и количества выделенных блоков ресурса, различные параметры оценки канала могут дать лучшую производительность для PSSCH.
cec.PilotAverage = 'UserDefined'; cec.TimeWindow = 15; cec.FreqWindow = 23; cec.InterpType = 'linear';
Логические переменные measureBLERForSCI
и measureBLERForSLSCH
позволяют измерениям BLER и всей связанной обработке получателя быть отключенными для SCI и SL-SCH соответственно. Это позволяет симуляции быть сконфигурированной, чтобы измерить BLER для только одного из каналов. Отключение обработки получателя для другого канала улучшает скорость выполнения.
measureBLERForSCI = true; measureBLERForSLSCH = true;
Класс PSCCHPeriod
представляет физическую структуру периода PSCCH. Смотрите LTE Пулы ресурсов Sidelink и Период PSCCH и PSCCHPeriod для получения дополнительной информации.
period = PSCCHPeriod;
Настройка пула ресурсов для передачи коммуникации D2D sidelink состоит из большого количества параметров, которые UE получает по радио Управление ресурсами (RRC) сообщения [3]. Также в случае UE, действующего из сетевого покрытия, эти параметры предварительно сконфигурированы в UE. В этой симуляции используется ссылочная настройка пула ресурсов # 1-FDD из приложения A.7.2.1-1 [1] TS 36.101. Эти параметры могут быть установлены с помощью функции PSCCHPeriod.defaultConfig путем определения ссылочного номера настройки пула ресурсов и пропускной способности.
% Configure the PSCCH period parameters for reference pool #1-FDD, 5MHz period.Config = PSCCHPeriod.defaultConfig(1,'5MHz'); % Set the control and data channel cyclic prefix length period.Config.sc_CP_Len_r12 = 'Normal'; period.Config.data_CP_Len_r12 = 'Normal';
Переменная displaySimulationInformation
управляет отображением информации о симуляции, такой как ресурсы PSCCH, используемые в течение каждого периода, и были ли SCI и декодирование SL-SCH успешны.
displaySimulationInformation = true;
В порядке проиллюстрировать управление и пулы совместно используемого ресурса, вызвана функция period.displayPeriod, который создает график, показывающий местоположения (голубой) передачи синхронизации, пул ресурсов управления пул (темно-синего) и совместно используемого ресурса (желтый) в период PSCCH.
if (displaySimulationInformation) figure; period.displayPeriod; drawnow; end
Сообщение Управляющей информации Sidelink (SCI) sciMessage
создается согласно непрямому ссылочному CC.3 FDD канала измерения, заданному в приложении A.6.4 и CD.1 TS 36.101 [1] FDD, заданный в Приложении A.6.5 можно следующим образом:
Транспортный Размер блока для CD 1 FDD (872), используемого для разделяемой передачи канала в этом примере, присвоен переменной TBS
.
Номер выделенных блоков ресурса для CD 1 FDD (10) присвоен переменной NPRB
, которая будет использоваться, чтобы гарантировать, что распределение ресурсов для разделяемого канала содержит правильное количество блоков ресурса. Обратите внимание на то, что уровень кода для SL-SCH является функцией емкости в битах PSSCH (являющийся результатом NPRB
и порядка модуляции) и транспортный размер блока TBS
.
Количество ресурса блокирует NSLRB
в структуре настроек UE-specific, ue
установлен равный сконфигурированному в период PSCCH, period.Config.NSLRB
.
Скачкообразное движение частоты включено установкой sciMessage.FreqHopping
к 1.
Сообщение SCI sciMessage
затем создается с помощью функции lteSCI
. Включение частоты, скачкообразно двигающейся в структуре сообщения SCI до вызова lteSCI
, гарантирует, что поле HoppingBits
sciMessage.Allocation
создается.
Поле HoppingBits
установлено в 1, который в сочетании со значением NSLRB
конфигурирует Тип 2, скачкообразно двигающийся, как описано в Разделе TS 36.213 8.4 [2].
TimeResourcePattern
установлен, как задано в таблице A.6.4-1 [1] TS 36.101.
Поле ModCoding
установлено в значение, соответствующее Транспортному Размеру блока TBS
.
Поле NSAID
установлено в произвольное 8-битное значение (значение в диапазоне от 0 до 255), представляя младшие значащие 8 битов ID Группы Слоя 2 ProSe. Таблица A.6.5-1 [1] TS 36.101 утверждает, что целевой ID Группы "как установлен более высокими слоями". Используемое значение зарегистрировано в переменной expectedNSAID
и является единственной частью содержимого сообщения SCI, о котором UE знает до приема (UE получает его из более высокой сигнализации слоя). В этом примере значение NSAID, сохраненное в expectedNSAID
, будет использоваться получателем, и получатель не получит доступ к sciMessage
вообще.
% Number of allocated resource blocks (NPRB) and Transport Block Size (TBS) % for RMC CD.1 FDD, TS 36.101 Table A.6.5-1 NPRB = 10; TBS = 872; % Create UE configuration and SCI message with frequency hopping enabled ue.NSLRB = period.Config.NSLRB; sciMessage.FreqHopping = 1; sciMessage.SCIFormat = 'Format0'; sciMessage = lteSCI(ue,sciMessage); % Set the hopping bits for Type 2 hopping and the time resource pattern for % RMC CC.3 FDD, TS 36.101 Table A.6.4-1 sciMessage.Allocation.HoppingBits = 1; sciMessage.TimeResourcePattern = 8; % Set the PSSCH MCS according to the TBS ITBSs = lteMCS(0:28,'PUSCH'); sciMessage.ModCoding = find(lteTBS(NPRB,ITBSs)==TBS,1,'first') - 1; % Set NSAID value, would be assigned by higher layers sciMessage.NSAID = 117; % Store NSAID value in 'expectedNSAID' so that the receiver won't have to % access 'sciMessage' at all expectedNSAID = sciMessage.NSAID;
Набор Значений индикатора Ресурса RIVset
с правильным размером выделения 10 PRBs (данный CD 1 FDD RMC) создается. period.getAllowedRIV функция возвращает вектор значений RIV (RIVset
) и соответствующая матрица выделений ресурса (range
), где каждая строка содержит продолжительность выделения и стартовый блок ресурса для каждого RIV. Вектор RIVset
уменьшается до только записей, которые имеют продолжительность выделения, равную NPRB
путем выполнения логической индексации.
[RIVset,range] = period.getAllowedRIV(sciMessage); RIVset = RIVset(range(:,1) == NPRB);
Пример фактического PSCCH и подкадров PSSCH и блоков ресурса для передачи будет построен. Сообщение SCI сконфигурировано с первым значением ресурса PSCCH PSCCHResource=0
и первым значением PSSCH RIV Allocation.RIV = RIVset(1)
. Функция period.displayPeriod вызвана, передающий в сообщении SCI и наборах PSCCH и подкадров PSSCH и блоков ресурса, которые будут на самом деле использоваться для передачи, построены. Подкадры и блоки ресурса окрашены в зеленый, и являются подмножеством полного управления и пула совместно используемого ресурса, отображенного синим и желтым цветом соответственно. Смотрите LTE Пулы ресурсов Sidelink и пример Периода PSCCH для получения дополнительной информации. В соответствии с определением в таблице 12.2.1-1 [1] TS 36.101, значение RIV передало в сообщении SCI (который определяет ресурсы передачи PSSCH в пуле), будет выбран случайным образом (однородно) из набора RIVset
, в течение каждого периода PSCCH. Точно так же значение ресурса PSCCH (который определяет ресурсы передачи PSCCH в пуле) будет выбрано случайным образом (однородно) через его допустимый диапазон от 0 до NumPSCCHReource-1
, в течение каждого периода PSCCH.
% Select the first PSCCH and PSSCH resource sciMessage.PSCCHResource = 0; sciMessage.Allocation.RIV = RIVset(1); % Display the subframes and resource blocks for transmission if (displaySimulationInformation) figure; period.displayPeriod(sciMessage); drawnow; end
Логическая переменная sciAssumed
управляет поведением симуляции с точки зрения эффекта декодирование канала управления, имеет на разделяемом декодировании канала. Если sciAssumed
будет верен, получатель примет, что сообщение SCI правильно декодировалось когда попытка совместно использованный прием канала. Это позволяет производительности разделяемого приема канала быть измеренной независимо от производительности приема канала управления. Если sciAssumed
является ложным, отказ декодирования канала управления подразумевает разделяемый отказ декодирования канала. Обратите внимание на то, что, если измерение BLER для SCI будет отключено выше (measureBLERForSCI=false
), и измерению BLER для SL-SCH включают (measureBLERForSLSCH=true
), получатель примет, что сообщение SCI правильно декодировалось при измерении BLER SL-SCH независимо от установки sciAssumed
здесь.
sciAssumed = true;
Производительность получателя зарегистрирована в матрицах controlErrors
и sharedErrors
. Каждая матрица ссорится для каждой точки ОСШ и столбца в течение каждого моделируемого периода PSCCH. Элементы будут установлены в 1 для ОСШ points/PSCCH периоды, где соответствующей комбинации канала (PSCCH и SCI или PSSCH и SL-SCH) не удается декодировать успешно. Кроме того, controlRxs
векторов и sharedRxs
записывают количество экземпляров передачи, которые были объединены перед успешным декодированием в каждый период. Обратите внимание на то, что количество экземпляров передачи 2 для канала управления и 4 для разделяемого канала. controlRxs
векторов и sharedRxs
инициализируются с этими максимальными значениями, которые будут значениями, возвращенными в периоды, где управление и совместно использовало сбой декодирования канала.
controlErrors = zeros(length(SNRIn),nPeriods); sharedErrors = zeros(length(SNRIn),nPeriods); controlRxs = ones(length(SNRIn),nPeriods) * 2; sharedRxs = ones(length(SNRIn),nPeriods) * 4;
В течение каждого периода PSCCH выполняются следующие операции:
Обновите номер периода PSCCH: поле NPSCCHPeriod
настройки периода обновляется, чтобы совпадать с в настоящее время переданным периодом. Это поле используется в сочетании с периодом Управления Sidelink (SC) sc_Period_r12
и индикатор sc_TF_ResourceConfig_r12.offsetIndicator_r12
смещения, чтобы определить Прямой номер кадра (DFN) и номер подкадра для каждого подкадра в форме волны.
Выберите случайный ресурс PSCCH: Для непрямого UE в режиме передачи 2 (например, из покрытия), ресурс PSCCH PSCCHResource
должен быть выбран случайным образом согласно равномерному распределению между 0 и period.NumPSCCHReource-1
. Ресурс PSCCH выберет случайную пару подкадров и Физических Блоков Ресурса (PRBs) в пуле ресурсов PSCCH, в котором можно передать два экземпляра передачи сообщения SCI. PSCCHResource
добавляется к структуре сообщения SCI в порядке передать его в функцию period.generateWaveform. Обратите внимание на то, что для UE в покрытии (т.е. действующий в режиме передачи 1), управляющая информация дана сообщением формата 5 DCI, отправленным eNodeB, который включает PSCCHResource
, выбранный eNodeB.
Выберите случайный ресурс PSSCH: Как дано определением в таблице 12.2.1-1 [1] TS 36.101, Значение индикатора ресурса (RIV), переданное в сообщении SCI, будет выбрано случайным образом (однородно) из набора RIVset
, RIVs, количество которого выделенного PRBs совпадает со сконфигурированным CD 1 FDD RMC.
Сгенерируйте форму волны периода PSCCH: форма волны периода PSCCH сгенерирована функцией period.generateWaveform, которую использование ее параметров конфигурации и содержимого сообщения SCI передало в плюс поле PSCCHResource
, добавленное к сообщению на предыдущем шаге.
Примените выборочное частотой исчезновение: форма волны периода PSCCH передается через выборочный частотой исчезающий канал с помощью профиля задержки EVA с Доплеровской частотой 70 Гц и 2 антеннами получателя с низкой корреляцией, как описано в таблице 12.2.1-1 [1] TS 36.101.
Добавьте AWGN: AWGN добавляется, чтобы достигнуть заданного ОСШ на элемент ресурса.
Получите управление и совместно использованные каналы: обработка получателя состоит из демодуляции PSCCH, декодирования SCI, демодуляции PSSCH и декодирования SL-SCH. Эти шаги описаны более подробно ниже.
Обратите внимание на то, что "Добавляют, что AWGN" и "Получают управление, и совместно использованные каналы" шаги повторяются для каждой точки ОСШ с помощью той же увядшей формы волны.
Получатель выполняет следующие шаги:
Синхронизируйтесь и SC-FDMA демодулируют каждый подкадр в пуле подкадра PSCCH: Прежде, чем делать попытку демодуляции PSCCH и декодирования SCI для каждого ресурса PSCCH, каждым подкадром в пуле подкадра PSCCH является демодулируемый SC-FDMA. Для каждого подкадра соответствующий подкадр формы волны синхронизируется с помощью lteSLFrameOffsetPSCCH
. Ресурс PSCCH, используемый в передатчике, неизвестен, поэтому PRB, используемый PSCCH в подкадре, неизвестен, таким образом, синхронизация выполняется для каждого PRB в пуле блока ресурса PSCCH, и смещение синхронизации для корреляции с самым сильным пиком используется. Синхронизируемой формой волны является затем SC-FDMA, демодулируемый с помощью lteSLSCFDMADemodulate
. Поскольку количество подкадров в пуле PSCCH, вероятно, будет маленьким по сравнению с общим количеством значений ресурса PSCCH (с несколькими значениями ресурса PSCCH, соответствующими тому же подкадру в пуле), более эффективно кэшироваться, SC-FDMA демодулировал подкадры, и используйте получившиеся сетки ресурса, обозначенные ресурсами подкадра PSCCH для данного значения ресурса PSCCH. Поэтому формой волны является SC-FDMA, демодулируемый за пределами цикла значения ресурса PSCCH. Обратите внимание на то, что подход выбора смещения синхронизации, соответствующего PRB с самым сильным пиком корреляции, принимает, что только один PSCCH передается. Более устойчивое (но более дорогой) подход должно было бы выполнить синхронизацию синхронизации и демодуляцию SC-FDMA для каждого ресурса PSCCH.
Для каждого значения ресурса PSCCH, пока не декодируется SCI:
Получите ресурсы PSCCH: В период PSCCH передается дважды для сконфигурированного ресурса PSCCH pscchResource
. Функция period.getPSCCHResources обеспечивает два подкадра, которые несут PSCCH и соответствующий PRBs, выделенный PSCCH в тех подкадрах. Числа подкадра используются, чтобы извлечь соответствующие подкадры от формы волны периода PSCCH, и PRBs используются, чтобы сконфигурировать экстракцию ресурса PSCCH в тех подкадрах. Обратите внимание на то, что PSCCH не будет передан в подкадрах синхронизации.
Для каждого экземпляра передачи PSCCH для текущего значения ресурса PSCCH:
Выполните оценку канала PSCCH: оценка канала PSCCH выполняется с помощью lteSLChannelEstimatePSCCH
или локальной функции perfectChannelEstimate
в зависимости от значения perfectChanEstimator
. Средство оценки канала также производит оценку шумовой степени, которая может использоваться для коррекции MMSE.
Извлеките символы PSCCH и оценку канала: полученные символы PSCCH извлечены от сетки ресурса подкадра, и соответствующие оценки канала извлечены с помощью lteExtractResources
и индексов, обеспеченных ltePSCCHIndices
.
Выполните коррекцию PSCCH: символы PSCCH являются MMSE, компенсируемым с помощью lteEqualizeMMSE
с оценкой канала и шумовой оценкой, полученной выше.
Выполните демодуляцию PSCCH: компенсируемые символы PSCCH демодулируются с помощью ltePSCCHDecode
. Эта функция выполняет инверсию шагов модуляции передатчика (SC-FDMA преобразовывают deprecoding, демодуляцию символа QPSK и дескремблирующий).
Выполните декодирование SCI: декодирование SCI предпринято с помощью lteSCIDecode
. Количество исходных информационных битов в сообщении SCI дано lteSCIInfo
. Если декодируемый CRC является нулем, декодируемые биты сообщения преобразованы в соответствующую структуру сообщения с помощью lteSCI
. Поле сообщения NSAID
, которое является восемью LSBs целевого ID группы, по сравнению с ожидаемым значением NSAID. Если они равны, декодирование SCI рассматривается успешным, и цикл значения ресурса PSCCH отключен. Количество необходимых экземпляров передачи (1 или 2) зарегистрировано в controlRxs
.
Поведением разделяемого декодирования канала относительно не пройдено декодирования SCI управляет переменная sciAssumed
. Если sciAssumed
является ложным, не пройдено SCI, декодирующий сразу, подразумевает отказ декодировать SL-SCH, и никакая последующая обработка не происходит в течение текущего периода PSCCH. Если sciAssumed
верен, переданное сообщение SCI принято, чтобы быть известным получателю и будет использоваться вместо полученного сообщения SCI. Если sciAssumed
верен или если декодирование SCI было успешно, доходы получателя с декодированием SL-SCH. Обратите внимание на то, что, если измерение BLER SCI отключено, но измерение BLER SL-SCH включено затем, переданное сообщение SCI принято, чтобы быть известным получателю.
PSSCH / SL-SCH передается четыре раза, с помощью HARQ, куда четыре версии сокращения (RV) с последовательностью [0 2 3 1] передаются. Нет никакой обратной связи HARQ, как непрямые коммуникационные передачи для группы UEs (не для человека, получающего UE).
Для каждого экземпляра передачи PSSCH, пока не декодируется SL-SCH:
Получите ресурсы PSSCH: функция period.getPSSCHResources обеспечивает вектор подкадров в период, которые несут PSSCH и матрицу, содержащую наборы PRB, выделенные PSSCH в тех подкадрах для настройки PSSCH, данной декодируемым сообщением SCI. Это подобно ресурсам, описанным выше для PSCCH с различием, являющимся, который PSSCH может быть отправлен на нескольких PRBs, но PSCCH только отправляется на одном PRB. Как с PSCCH, числа подкадра используются, чтобы извлечь соответствующие подкадры от формы волны периода PSCCH, и PRBs используются, чтобы сконфигурировать экстракцию ресурса PSSCH в тех подкадрах. Кроме того, period.getPSSCHResources возвращает вектор чисел подкадра PSCCH, которые являются числами подкадра в пуле ресурсов PSSCH, для которого передается этот PSSCH. Эти значения используются, чтобы сконфигурировать дескремблирование PSSCH в каждом подкадре. Поскольку PSCCH не передается в подкадрах синхронизации, любые подкадры PSCCH, которые соответствуют подкадрам синхронизации, сконфигурированы, чтобы быть пропущенными путем удаления их из векторов sf
и prb
. До пропуска любых подкадров синхронизации, индексы версии сокращения IRV
для декодирования SL-SCH вычисляются для каждого ресурса. Эти индексы должны быть вычислены до пропуска любых подкадров синхронизации, потому что индексная последовательность связана только с положением подкадров PSSCH в пуле подкадра.
Синхронизируйтесь и SC-FDMA демодулируют подкадр, несущий PSSCH: соответствующий подкадр формы волны синхронизируется с помощью lteSLFrameOffsetPSSCH
. Синхронизируемой формой волны является SC-FDMA, демодулируемый с помощью lteSLSCFDMADemodulate
. Обратите внимание на то, что различающийся синхронизация синхронизации и демодуляция SC-FDMA для PSCCH, синхронизация и демодуляция для PSSCH выполняются для каждого экземпляра передачи (тогда как для PSCCH, все подкадры в пуле ресурсов PSCCH демодулировались сначала). Причина состоит в том, что различающийся PSCCH, экземпляры передачи PSSCH происходят в отличных подкадрах, и те подкадры, вероятно, будут небольшим подмножеством полного пула подкадра PSSCH. Поэтому эффективно только синхронизироваться, и SC-FDMA демодулируют подкадры, соответствующие экземпляру передачи PSSCH.
Выполните оценку канала PSSCH: оценка канала PSSCH выполняется с помощью lteSLChannelEstimatePSSCH
или локальной функции perfectChannelEstimate
в зависимости от значения perfectChanEstimator
. Средство оценки канала также производит оценку шумовой степени, которая может использоваться для коррекции MMSE.
Извлеките символы PSSCH и оценку канала: полученные символы PSSCH извлечены от сетки ресурса подкадра, и соответствующие оценки канала извлечены с помощью lteExtractResources
и индексов, обеспеченных ltePSSCHIndices
.
Выполните коррекцию PSSCH: символы PSSCH являются MMSE, компенсируемым с помощью lteEqualizeMMSE
с оценкой канала и шумовой оценкой, полученной выше.
Выполните демодуляцию PSSCH: компенсируемые символы PSSCH демодулируются с помощью ltePSSCHDecode
. Эта функция выполняет инверсию шагов модуляции передатчика (SC-FDMA преобразовывают deprecoding, QPSK или 16QAM демодуляция символа и дескремблирующий).
Выполните декодирование SL-SCH: полученные версии сокращения объединены и декодировали использование lteSLSCHDecode
. Если CRC SL-SCH является нулем, HARQ, объединяющийся цикл отключен, и декодирование SL-SCH успешно. Количество необходимых версий сокращения (от 1 до 4) зарегистрировано в sharedRxs
.
% If SCI BLER is not being measured, 'sciAssumed' must be set so that the % receiver can assume knowledge of the SCI if (~measureBLERForSCI) sciAssumed = true; end rng('default'); % Repeat for each PSCCH period p = 1; while (p<=nPeriods) % Update PSCCH period number period.Config.NPSCCHPeriod = p - 1; % Choose a random PSCCH resource sciMessage.PSCCHResource = randi([0 period.NumPSCCHResource-1]); % Choose a random PSSCH resource sciMessage.Allocation.RIV = RIVset(randi(length(RIVset))); if (displaySimulationInformation) fprintf('\nSimulating PSCCH period %d of %d\n',p,nPeriods); fprintf('Randomly selected PSCCH resource = %d\n',sciMessage.PSCCHResource); fprintf('Randomly selected PSSCH RIV = %d\n',sciMessage.Allocation.RIV); end % Generate PSCCH period waveform txWaveform = period.generateWaveform(sciMessage); % Set the sampling rate and init time for frequency-selective fading ue.CyclicPrefixSL = period.Config.sc_CP_Len_r12; info = lteSLSCFDMAInfo(ue); channel.SamplingRate = info.SamplingRate; channel.InitTime = (p-1)*period.Config.sc_Period_r12*0.001; periodInitTime = channel.InitTime; % Cache the period init time % Apply frequency-selective fading [fadedWaveform, fadingInfo] = lteFadingChannel(channel,txWaveform); % For each SNR point, add AWGN and receive control and shared channels for i = 1:length(SNRIn) if (displaySimulationInformation && (measureBLERForSCI || measureBLERForSLSCH)) fprintf('Receiving at %gdB SNR\n',SNRIn(i)); end % Add AWGN SNR = 10^(SNRIn(i)/20); N = 1/(SNR*sqrt(double(info.Nfft)))/sqrt(2.0); noise = N*complex(randn(size(fadedWaveform)), randn(size(fadedWaveform))); rxWaveform = fadedWaveform + noise; % Create PSCCH receiver configuration pscch.SidelinkMode = 'D2D'; pscch.NSLRB = period.Config.NSLRB; pscch.CyclicPrefixSL = period.Config.sc_CP_Len_r12; % Establish the number of time-domain samples 'Nt' per subframe and % number of SC-FDMA symbols 'L' per subframe pscchGridInfo = lteSLSCFDMAInfo(pscch); Nt = pscchGridInfo.SamplingRate * 1e-3; L = numel(pscchGridInfo.CyclicPrefixLengths); % If SCI BLER measurement is configured: sciDecoded = false; if (measureBLERForSCI) % Synchronize and extract each subframe of the PSCCH subframe % pool from the received waveform and perform SC-FDMA % demodulation. The timing offset used is the offset % corresponding to the strongest correlation peak when % correlating with the PSCCH DRS for each PRB in the PSCCH % subframe pool nSubframes = period.Config.sc_Period_r12; pscchPoolGrid = repmat(lteSLResourceGrid(pscch),1,nSubframes,size(rxWaveform,2)); offsetpool = []; % Variable to store the offset for each PSCCH subframe for l = period.PSCCHSubframePool if(perfectChanEstimator) offset = hPerfectTimingEstimate(fadingInfo); else subframeWaveform = rxWaveform(l*Nt + (1:Nt),:); bestCorr = 0.0; for prb = period.PSCCHResourceBlockPool.' pscch.PRBSet = prb; [thisoffset,thiscorr] = lteSLFrameOffsetPSCCH(pscch,subframeWaveform); % Find the best correlation across all antennas and % store the corresponding offset maxCorr = max(thiscorr(:)); if maxCorr > bestCorr bestCorr = maxCorr; offset = max(0,thisoffset); % No negative offset end end end subframe = lteSLSCFDMADemodulate(pscch,rxWaveform(l*Nt + offset + (1:Nt),:)); pscchPoolGrid(:,l*L + (1:L),:) = subframe; offsetpool = [offsetpool offset]; %#ok<AGROW> end % Repeat for each PSCCH resource until the SCI is decoded pscchResource = 0; while (pscchResource < period.NumPSCCHResource && ~sciDecoded) % Get the PSCCH subframes 'sf' and PRB allocations 'prb' % for the current PSCCH resource [sf,prb] = period.getPSCCHResources(pscchResource); % Remove any resources that overlap with synchronization % subframes. PSCCH will not be transmitted in these % subframes [~,syncIndex] = intersect(sf,period.SyncSubframes); sf(syncIndex) = []; prb(syncIndex) = []; % Repeat for each PSCCH transmission instance until the SCI % is decoded tx = 1; while (tx <= min(length(sf),2) && ~sciDecoded) % Configure the PSCCH receiver for the PRB allocation pscch.PRBSet = prb(:,tx); % Select the appropriate subframe resource grid from % the PSCCH subframe pool subframe = pscchPoolGrid(:,sf(tx)*L + (1:L),:); % Perform channel estimation if(perfectChanEstimator) % Update the init time to correspond to the current % subframe channel.InitTime = periodInitTime + (sf(tx)*Nt/channel.SamplingRate); [hest,nest] = perfectChannelEstimate(pscch,channel,noise,offsetpool(tx)); else [hest,nest] = lteSLChannelEstimatePSCCH(pscch,cec,subframe); end % Extract the received PSCCH symbols and the % corresponding channel estimate, and perform % equalization [pscchIndices,pscchIndicesInfo] = ltePSCCHIndices(pscch); [pscchRx,pscchHest] = lteExtractResources(pscchIndices,subframe,hest); pscchSymbols = lteEqualizeMMSE(pscchRx,pscchHest,nest); % If we are receiving the first PSCCH transmission % instance, reset the receiver buffer if (tx==1) codedSciBits = zeros(pscchIndicesInfo.G,1); end % Demodulate the PSCCH and add the result into the % receiver buffer codedSciBits = codedSciBits + ltePSCCHDecode(pscchSymbols); % Decode the SCI message. If successful (CRC=0), check % the NSAID field of the decoded message against the % transmitted message sciInfo = lteSCIInfo(pscch); [sciBits,sciCRC] = lteSCIDecode(sciInfo.Format0,codedSciBits); if (sciCRC==0) sciMessageRx = lteSCI(pscch,sciBits); if (sciMessageRx.NSAID==expectedNSAID) sciDecoded = true; controlRxs(i,p) = tx; if (displaySimulationInformation) fprintf(' SCI decoded, transmissions combined = %d\n',tx); end else if (displaySimulationInformation) fprintf(' SCI decoded, but NSAID value (%d) did not match expected value (%d)\n',sciMessageRx.NSAID,expectedNSAID); end end end % Increment the PSCCH transmission instance index tx = tx + 1; end % Increment the PSCCH resource number pscchResource = pscchResource + 1; end end % If SCI decoding failed and the SCI is assumed for SL-SCH % decoding, set the decoded SCI message equal to the transmitted % SCI message if (~sciDecoded) if (displaySimulationInformation && measureBLERForSCI) fprintf(' SCI decoding failed\n'); end if (sciAssumed) sciMessageRx = sciMessage; end end % If SL-SCH BLER measurement is configured and if the SCI was % successfully decoded or if SCI decoding success is assumed, % perform PSSCH reception and SL-SCH decoding slschDecoded = false; if (measureBLERForSLSCH && (sciDecoded || sciAssumed)) % Create PSSCH receiver configuration pssch.SidelinkMode = 'D2D'; pssch.NSLRB = period.Config.NSLRB; pssch.CyclicPrefixSL = period.Config.data_CP_Len_r12; pssch.NTurboDecIts = 5; % Establish the number of time-domain samples 'Nt' per subframe psschGridInfo = lteSLSCFDMAInfo(pssch); Nt = psschGridInfo.SamplingRate * 1e-3; % Get the PSSCH subframes 'sf', PRB allocations 'prb' and PSSCH % subframe numbers 'nsf' for the configuration given by the % decoded SCI message. 'sf' are the subframe numbers within the % SC period, 'nsf' are the subframe numbers within the PSSCH % subframe pool [sf,prb,nsf] = period.getPSSCHResources(sciMessageRx); % Create the redundancy version index sequence (IRV) % corresponding to the PSSCH transmission instances. This must % be computed "up front" prior to the removal of any % synchronization subframes in the next step, otherwise the RV % sequence is lost IRV = 0:length(sf)-1; % Remove any resources that overlap with synchronization % subframes. PSSCH will not be transmitted in these subframes [~,syncIndex] = intersect(sf,period.SyncSubframes); sf(syncIndex) = []; prb(:,syncIndex) = []; nsf(syncIndex) = []; IRV(syncIndex) = []; % Configure the PSSCH receiver NSAID value and modulation from % the decoded SCI message, and establish the SL-SCH transport % block size (TBS) pssch.NSAID = sciMessageRx.NSAID; [ITBS,modulation] = lteMCS(sciMessageRx.ModCoding,'PUSCH'); if (strcmpi(modulation,'64QAM')) modulation = '16QAM'; end pssch.Modulation = modulation; NPRB = max(size(prb,1),1); TBS = lteTBS(NPRB,ITBS); % Repeat for each PSSCH transmission instance until the SL-SCH % is decoded tx = 1; slschDecState = []; rvsequence = [0 2 3 1]; while (tx <= min(length(sf),4) && ~slschDecoded) % Configure the PSSCH receiver for the PSSCH subframe % number, PRB allocation and redundancy version (RV). If % the RV index is zero (corresponding to the first PSSCH % transmission instance in a block of 4 transmissions), % reset the receiver buffer pssch.NSubframePSSCH = nsf(tx); pssch.PRBSet = prb(:,tx); pssch.RV = rvsequence(mod(IRV(tx),4)+1); if (IRV(tx)==0) slschDecState = []; end % Perform timing synchronization, extract the appropriate % subframe of the received waveform, and perform SC-FDMA % demodulation if(perfectChanEstimator) offset = hPerfectTimingEstimate(fadingInfo); else offset = lteSLFrameOffsetPSSCH(pssch,rxWaveform(sf(tx)*Nt + (1:Nt),:)); offset = max(0,offset); % No negative offset end subframeWaveform = rxWaveform(sf(tx)*Nt + offset + (1:Nt),:); subframe = lteSLSCFDMADemodulate(pssch,subframeWaveform); % Perform channel estimation, extract the received PSSCH % symbols and the corresponding channel estimate, and % perform equalization if(perfectChanEstimator) % Update the init time to correspond to the current % subframe channel.InitTime = periodInitTime + (sf(tx)*Nt/channel.SamplingRate); [hest,nest] = perfectChannelEstimate(pssch,channel,noise,offset); else [hest,nest] = lteSLChannelEstimatePSSCH(pssch,cec,subframe); end psschIndices = ltePSSCHIndices(pssch); [psschRx,psschHest] = lteExtractResources(psschIndices,subframe,hest); psschSymbols = lteEqualizeMMSE(psschRx,psschHest,nest); % Demodulate the PSSCH codedSlschBits = ltePSSCHDecode(pssch,psschSymbols); % Decode the SL-SCH including soft combining into the % receiver buffer and check the CRC [~,slschCRC,slschDecState] = lteSLSCHDecode(pssch,TBS,codedSlschBits,slschDecState); if (slschCRC==0) slschDecoded = true; sharedRxs(i,p) = tx; if (displaySimulationInformation) fprintf(' SL-SCH decoded, transmissions combined = %d\n',tx); end end % Increment the PSSCH transmission instance index tx = tx + 1; end end % Record control and shared channel errors controlErrors(i,p) = ~sciDecoded; sharedErrors(i,p) = ~slschDecoded; if (displaySimulationInformation && ~slschDecoded && measureBLERForSLSCH) fprintf(' SL-SCH decoding failed\n'); end end % Update the PSCCH period number p = p + 1; end
Simulating PSCCH period 1 of 5 Randomly selected PSCCH resource = 19 Randomly selected PSSCH RIV = 239 Receiving at -10dB SNR SCI decoding failed SL-SCH decoding failed Receiving at -5dB SNR SCI decoded, transmissions combined = 2 SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 2 of 5 Randomly selected PSCCH resource = 12 Randomly selected PSSCH RIV = 238 Receiving at -10dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 4 Receiving at -5dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 3 of 5 Randomly selected PSCCH resource = 10 Randomly selected PSSCH RIV = 226 Receiving at -10dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 4 Receiving at -5dB SNR SCI decoded, transmissions combined = 2 SL-SCH decoded, transmissions combined = 1 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 4 of 5 Randomly selected PSCCH resource = 1 Randomly selected PSSCH RIV = 237 Receiving at -10dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoding failed Receiving at -5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 5 of 5 Randomly selected PSCCH resource = 15 Randomly selected PSSCH RIV = 237 Receiving at -10dB SNR SCI decoding failed SL-SCH decoding failed Receiving at -5dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 3 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 2 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1
Полный BLER для канала управления (PSCCH и SCI) и совместно использованного канала (PSSCH и SL-SCH) вычисляется путем усреднения controlErrors
и матриц sharedErrors
вдоль их второго измерения т.е. усреднения каждой строки, чтобы произвести векторы controlBLER
и sharedBLER
, содержащий значения BLER для каждой протестированной точки ОСШ. Точно так же controlRxs
и sharedRxs
усреднены, чтобы произвести векторы controlRxsAvg
и sharedRxsAvg
, содержащий среднее количество экземпляров передачи, которые должны были быть объединены для успешного приема.
if (measureBLERForSCI) controlBLER = 100*mean(controlErrors,2); controlRxsAvg = mean(controlRxs,2); else controlBLER = []; controlRxsAvg = []; end if (measureBLERForSLSCH) sharedBLER = 100*mean(sharedErrors,2); sharedRxsAvg = mean(sharedRxs,2); else sharedBLER = []; sharedRxsAvg = []; end
Наконец результаты испытаний построены. BLER для канала управления и совместно использованного канала построен для каждой точки ОСШ. Среднее количество экземпляров передачи, которые должны быть объединены для успешного приема для каждого ОСШ, также построено. Обратите внимание на то, что количество экземпляров передачи 2 для канала управления и 4 для разделяемого канала.
if (measureBLERForSCI || measureBLERForSLSCH) plotResults(channel,SNRIn,controlBLER,sharedBLER,controlRxsAvg,sharedRxsAvg); end
Поскольку сгенерированные графики были получены с небольшим числом периодов PSCCH, показанные результаты не являются представительными. 1000 симуляций периода PSCCH с практической оценкой канала включая дополнительные точки ОСШ привели к результатам, показанным ниже.
Этот пример использует функцию помощника:
3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"
3GPP TS 36.213 "Процедуры физического уровня"
3GPP TS 36.331 "Спецификация Протокола Радио-управления ресурсами (RRC)"
Следующие локальные функции используются в этом примере:
perfectChannelEstimate
: совершенная оценка канала
plotResults
: постройте результаты примера
% Calculate the perfect channel estimate and the noise estimate function [hest,nest] = perfectChannelEstimate(rxConfig,channel,noise,frameOffset) % Use the uplink perfect channel estimator to calculate % the sidelink estimate as both use SC-FDMA rxConfig.NTxAnts = 1; rxConfig.NULRB = rxConfig.NSLRB; rxConfig.CyclicPrefixUL = rxConfig.CyclicPrefixSL; rxConfig.TotSubframes = 1; hest = lteULPerfectChannelEstimate(rxConfig,channel,frameOffset); noiseGrid = lteSLSCFDMADemodulate(rxConfig,noise(1+frameOffset:end,:)); nest = var(noiseGrid(:)); end function plotResults(channel,SNRIn,controlBLER,sharedBLER,controlRxsAvg,sharedRxsAvg) fadingDescription = sprintf('%s%s',channel.DelayProfile,num2str(channel.DopplerFreq)); figure; hold on; legends = {}; if (~isempty(controlBLER)) plot(SNRIn,controlBLER,'ro-'); legends = [legends 'PSCCH/SCI']; end if (~isempty(sharedBLER)) plot(SNRIn,sharedBLER,'bx-'); legends = [legends 'PSSCH/SL-SCH']; end legend(legends); title(sprintf('Sidelink BLER (%%) in %s fading and AWGN',fadingDescription)); ylabel('BLER (%)'); xlabel('SNR (dB)'); axis([SNRIn(1)-1 SNRIn(end)+1 -10 110]); grid on figure; hold on; if (~isempty(controlBLER)) plot(SNRIn,controlRxsAvg,'ro-'); end if (~isempty(sharedBLER)) plot(SNRIn,sharedRxsAvg,'bx-'); end legend(legends); title(sprintf('Average number of sidelink transmissions\ncombined in %s fading and AWGN',fadingDescription)); ylabel('Average number of transmissions'); xlabel('SNR (dB)'); axis([SNRIn(1)-1 SNRIn(end)+1 0.75 4.25]) grid on end