Этот пример показывает, как выполнить Отношение Блочной ошибки (ЧАСТОТА БЛОКОВ С ОШИБКАМИ) моделирование 3GPP Выпуск 12 непрямой контроль и разделенные каналы в отборном частотой исчезновении и использовании Additive White Gaussian Noise (AWGN) LTE Toolbox™.
3GPP В выпуске 12 представлена связь устройства с боковыми линиями связи для обеспечения общественной безопасности в LTE. В этом примере генерируется множество периодов физического канала управления Sidelink версии 12 (PSCCH), содержащих кодированные передачи PSCCH и физического общего канала Sidelink (PSSCH). Результирующие сигналы периода PSCCH затем проходят через частотно-избирательный канал замирания с AWGN, и для диапазона SNR вычисляются отношения ошибок блоков канала управления и общего канала (BLER). Также вычисляется среднее количество экземпляров передачи каналов управления и совместно используемых каналов, необходимых для успешного декодирования в каждом SNR. Для получения информации о моделировании Release 14 V2X sidelink см. следующий пример: Release 14 V2X Sidelink PSCCH и PSSCH Through.
Пример выполняется для продолжительности моделирования 5 периодов PSCCH для поддержания низкого времени моделирования. Большое количество периодов, nPeriods, должны использоваться для получения статистически значимых результатов.
nPeriods = 5;
Частотно-избирательный канал замирания конфигурируется в соответствии с TS 36.101 Таблица 12.2.1-1 [1]. Используется профиль задержки ЭВА с доплеровской частотой 70Hz и 2 приемных антенн с низкой корреляцией. Начальное число канала задается таким образом, что каждое выполнение этого примера будет использовать одну и ту же реализацию процесса замирания. Модель релеевского замирания использует случайную инициализацию фазы, и выходной сигнал нормализуется так, что средняя мощность равна единице.
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';
Сконфигурируйте диапазон точек SNR, предназначенных для режима работы 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), возникающий в обоих временных интервалах, усредняется. Это усреднение повышает приоритет SNR пилот-сигнала по сравнению с точной оценкой изменения во времени канала, что является разумным, поскольку даже при 70Hz доплеровской частоте изменение канала по субкадру ограничено. Окно усреднения частоты пилот-сигнала из 23 элементов ресурса гарантирует, что шум на каждом элементе ресурса DRS по частоте усредняется для PSCCH. Это усреднение повышает приоритет SNR пилот-сигнала по сравнению с точной оценкой частотной избирательности канала, что является разумным для PSCCH, так как он всегда модулируется QPSK (так что точность оценки канала не так критична), и он занимает только один блок ресурсов (канал имеет ограниченную частотную избирательность на этом частотном интервале). Для PSSCH это среднее частотное окно пилот-сигнала составляет приблизительно 2 блока ресурсов (10 блоков ресурсов выделены для PSSCH для параметров, используемых в этом примере). Следует отметить, что в зависимости от профиля задержки канала и доплеровской частоты, рабочего SNR и порядка модуляции PSSCH и количества выделенных блоков ресурсов, различные параметры оценки канала могут давать лучшую производительность для PSSCH.
cec.PilotAverage = 'UserDefined'; cec.TimeWindow = 15; cec.FreqWindow = 23; cec.InterpType = 'linear';
Логические переменные measureBLERForSCI и measureBLERForSLSCH разрешить отключение измерений BLER и всех связанных с ними операций обработки приемника для SCI и SL-SCH соответственно. Это позволяет настроить моделирование для измерения BLER только для одного из каналов. Отключение обработки приемника для другого канала повышает скорость выполнения.
measureBLERForSCI = true; measureBLERForSLSCH = true;
Класс PSCCHPeriod представляет физическую структуру периода PSCCH. См. Пулы ресурсов LTE Sidelink и период PSCCH и PSCCHPeriod для получения дополнительной информации.
period = PSCCHPeriod;
Конфигурация пула ресурсов для передачи коммуникации D2D sidelink состоит из большого количества параметров, которые UE получает с помощью сообщений Radio Resource Control (RRC) [3]. Альтернативно, в случае UE, работающего вне зоны покрытия сети, эти параметры предварительно конфигурируются в UE. В этом моделировании используется конфигурация ссылочного пула ресурсов # 1-FDD из TS 36.101 Annex A.7.2.1-1 [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 создается в соответствии с опорным каналом измерения sidelink 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 структуре настроек 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 TS 36.101 [1].
ModCoding установлено значение, соответствующее размеру транспортного блока TBS.
NSAID поле устанавливается на произвольное 8-битовое значение (значение в диапазоне от 0 до 255), представляющее наименьшие 8 битов идентификатора Prose Layer-2 Group ID. 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). period.getAllowedRIV функция возвращает вектор значений RIV (RIVset) и соответствующую матрицу распределения ресурсов (range), где каждая строка содержит длину выделения и начальный блок ресурсов для каждого RIV. RIVset вектор сводится только к тем записям, которые имеют длину выделения, равную NPRB путем выполнения логической индексации.
[RIVset,range] = period.getAllowedRIV(sciMessage); RIVset = RIVset(range(:,1) == NPRB);
Будет показан пример фактических подкадров PSCCH и PSSCH и блоков ресурсов для передачи. Сообщение SCI конфигурируется с первым значением ресурса PSCCH PSCCHResource=0 и первое значение RIV PSSCH Allocation.RIV = RIVset(1). period.displayPeriod вызывается функция, проходящая в сообщении SCI, и строятся наборы подкадров PSCCH и PSSCH и блоков ресурсов, которые фактически будут использоваться для передачи. Подкадры и блоки ресурсов окрашены в зеленый цвет и являются подмножеством общего управляющего и общего пула ресурсов, показанных синим и желтым цветом соответственно. Для получения дополнительной информации см. пример пулов ресурсов LTE Sidelink и периода PSCCH. В соответствии с определением, приведенным в таблице 12.2.1-1 TS 36.101 [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 является истинным, приемник предполагает, что сообщение SCI было правильно декодировано при попытке приема совместно используемого канала. Это позволяет измерять рабочие характеристики приема совместно используемого канала независимо от рабочих характеристик приема канала управления. Если sciAssumed имеет значение false, отказ декодирования канала управления подразумевает сбой декодирования совместно используемого канала. Обратите внимание, что если измерение BLER для SCI отключено выше (measureBLERForSCI=false), и измерение BLER для SL-SCH включено (measureBLERForSLSCH=true), приемник будет считать, что сообщение SCI было правильно декодировано при измерении SL-SCH BLER независимо от установки sciAssumed здесь.
sciAssumed = true;
Рабочие характеристики приемника записываются в матрицы. controlErrors и sharedErrors. Каждая матрица имеет строку для каждой точки SNR и столбец для каждого моделируемого периода PSCCH. Элементы будут установлены в 1 для точек SNR/периодов 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 конфигурации периода обновляется в соответствии с текущим переданным периодом. Это поле используется совместно с периодом управления боковыми линиями связи (SC). sc_Period_r12 и индикатор смещения sc_TF_ResourceConfig_r12.offsetIndicator_r12 для определения прямого номера кадра (DFN) и номера субкадра для каждого субкадра в форме сигнала.
Выберите случайный ресурс PSCCH: Для бокового канала UE в режиме передачи 2 (например, вне зоны покрытия), ресурс PSCCH PSCCHResource должно быть выбрано случайным образом в соответствии с равномерным распределением между 0 и period.NumPSCCHReource-1. Ресурс PSCCH выбирает случайную пару подкадров и блоков физических ресурсов (PRB) в пуле ресурсов PSCCH, в котором осуществляется передача двух экземпляров передачи сообщения SCI. PSCCHResource добавляется в структуру сообщений SCI для передачи в period.generateWaveform функция. Следует отметить, что для UE, находящегося в зоне покрытия (т.е. работающего в режиме 1 передачи), управляющая информация задается сообщением формата 5 DCI, посланным eNireB, которое включает в себя PSCCHResource выбирается eNityB.
Выбор случайного ресурса 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 добавляется для достижения указанного SNR на элемент ресурса.
Прием каналов управления и совместного использования: Обработка приемника состоит из демодуляции PSCCH, декодирования SCI, демодуляции PSSCH и декодирования SL-SCH. Эти этапы более подробно описаны ниже.
Следует отметить, что этапы «Add AWGN» и «Receive control and shared channel» повторяются для каждой точки SNR с использованием одной и той же формы сигнала с замиранием.
Приемник выполняет следующие шаги:
Перед попыткой демодуляции 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 и соответствующие 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. Если декодированный ЦИК равен нулю, то декодированные биты сообщения преобразуются в соответствующую структуру сообщения с использованием lteSCI. NSAID поле сообщения, представляющее собой восемь LSB идентификатора назначения группы, сравнивается с ожидаемым значением NSAID. Если они равны, декодирование SCI считается успешным, и цикл значений ресурсов PSCCH завершается. Количество требуемых экземпляров передачи (1 или 2) записывается в controlRxs.
Поведение декодирования совместно используемого канала по отношению к неудачному декодированию SCI управляется переменной sciAssumed. Если sciAssumed является ложным, неудачное декодирование SCI немедленно подразумевает отказ декодировать SL-SCH, и дальнейшая обработка не происходит для текущего периода PSCCH. Если sciAssumed истинно, передаваемое сообщение SCI предполагается известным приемнику и будет использоваться вместо принятого сообщения SCI. Если sciAssumed является истинным или если декодирование 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: 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. Если ЦИК 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 для каждой проверенной точки SNR. Аналогично, 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 для канала управления и совместно используемого канала строятся для каждой точки SNR. Среднее количество экземпляров передачи, которые необходимо объединить для успешного приема для каждого SNR, также строятся. Следует отметить, что количество экземпляров передачи составляет 2 для канала управления и 4 для совместно используемого канала.
if (measureBLERForSCI || measureBLERForSLSCH) plotResults(channel,SNRIn,controlBLER,sharedBLER,controlRxsAvg,sharedRxsAvg); end


Поскольку сгенерированные графики были получены с низким числом периодов PSCCH, показанные результаты не являются репрезентативными. Моделирование периода 1000 PSCCH с практической оценкой канала, включая дополнительные точки SNR, дало результаты, показанные ниже.


В этом примере используется вспомогательная функция:
3GPP ТС 36.101 «Радиопередача и прием пользовательского оборудования (UE)»
3GPP ТС 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