Выпуск 12 PSCCH боковой линии связи и пропускная способность PSSCH

Этот пример показывает, как выполнить моделирование коэффициента блочной ошибки (BLER) управления боковым каналом 3GPP Release 12 и общими каналами в частотно-селективных замираниях и аддитивном белом гауссовом шуме (AWGN) с использованием Toolbox™ LTE.

Введение

3GPP Release 12 представила в LTE коммуникации устройство-устройство боковой линии связи для общественной безопасности. Этот пример генерирует несколько периодов физического канала управления бокового канала ( PSCCH) релиза 12, содержащих закодированные передачи PSCCH и физического общего канала бокового канала (PSSCH). Получившиеся формы волны PSCCH затем проходят через частотно-селективный канал с замираниями с AWGN, и коэффициенты ошибок блока канала управления и общего канала (BLER) вычисляются для области значений ОСШ. Также вычисляют среднее количество образцов передачи управляющего и общего каналов, необходимых для успешного декодирования в каждом ОСШ. Для получения информации о том, как смоделировать Release 14 V2X sidelink, смотрите следующий пример: Release 14 V2X Sidelink PSCCH и PSSCH Through.

Количество периодов PSCCH для моделирования

Пример выполняется для длины симуляции 5 периодов PSCCH, чтобы сохранить время симуляции низким. Большое количество периодов, nPeriods, должно использоваться для получения статистически значимых результатов.

nPeriods = 5;

Замирающее строение канала

Частотно-селективный канал с замираниями сконфигурирован в соответствии с TS 36.101 Таблица 12.2.1-1 [1]. Используется профиль задержки EVA с доплеровской частотой 70Hz и 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), происходящих в обоих пазах. Это усреднение приоритезирует улучшение ОСШ пилот-сигнала по сравнению с точной оценкой изменения времени канала, что разумно, так как даже на 70Hz доплеровской частоте изменение канала в подкадре ограничено. Окно частоты усреднения пилот-сигнала из 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 Resource Pools и PSCCH Period and PSCCHPeriod для получения дополнительной информации.

period = PSCCHPeriod;

Строение пула ресурсов

Строение пула ресурсов для передачи связи D2D боковом канале состоит из большого количества параметров, которые UE получает через сообщения управления радиоресурсами (RRC) [3]. Альтернативно, в случае UE, работающего вне сетевого покрытия, эти параметры предварительно конфигурируются в UE. В этой симуляции используется ссылочное строение пула ресурсов # 1-FDD из приложения A.7.2.1-1 TS 36.101 [1]. Эти параметры могут быть установлены с помощью 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

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

Сообщение Sidelink Control Information (SCI) sciMessage создается согласно боковому опорному каналу измерения CC.3 FDD, определенному в TS 36.101 [1] Приложение A.6.4 и CD.1 FDD, определенное в Приложении A.6.5, следующим образом:

  • Размер транспортного блока для CD.1 FDD (872), используемый для передачи совместно используемого канала в этом примере, назначается переменной TBS.

  • Количество выделенных ресурсных блоков для CD.1 FDD (10) присваивается переменной NPRB, который будет использоваться, чтобы убедиться, что выделение ресурсов для общего канала содержит правильное количество ресурсных блоков. Обратите внимание, что кодовая скорость для SL-SCH является функцией от пропускной способности PSSCH (возникающей из-за NPRB и порядок модуляции) и размер транспортного блока TBS.

  • Количество ресурсных блоков NSLRB в структуре пользовательских параметров ue устанавливается равным, сконфигурированному в периоде PSCCH, period.Config.NSLRB.

  • Скачкообразное изменение частоты активируется путем установки sciMessage.FreqHopping по 1.

  • Сообщение SCI sciMessage затем создается с помощью lteSCI функция. Включение скачкообразного изменения частоты в структуре SCI-сообщений перед вызовом lteSCI гарантирует, что HoppingBits область sciMessage.Allocation создается.

  • The HoppingBits установлено значение 1, которое в сочетании со NSLRB значение настраивает скачкообразное изменение типа 2, как описано в TS 36.213 Раздел 8.4 [2].

  • The TimeResourcePattern задано в соответствии с TS 36.101 Таблица A.6.4-1 [1].

  • The ModCoding установлено значение, соответствующее размеру транспортного блока TBS.

  • The NSAID установлено произвольное 8-битное значение (значение в области значений от 0 до 255), представляющее наименьшие 8 бит идентификатора Layer-2 группы ProSe. В таблице TS 36.101 A.6.5-1 [1] указывается, что идентификатор адресата группы «задан более высокими слоями». Используемое значение записывается в переменную 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 PRB (заданный RMC CD.1 FDD) создаются. The period.getAllowedRIV функция возвращает вектор значений RIV (RIVset) и соответствующую матрицу выделений ресурсов (range), где каждая строка содержит длину выделения и стартовый ресурсный блок для каждого RIV. The 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). The period.displayPeriod вызывается функция, передаваемая в сообщении SCI, и строятся наборы подкадров PSCCH и PSSCH и ресурсных блоков, которые будут фактически использоваться для передачи. Подкадры и ресурсные блоки окрашены в зеленый цвет и являются подмножеством общего пула управления и общих ресурсов, показанными синим и желтым цветом соответственно. Для получения дополнительной информации см. пример LTE Sidelink Resource Pools и PSCCH Period. В соответствии с определением в TS 36.101 Таблица 12.2.1-1 [1], значение 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

