Этот пример показывает, как выполнить моделирование коэффициента блочной ошибки (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.
Пример выполняется для длины симуляции 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';
Логические переменные measureBLERForSCI
и measureBLERForSLSCH
позволяет отключать измерения BLER и всю связанную обработку приемника для SCI и SL-SCH соответственно. Это позволяет сконфигурировать симуляцию, чтобы измерить BLER только для одного из каналов. Отключение обработки приемника для другого канала улучшает скорость выполнения.
measureBLERForSCI = true; measureBLERForSLSCH = true;
Класс 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;
В порядок для иллюстрации пулов управляющих и общих ресурсов, period.displayPeriod
вызывается функция, которая создает график, показывающий местоположения передачи синхронизации (светло-синий), пула ресурсов управления (темно-синий) и пула общих ресурсов (желтый) в течение периода PSCCH.
if (displaySimulationInformation) figure; period.displayPeriod; drawnow; end
Сообщение 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 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
Логическая переменная 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 для канала управления (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:
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