Релиз 12 Sidelink PSCCH и пропускная способность PSSCH

В этом примере показано, как выполнить Отношение Блочной ошибки (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.

Количество периодов PSCCH, чтобы симулировать

Пример выполняется в течение продолжительности симуляции 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';

Сконфигурируйте измерения BLER

Логические переменные measureBLERForSCI и measureBLERForSLSCH позвольте измерениям BLER и всей связанной обработке получателя быть отключенными для SCI и SL-SCH соответственно. Это позволяет симуляции быть сконфигурированной, чтобы измерить BLER для только одного из каналов. Отключение обработки получателя для другого канала улучшает скорость выполнения.

measureBLERForSCI = true;
measureBLERForSLSCH = true;

Создайте настройку периода PSCCH

Класс 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;

Отобразите период PSCCH

Для того, чтобы проиллюстрировать управление и пулы совместно используемого ресурса, функция period.displayPeriod вызвана, который создает график, показывающий местоположения (голубой) передачи синхронизации, пул ресурсов управления пул (темно-синего) и совместно используемого ресурса (желтый) в период PSCCH.

if (displaySimulationInformation)
    figure;
    period.displayPeriod;
    drawnow;
end

Создайте сообщение Управляющей информации Sidelink (SCI)

Сообщение Управляющей информации 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 и подкадров 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

Выберите Receiver Behavior When SCI Decoding Fails

Логическая переменная 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 канала

Полный 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 с практической оценкой канала включая дополнительные точки ОСШ привели к результатам, показанным ниже.

Приложение

Этот пример использует функцию помощника:

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

  1. 3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"

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

  3. 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