Выберите поведение приемника, когда не удается декодировать SCI

Логическая переменная sciAssumed управляет поведением симуляции в терминах эффекта декодирования канала управления на декодирование совместно используемого канала. Если sciAssumed true, приемник принимает, что сообщение SCI было правильно декодировано при попытке приема совместно используемого канала. Это позволяет измерять эффективность приема совместно используемого канала независимо от эффективности приема канала управления. Если sciAssumed является ложным, отказ декодирования канала управления подразумевает отказ декодирования совместно используемого канала. Обратите внимание, что если измерение BLER для SCI отключено выше (measureBLERForSCI=false), и включено измерение BLER для SL-SCH (measureBLERForSLSCH=true), приемник принимает, что сообщение SCI было правильно декодировано при измерении SL-SCH BLER независимо от настройки sciAssumed здесь.

sciAssumed = true;

Создайте переменные для записи моделируемой эффективности

Эффективность приемника записывается в матрицы controlErrors и sharedErrors. Каждая матрица имеет строку для каждой точки ОСШ и столбец для каждого моделируемого периода PSCCH. Элементы устанавливаются равными 1 для точек ОСШ 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 Control (SC) sc_Period_r12 и индикатор смещения sc_TF_ResourceConfig_r12.offsetIndicator_r12 для определения номера прямой системы координат (DFN) и номера субкадра для каждого подкадра в форме волны.

  • Выберите случайный ресурс PSCCH: Для sidelink UE в режиме передачи 2 (например, вне покрытия), ресурс PSCCH PSCCHResource должен быть выбран случайным образом согласно равномерному распределению между 0 и period.NumPSCCHReource-1. Ресурс PSCCH выбирает случайную пару подкадров и блоков физических ресурсов (PRB) в пуле ресурсов PSCCH, в которых можно передавать два образцов передачи сообщения SCI. The PSCCHResource добавляется к структуре SCI-сообщений в порядок, чтобы передать ее в period.generateWaveform функция. Обратите внимание, что для UE с покрытием (т.е. работающего в режиме 1 передачи) управляющая информация выдается сообщением 5 формата DCI, отправленным eNodeB, которое включает в себя PSCCHResource выбран eNodeB.

  • Выберите случайный ресурс PSSCH: В соответствии с определением, приведенным в таблице TS 36.101 12.2.1-1 [1], значение индикатора ресурса (RIV), переданное в сообщении SCI, будет выбрано случайным образом (равномерно) из набора RIVset, RIV, количество выделенных PRB которых соответствует сконфигурированному RMC CD.1 FDD.

  • Сгенерируйте сигнал периода PSCCH: Сигнал периода PSCCH генерируется PSCCHPeriod.generateWaveform функция, использующая ее параметры конфигурации и содержимое SCI сообщения прошло, плюс PSCCHResource поле добавлено к сообщению на предыдущем шаге.

  • Применить частотно-избирательное замирание: Сигнал периода PSCCH передается через частотно-селективное замирание канала с использованием профиля задержки EVA с доплеровской частотой 70Hz и 2 приемных антенны с низкой корреляцией, как описано в таблице TS 36.101 12.2.1-1 [1].

  • Add AWGN: AWGN добавляется для достижения заданного ОСШ на каждый ресурсный элемент.

  • Прием управляющих и общих каналов: Обработка приемника состоит из демодуляции PSCCH, декодирования SCI, демодуляции PSSCH и декодирования SL-SCH. Эти этапы описаны более подробно ниже.

Обратите внимание, что шаги «Add AWGN» и «Receive control and shared channels» повторяются для каждой точки ОСШ с помощью одной и той же затухшей формы волны.

Приемник выполняет следующие шаги:

  • Синхронизируйте и 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. The period.getPSCCHResources функция предоставляет два подкадра, которые несут PSCCH и соответствующие PRB, выделенные PSCCH в этих подкадрах. Номера подкадров используются для извлечения соответствующих подкадров из формы волны периода PSCCH, и PRB используются для конфигурирования извлечения ресурса PSCCH в этих подкадрах. Обратите внимание, что PSCCH не будет передаваться в подкадрах синхронизации.

Для каждого образца передачи PSCCH для текущего значения ресурса PSCCH:

  • Выполните оценку канала PSCCH: оценка канала PSCCH выполняется с помощью lteSLChannelEstimatePSCCH или локальная функция perfectChannelEstimate в зависимости от значения perfectChanEstimator. Блок оценки канала также производит оценку степени шума, которая может использоваться для эквализации MMSE.

  • Извлечение символов PSCCH и оценки канала: Принятые символы PSCCH извлекаются из ресурсной сетки субкадра, и соответствующие оценки канала извлекаются с помощью lteExtractResources и индексы, предоставляемые ltePSCCHIndices.

  • Выполните эквализацию PSCCH: Символы PSCCH выравниваются по MMSE с помощью lteEqualizeMMSE с оценкой канала и оценкой шума, полученной выше.

  • Выполните демодуляцию PSCCH: Уравненные символы PSCCH демодулируются с помощью ltePSCCHDecode. Эта функция выполняет инверсию шагов модуляции передатчика (ослабление преобразования SC-FDMA, демодуляция символов QPSK и дескремблирование).

  • Выполните декодирование SCI: попытка декодирования SCI выполняется с помощью lteSCIDecode. Количество исходных информационных бит в сообщении SCI определяется lteSCIInfo. Если декодированный CRC равен нулю, декодированные биты сообщения преобразуются в соответствующую структуру сообщения с помощью lteSCI. The NSAID поле сообщения, которое является восемью LSB идентификатора адресата группы, сравнивается с ожидаемым значением NSAID. Если они равны, декодирование SCI считается успешным, и цикл значения ресурса PSCCH прекращается. Количество необходимых образцов передачи (1 или 2) записано в controlRxs.

Поведением декодирования совместно используемого канала относительно неудачного SCI-декодирования управляет переменная sciAssumed. Если sciAssumed является ложным, неудачное декодирование SCI немедленно подразумевает отказ декодирования SL-SCH, и дальнейшая обработка для текущего периода PSCCH не происходит. Если sciAssumed true, переданное SCI сообщение принято известным приемнику и будет использоваться вместо принятого SCI сообщения. Если sciAssumed true или если декодирование SCI было успешно, приемник продолжает декодирование SL-SCH. Обратите внимание, что если измерение SCI BLER отключено, но SL-SCH BLER включено, то переданное SCI сообщение принято известным приемнику.

PSSCH/SL-SCH передается четыре раза, используя HARQ, где передаются четыре версии избыточности (RV) с последовательностью [0 2 3 1]. Обратной связи HARQ нет, так как передачи связи по боковой линии связи предназначены для группы UE (не для индивидуума принимающего UE).

Для каждого образца передачи PSSCH до декодирования SL-SCH:

  • Получите ресурсы PSSCH: The period.getPSSCHResources функция предоставляет вектор субкадров в течение периода, который несет PSSCH, и матрицу, содержащую наборы PRB, выделенные PSSCH, в пределах этих субкадров для строения PSSCH, заданной декодированным SCI сообщением. Это аналогично ресурсам, описанным выше для PSCCH, с различием, что PSSCH может быть отправлен на нескольких PRB, но PSCCH передается только на одном PRB. Как и в PSCCH, номера подкадров используются для извлечения соответствующих подкадров из формы волны периода PSCCH, и PRB используются для конфигурирования извлечения ресурсов 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, 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, результаты не являются показательными. Симуляция периода PSCCH 1000 с практической оценкой канала, включая дополнительные точки ОСШ, дала результаты, показанные ниже.

Приложение

В этом примере используется функция helper:

Избранная библиография

  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