Этот пример демонстрирует, как измерить Физический Sidelink Разделяемый Канал (PSSCH) и Физический Канал Управления Sidelink (PSCCH) производительность пропускной способности в выборочном частотой исчезновении и Аддитивном белом Гауссовом шуме (AWGN) с помощью LTE Toolbox™.
3GPP Релиз 14 ввел поддержку (транспортного средства всего) LTE V2X, чтобы включить соединенные автомобильные сервисы с целью обеспечения более безопасной, более чистой, более быстрой и более эффективной транспортировки. V2X предлагает несколько режимов работы включая От транспортного средства к транспортному средству (V2V), Транспортное средство к инфраструктуре (V2I) и Транспортное средство Пешеходу (V2P) непосредственная связь, обязательно не используя сетевое участие для планирования. Некоторые различающие аспекты V2X по непрямому от устройства к устройству Релиза 12:
Низкая задержка и высокие требования надежности
Большой эффект Доплера из-за высоких относительных скоростей
Очень большое количество узлов и высокой плотности узла
Вызовы синхронизации особенно, когда из покрытия
Этот пример измеряет Релиз 14 V2X, непрямой совместно использованный и пропускная способность канала управления для многих точек ОСШ. Для получения информации о том, как смоделировать Релиз 12 непрямой интерфейс (D2D) от устройства к устройству (нацеленный, в основном, на разрешение LTE поддержать системы связи общественной безопасности), смотрите Релиз 14 V2X Sidelink PSCCH и пример Пропускной способности PSSCH.
Работая с подкадром основанием подкадра для каждой точки ОСШ, следующие шаги выполняются для вычисления BLER и пропускной способности:
Сетка ресурса, заполненная с PSCCH и/или PSSCH, сгенерирована, и OFDM модулируется, чтобы создать основополосную форму волны, чтобы передать
Эта форма волны передается через шумный исчезающий канал
Работа получателя (демодуляция SC-FDMA, оценка канала и эквализация) выполняется
Компенсируемые символы декодируются, чтобы получить блок CRC
Производительность PSCCH и/или PSSCH определяется с помощью результата блока CRC при выходе декодера канала
Пример выполняется в течение продолжительности симуляции 4 систем координат для многих точек ОСШ. Большее число NFrames
должен использоваться, чтобы привести к значимым результатам пропускной способности. SNRIn
может быть массив значений или скаляра.
% Set the number of frames to simulate NFrames = 4; % Set a range of SNR points to cover both high and low BLER operating % conditions SNRIn = [-5 0 5];
Набор параметров верхнего уровня первоначально задан, они включают пропускную способность, циклический префикс, схему модуляции и выделенный набор блоков ресурса. Базовая настройка взята из "Ссылочного канала измерения для характеристик передатчика", как задано таблицей A.8.3-1 [2] TS 36.101. Чтобы симулировать более реалистическую передачу V2X, несколько процессов HARQ и повторных передач HARQ были введены в этом примере. Скорость передачи данных задана в терминах разрыва подкадра sfGap
и временной интервал передачи tti
.
sfGap = 8; % Time in subframes between initial and retransmission tti = 4; % Time in subframes between different HARQ processes if tti > sfGap error('tti cannot be greater than sfGap'); end % Number of allocated resource blocks (NPRB) and Transport Block Size (TBS) % as given by TS 36.101 Table A.8.3-1. Note that TBS must be chosen % according to TS 36.213 section 14.1.1 and NPRB according to TS 36.213 % section 14.1.1.4C. If an invalid TBS/NPRB is specified, the transmitted % ModCoding value in the SCI message would be incorrect and this could % result in the SL-SCH decoding to fail. An invalid NPRB could also result % in an SCI message and corresponding PSSCH transmission where the % allocated resources are different from the NPRB specified here. NPRB = 48; % Number of allocated resource blocks (NPRB) TBS = 3496; % The transport block size % Define the starting RB for the resource allocations. The initial and % subsequent transmission can have different allocations rbStart = [0 0]; % Define the UE configuration parameters ueConfig = struct('SidelinkMode','V2X');% Release 14 V2X mode ueConfig.NSLRB = 50; % 10MHz bandwidth ueConfig.DuplexMode = 'FDD'; % Duplex mode ueConfig.CyclicPrefixSL = 'Normal'; % Cyclic prefix length ueConfig.Modulation = 'QPSK'; % Symbol modulation ('QPSK','16QAM')
Структура channel
содержит параметры конфигурации модели канала.
channel = struct; % Channel config structure channel.Seed = 6; % Channel seed channel.NRxAnts = 2; % Number of receive antennas channel.DelayProfile ='EVA'; % Delay profile channel.DopplerFreq = 500; % Doppler frequency in Hz channel.MIMOCorrelation = 'Low'; % Multi-antenna correlation channel.NTerms = 16; % Oscillators used in fading model channel.ModelType = 'GMEDS'; % Rayleigh fading model type channel.InitPhase = 'Random'; % Random initial phases channel.NormalizePathGains = 'On'; % Normalize delay profile power channel.NormalizeTxAnts = 'On'; % Normalize for transmit antennas % The channel sampling rate depends on the FFT size used in the OFDM % modulator. This can be obtained using the function lteSLSCFDMAInfo. ofdmInfo = lteSLSCFDMAInfo(ueConfig); channel.SamplingRate = ofdmInfo.SamplingRate;
Переменная perfectChanEstimator
средства управления образовывают канал поведение средства оценки. Допустимыми значениями является true
или false
. Когда установлено в true
, совершенный ответ канала используется в качестве оценки, в противном случае несовершенная оценка на основе значений полученных сигналов DM-RS получена. Если perfectChanEstimator
установлен в ложь конфигурационная структура cec
необходим, чтобы параметрировать средство оценки канала.
% Perfect channel estimator flag perfectChanEstimator = false; % Define the practical channel estimator configuration structure. Note that % depending on the channel delay profile and Doppler frequency, the % operating SNR, PSSCH modulation order and the number of allocated % resource blocks, different channel estimation parameters may give better % performance. cec = struct; % Channel estimation config structure cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 27; % Frequency window size cec.TimeWindow = 1; % Time window size cec.InterpType = 'Cubic'; % 2D interpolation type
Логические переменные measureBLERForSCI
и measureTputForSLSCH
позвольте измерениям пропускной способности и всей связанной обработке получателя быть отключенными для SCI и SL-SCH соответственно. Это позволяет симуляции быть сконфигурированной, чтобы измерить пропускную способность для только одного из каналов. Отключение обработки получателя для другого канала улучшает скорость выполнения.
measureBLERForSCI = true; measureTputForSLSCH = true;
Логическая переменная sciAssumed
управляет поведением симуляции в терминах влияния, которое декодирование канала управления оказывает на разделяемое декодирование канала. Если sciAssumed
верно, получатель примет, что сообщение SCI правильно декодировалось когда попытка совместно использованный прием канала. Это позволяет производительности разделяемого приема канала быть измеренной независимо от производительности приема канала управления. Если sciAssumed
является ложным, отказ декодирования канала управления подразумевает разделяемый отказ декодирования канала. Обратите внимание на то, что, если измерение пропускной способности для SCI отключено выше (measureBLERForSCI=false
), и измерение пропускной способности для SL-SCH включено (measureTputForSLSCH=true
), получатель примет, что сообщение SCI правильно декодировалось при измерении пропускной способности SL-SCH независимо от установки sciAssumed
здесь.
sciAssumed = false;
Переменная displaySimulationInformation
управляет отображением информации о симуляции, такой как используемый ID процесса HARQ и график распределения ресурсов в каждом подкадре. Для долгих симуляций рекомендуется выключить отображение, когда это увеличивает время симуляции.
displaySimulationInformation = true;
Передача и возможности приема для непрямых прямых коммуникаций сопоставлены с набором периодически происходящих периодов временного интервала, известных как пулы ресурсов. UE может быть сконфигурирован с несколькими сообщениями и поэтому несколькими пулами ресурсов для передачи и приема. Один пул ресурсов содержит и разделяемый подкадр и подкадр управления и пулы ресурсов, и определенная передача задана комбинацией полустатических параметров RRC динамическими параметрами DCI/SCI. PSCCH, сопоставленный с PSSCH, отправляется в том же подкадре, или на смежном или на несмежном PRB. Для того, чтобы проиллюстрировать структуру пулов ресурсов V2X, пример использует класс V2XSidelinkResourcePool. V2XSidelinkResourcePool, моделирует пул ресурсов и обеспечивает параметры и методы, чтобы задать определенную передачу. V2XSidelinkResourcePool.displayPeriod метода называется, который создает график, показывающий местоположения пула ресурсов управления пул (темно-синего) и совместно используемого ресурса (желтый) в пуле ресурсов.
resourcePool = V2XSidelinkResourcePool; resourcePool.Config.NSLRB = ueConfig.NSLRB; resourcePool.Config.DuplexMode = ueConfig.DuplexMode; if displaySimulationInformation resourcePool.displayPeriod; drawnow; end
Чтобы определить пропускную способность в каждой точке ОСШ, подкадр цепью обработки подкадра включает:
Обновите настройку для текущего процесса HARQ - UE или несет новые транспортные данные или повторную передачу ранее отправленных транспортных данных о PSSCH с различной версией сокращения. Все это обработано планировщиком HARQ. HARQ буферизуют decState
хранит состояние декодера для мягкого объединения.
Создайте и закодируйте сообщение SCI - сообщение SCI несет непрямую информацию о планировании. Параметры SCI: Priority
указывая на ProSe Приоритет На пакет, ResourceReservation
установите более высокими слоями для резервирования ресурса для следующей передачи транспортного блока, RIV
неся информацию о выделении, TimeGap
сигнализирование о времени разрывает в подкадрах между начальной передачей и повторной передачей, ModCoding
сигнализация о схеме модуляции используется в приеме PSSCH и RetransmissionIdx
указание, является ли передача первой или второй (повторная передача). Сообщение SCI затем закодировано и сопоставлено на PSCCH для передачи. CRC сообщения SCI является борющейся идентичностью для PSSCH.
Постройте выделенные ресурсы - распределение ресурсов для первого процесса HARQ построено если displaySimulationInformation
флаг включен. Все процессы HARQ имеют тот же (оранжевый) PSSCH и PSCCH (зеленое) выделение блока ресурса. PSCCH и PSSCH могут быть переданы на смежных или несмежных блоках ресурса.
Создайте Форму волны Передачи - Передача, данные, сгенерированные UE к этапу обработки физического уровня, чтобы произвести SC-FDMA, модулировали форму волны, содержа PSCCH и физические каналы PSSCH и сигналы DRS.
Шумное Моделирование Канала - Передача форма волны через исчезающий канал и добавляет шум (AWGN).
Выполните Слепое Обнаружение PSCCH - ресурсы PSCCH и циклический сдвиг, используемый в передатчике в подкадре, неизвестны, таким образом, синхронизация, оценка канала и декодирование выполняются для каждого набора PRB в пуле блока ресурса PSCCH (обеспеченный resourcePool. PSCCHResourceBlockPool) для всех циклических сдвигов, пока успешно не декодируется SCI, или целый пул ресурсов ищется. Смещение синхронизации для корреляции DM-RS с самым сильным пиком используется в синхронизации.
Выполните оценку канала PSCCH: оценка канала PSCCH выполняется с помощью lteSLChannelEstimatePSCCH. Средство оценки канала также производит оценку шумовой степени, которая может использоваться в эквализации MMSE.
Извлеките символы PSCCH и оценку канала: полученные символы PSCCH извлечены из сетки ресурса подкадра, соответствующие оценки канала извлечены с помощью lteExtractResources и индексы, обеспеченные ltePSCCHIndices.
Выполните эквализацию PSCCH: символы PSCCH являются компенсируемым использованием MMSE lteEqualizeMMSE с оценкой канала и шумовой оценкой, полученной выше.
Выполните демодуляцию PSCCH: компенсируемые символы PSCCH демодулируются с помощью ltePSCCHDecode. Эта функция выполняет инверсию шагов модуляции передатчика (SC-FDMA преобразовывают deprecoding, демодуляцию символа QPSK и дескремблирующий).
Выполните декодирование SCI: декодирование SCI предпринято с помощью lteSCIDecode. Количество исходных информационных битов в сообщении SCI дано lteSCIInfo. Если декодируемый CRC является нулем, и восстановленная маска CRC является ожидаемым значением, декодирование SCI рассматривается успешным, и декодируемые биты сообщения преобразованы в соответствующую структуру сообщения с помощью lteSCI. Значение маски CRC предоставляет PSSCH борющуюся идентичность, NXID
.
Поведением разделяемого декодирования канала относительно не пройдено декодирования SCI управляет переменная sciAssumed
. Если sciAssumed
является ложным, не пройдено SCI, декодирующий сразу, подразумевает отказ декодировать SL-SCH, и никакая последующая обработка не происходит для текущего подкадра. Если sciAssumed
верно, переданное сообщение SCI принято, чтобы быть известным получателю и будет использоваться вместо полученного сообщения SCI. Если sciAssumed
верно или если декодирование SCI было успешно, доходы получателя с декодированием SL-SCH. Обратите внимание на то, что, если измерение BLER SCI отключено, но измерение пропускной способности SL-SCH включено затем, переданное сообщение SCI принято, чтобы быть известным получателю.
Для декодирования SL-SCH:
Получите распределение ресурсов PSSCH - RIV, полученный из восстановленного сообщения SCI, затем декодируется, чтобы получить количество подканалов и запуска sub канал, выделенный для этой передачи. Это в сочетании со смежностью PSCCH, размером каждого подканала и сначала выделенного блока ресурса обеспечивает набор выделенного RBS PSSCH PRBSet.
Синхронизируйтесь и SC-FDMA демодулируют подкадр, несущий PSSCH: соответствующий подкадр формы волны синхронизируется с помощью lteSLFrameOffsetPSSCH. Синхронизируемая форма волны является демодулируемым использованием SC-FDMA lteSLSCFDMADemodulate. Обратите внимание на то, что несмотря на то, что управление и совместно использованный канал передаются в том же подкадре, достаточно выполнить синхронизацию и демодуляцию SC-FDMA только для PSCCH. Однако в этом примере, поскольку разделяемый канал и канал управления могут быть независимо получены, синхронизация PSSCH и демодуляция SC-FDMA выполняются. Это должно включить прием PSSCH, когда прием PSCCH отключен.
Выполните оценку канала PSSCH: оценка канала PSSCH выполняется с помощью lteSLChannelEstimatePSSCH. Средство оценки канала также производит оценку шумовой степени, которая может использоваться в эквализации MMSE.
Извлеките символы PSSCH и оценку канала: полученные символы PSSCH извлечены из сетки ресурса подкадра, и соответствующие оценки канала извлечены с помощью lteExtractResources и индексы, обеспеченные ltePSSCHIndices.
Выполните эквализацию PSSCH: символы PSSCH являются компенсируемым использованием MMSE lteEqualizeMMSE с оценкой канала и шумовой оценкой, полученной выше.
Выполните демодуляцию PSSCH: компенсируемые символы PSSCH демодулируются с помощью ltePSSCHDecode. Эта функция выполняет инверсию шагов модуляции передатчика (SC-FDMA преобразовывают deprecoding, QPSK или 16QAM демодуляция символа и дескремблирующий). Дескремблирование использует CRC PSCCH, полученный из этапа декодирования SCI.
При декодировании Sidelink Разделяемый Канал (SL-SCH) и Хранении Ошибки CRC Блока для UE - Передача вектор декодируемых мягких битов к lteSLSCHDecode, который декодирует кодовую комбинацию и возвращает ошибку блока CRC, раньше определял пропускную способность системы. Содержимое нового мягкого буфера, harqProcesses(harqID).decState
, доступно при выходе этой функции, которая будет использоваться при декодировании следующего подкадра.
% Initialize variables used in the simulation and analysis maxThroughputSLSCH = zeros(length(SNRIn),1); simThroughputSLSCH = zeros(length(SNRIn),1); simBLERSCI = zeros(length(SNRIn),1); % Get the number of HARQ processes required nHARQProcesses = floor(sfGap/tti); % Calculate the HARQ ID sequence for each of the transmitting subframes harqProcessSequence = zeros(1,NFrames*10); for h = 1:nHARQProcesses harqProcessSequence(1+tti*(h-1):sfGap:NFrames*10) = h; end % Create the partial SCI message with the parameters that have fixed values % for the simulation. Other parameters that have variable values will be % set further down in the simulation loop sciMessage = struct('SCIFormat','Format1'); sciMessage.TimeGap = sfGap; % Set the PSSCH MCS according to the TBS and modulation scheme [itbs,modn] = lteMCS(0:28,'PUSCH'); % According to TS 36.213 Section 14.1.1, for IMCS (0 to 28), the modulation % order is set to Q' = min(4,Qm') where Qm' can be 2, 4 or 6. So change the % cases where Qm' = 6 ('64QAM') to Qm' = 4 ('16QAM') modn(strcmpi(modn, '64QAM')) = {'16QAM'}; % Filter valid transport block sizes according to modulation scheme used possibleTBS = lteTBS(NPRB,itbs); possibleTBS(~strcmpi(modn,ueConfig.Modulation)) = 0; % Now set the MCS index according to the TBS sciMessage.ModCoding = find(possibleTBS==TBS,1) - 1; % Create new figure for displaying resource allocation, if required if displaySimulationInformation figure; end % 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'); for snrIdx = 1:numel(SNRIn) % Set the random number generator seed depending on the loop variable % to ensure independent random streams rng(snrIdx); % Initialize the state of all HARQ buffers harqProcess = struct('RVIdx',1,'data',[],'decState',[]); harqProcesses(1:nHARQProcesses) = harqProcess; RVSeq = [0 2]; % RV for initial transmission and retransmission % Set up variables for the main loop lastOffset = 0; % Initialize overall frame timing offset frameOffset = 0; % Initialize frame timing offset sharedbitTput = []; % Number of successfully received bits per subframe txedTrBlkSizes = []; % Number of transmitted bits per subframe controlErrors = []; % Number of SCI block errors for subframeNo = 0:(NFrames*10-1) harqID = harqProcessSequence(subframeNo+1); if harqID == 0 % If there is no HARQ process transmitting in the current % subframe, continue to the next continue end % Update current HARQ process with new transport data and reset the % receive buffer if it is the initial transmission. The PSSCH is % transmitted twice with a gap of 'sfGap' subframes irrespective of % the success of the first transmission if harqProcesses(harqID).RVIdx == 1 harqProcesses(harqID).data = randi([0 1], TBS, 1); harqProcesses(harqID).decState = []; end % Set the RV ueConfig.RV = RVSeq(harqProcesses(harqID).RVIdx); % Set the subframe number ueConfig.NSubframePSSCH = subframeNo; % Display run time information if displaySimulationInformation fprintf('Subframe: %d. HARQ process index: %d. Redundancy version: %d\n',subframeNo,harqID,ueConfig.RV) end % Channel time for the current subframe channel.InitTime = subframeNo/1000; % create an empty resource grid slgrid = lteSLResourceGrid(ueConfig); % Update the transmission config with the starting RB startingRB = rbStart(harqProcesses(harqID).RVIdx); resourcePool.Config.startRB_Subchannel_r14 = startingRB; % Calculate the RIV from the number of allocated subchannels and % the starting subchannel ueConfig.FirstSubchannelIdx = 0; beta = 0; if strcmpi(resourcePool.Config.adjacencyPSCCH_PSSCH_r14,'On') beta = 2; end lsubCH = ceil((NPRB+beta)/resourcePool.Config.sizeSubchannel_r14); sciMessage.RIV = resourcePool.encodeRIV(lsubCH,ueConfig.FirstSubchannelIdx); % Set the retransmission index sciMessage.RetransmissionIdx = harqProcesses(harqID).RVIdx - 1; % Create the SCI and message bits sciConfig = ueConfig; sciConfig.PSSCHNSubchannels = resourcePool.Config.numSubchannel_r14; [sciMessage, sciBits] = lteSCI(sciConfig,sciMessage); % Perform SCI encoding [cw,crc] = lteSCIEncode(sciConfig, sciBits); % NXID is the 16 bit CRC associated with the PSCCH SCI grant and is % used as the PSSCH scrambling identity ueConfig.NXID = crc; % Store NXID value in 'expectedNXID' so that the receiver won't % have to access 'sciMessage' at all expectedNXID = ueConfig.NXID; % Display the subframes and resource blocks for transmission. Note % that the allocations are the same for all HARQ processes and that % the plot does not show the subframe offset for HARQ processes % other than 1 if (displaySimulationInformation) && (harqID==1) % Specify the additional parameters required for the resource % pool display sciMessage.FirstSubchannelIdx = ueConfig.FirstSubchannelIdx; sciMessage.SLIndex = 0; resourcePool.displayPeriod(sciMessage,10); drawnow; end % Create the PSCCH codeword pscchSymbols = ltePSCCH(cw); % Get the resource allocation for the PSCCH [pscchsf,pscchrb] = resourcePool.getPSCCHResources(setfield(sciMessage,'FirstSubchannelIdx',ueConfig.FirstSubchannelIdx)); %#ok<SFLD> % Select the resource for this transmission sciConfig.PRBSet = pscchrb(:,harqProcesses(harqID).RVIdx); % Get the PSCCH symbol indices pscchIndices = ltePSCCHIndices(sciConfig); % Map the PSCCH symbols on to the grid slgrid(pscchIndices) = pscchSymbols; % Define a random cyclic shift from the set {0,3,6,9} for each % PSCCH transmission sciConfig.CyclicShift = randi([0 3])*3; % Create the DM-RS symbols and indices pscchdrssymbols = ltePSCCHDRS(sciConfig); pscchdrsindices = ltePSCCHDRSIndices(sciConfig); % Map the PSCCH DRS symbols on to the grid slgrid(pscchdrsindices) = pscchdrssymbols; % Get the resource allocations for the two transmissions [psschsf,psschrb] = resourcePool.getPSSCHResources(setfield(sciMessage,'FirstSubchannelIdx',ueConfig.FirstSubchannelIdx)); %#ok<SFLD> % Now select the resource for this transmission ueConfig.PRBSet = psschrb(:,harqProcesses(harqID).RVIdx); % Calculate the PSSCH resource indices [psschIndices,psschinfo] = ltePSSCHIndices(ueConfig); % SL-SCH and PSSCH cw = lteSLSCH(ueConfig,psschinfo.G,harqProcesses(harqID).data); psschSymbols = ltePSSCH(ueConfig,cw); slgrid(psschIndices) = psschSymbols; % PSSCH DRS and DRS indices psschdrssymbols = ltePSSCHDRS(ueConfig); psschdrsindices = ltePSSCHDRSIndices(ueConfig); slgrid(psschdrsindices) = psschdrssymbols; % The SC-FDMA modulation will not use windowing due to the % piece-wise nature of the waveform construction windowing = 0; % perform sidelink SC-FDMA modulation [txWaveform,scfdmaInfo] = lteSLSCFDMAModulate(ueConfig,slgrid,windowing); % Add 25 sample padding. This is to cover the range of delays % expected from channel modeling (a combination of % implementation delay and channel delay spread) ntxants = size(txWaveform,2); txWaveform = [txWaveform; zeros(25, ntxants)]; %#ok<AGROW> % Pass data through channel model rxNoiselessWaveform = lteFadingChannel(channel,txWaveform); % Calculate noise gain SNR = 10^((SNRIn(snrIdx))/20); % Normalize noise power to take account of sampling rate, % which is a function of the IFFT size used in OFDM % modulation, and the number of antennas N0 = 1/(sqrt(2.0*ntxants*double(ofdmInfo.Nfft))*SNR); % Create AWGN noise = N0*complex(randn(size(rxNoiselessWaveform)),... randn(size(rxNoiselessWaveform))); % Add AWGN to the received time domain waveform rxWaveform = rxNoiselessWaveform + noise; %------------------------------------------------------------------ % Receiver %------------------------------------------------------------------ % Define the receiver top-level configuration rxConfig = []; rxConfig.SidelinkMode = ueConfig.SidelinkMode; rxConfig.CyclicPrefixSL = ueConfig.CyclicPrefixSL; rxConfig.FirstSubchannelIdx = ueConfig.FirstSubchannelIdx; rxConfig.NSLRB = resourcePool.Config.NSLRB; rxConfig.DuplexMode = resourcePool.Config.DuplexMode; rxConfig.TDDConfig = resourcePool.Config.TDDConfig; rxConfig.PSSCHNSubchannels = resourcePool.Config.numSubchannel_r14; rxConfig.PSSCHSubchannelSize = resourcePool.Config.sizeSubchannel_r14; rxConfig.PSSCHAdjacency = resourcePool.Config.adjacencyPSCCH_PSSCH_r14; rxConfig.PSSCHSubchannelPRBStart = resourcePool.Config.startRB_Subchannel_r14; rxConfig.NSubframePSSCH = subframeNo; % Set the subframe number % If SCI BLER measurement is configured: sciDecoded = false; if measureBLERForSCI % Blind decoding of the control channel % We know that the current subframe contains control and data, % but do not know the location. Check for the SCI message in % the resource pool for all cyclic shifts till it is found or % the whole resource pool is searched pscchPool = resourcePool.PSCCHResourceBlockPool; % Re-arrange the resources into the possible PRB pairs pscchPool = reshape(pscchPool,2,numel(pscchPool)/2); p = 1; while p <= size(pscchPool,2) && ~sciDecoded % PSCCH DRS for V2X is transmitted on two consecutive RBs rxConfig.PRBSet = pscchPool(:,p); for cs = [0 3 6 9] rxConfig.CyclicShift = cs; [frameOffset,corr] = lteSLFrameOffsetPSCCH(rxConfig,rxWaveform); % Perform subframe synchronization if (frameOffset > 25) || (frameOffset < 0) frameOffset = lastOffset; end lastOffset = frameOffset; % Perform SC-FDMA demodulation on the received data to obtain % the resource grid rxSubframe = lteSLSCFDMADemodulate(rxConfig,rxWaveform(1+frameOffset:end,:)); % Perform channel estimation if(perfectChanEstimator) [hest,nest] = perfectChannelEstimate(rxConfig,channel,noise,frameOffset); else [hest,nest] = lteSLChannelEstimatePSCCH(rxConfig,cec,rxSubframe); end % Get the PSCCH candidate for the current PRBSet, % extract the corresponding received symbols and % channel estimate and perform equalization pscchCandidate = ltePSCCHIndices(rxConfig); [pscchRx,pscchHest] = lteExtractResources(pscchCandidate,rxSubframe,hest); pscchSymbols = lteEqualizeMMSE(pscchRx,pscchHest,nest); % Demodulate the PSCCH codedsciBits = ltePSCCHDecode(pscchSymbols); % Get the payload size for the Release 14 V2X SCI message scilengthinfo = lteSCIInfo(rxConfig); % Decode the SCI and recover the message [rxinfo,rxSCIErr,rxcrc] = lteSCIDecode(scilengthinfo.Format1,codedsciBits); if ~rxSCIErr && (rxcrc==expectedNXID) sciMessageRx = lteSCI(rxConfig,rxinfo); rxConfig.NXID = rxcrc; sciDecoded = true; if (displaySimulationInformation) fprintf(' SCI decoded\n'); end break; end end % Increment the pool index p = p+1; end if ~sciDecoded if (displaySimulationInformation) fprintf(' SCI decoding failed\n'); end end % Store values needed to calculate BLER controlErrors = [controlErrors ~sciDecoded]; %#ok<AGROW> 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. Also set the NXID to the expected value if (~sciDecoded) && (sciAssumed) sciMessageRx = sciMessage; rxConfig.NXID = expectedNXID; end % If SL-SCH throughput measurement is configured and if the SCI was % successfully decoded or if SCI decoding success is assumed, % perform PSSCH reception and SL-SCH decoding if measureTputForSLSCH if (sciDecoded || sciAssumed) % Get the PSSCH resource allocation from the decoded SCI % message and pool configuration rxConfig.PRBSet = lteSCIResourceAllocation(rxConfig,sciMessageRx); % Perform subframe synchronization frameOffset = lteSLFrameOffsetPSSCH(rxConfig,rxWaveform); if (frameOffset > 25) || (frameOffset < 0) frameOffset = lastOffset; end lastOffset = frameOffset; % Perform SC-FDMA demodulation on the received data to obtain % the resource grid rxSubframe = lteSLSCFDMADemodulate(rxConfig,rxWaveform(1+frameOffset:end,:)); % Perform channel estimation, extract the received PSSCH % symbols and the corresponding channel estimate, and % perform equalization if(perfectChanEstimator) [hest,nest] = perfectChannelEstimate(rxConfig,channel,noise,frameOffset); else [hest,nest] = lteSLChannelEstimatePSSCH(rxConfig,cec,rxSubframe); end [psschRx,psschHest] = lteExtractResources(psschIndices,rxSubframe,hest); psschSymbols = lteEqualizeMMSE(psschRx,psschHest,nest); % Demodulate the PSSCH [~,rxConfig.Modulation] = lteMCS(sciMessageRx.ModCoding,'PUSCH'); if (strcmpi(rxConfig.Modulation,'64QAM')) rxConfig.Modulation = '16QAM'; end codedSlschBits = ltePSSCHDecode(rxConfig,psschSymbols); % Decode the SL-SCH, including soft combining into the % receiver buffer and check the CRC rxConfig.NTurboDecIts = 5; % Turbo decoder iterations rxConfig.RV = RVSeq(harqProcesses(harqID).RVIdx); [~,slschCRC,harqProcesses(harqID).decState] = ... lteSLSCHDecode(rxConfig,TBS,codedSlschBits, ... harqProcesses(harqID).decState); slschDecoded = ~slschCRC; else % If SCI decoding failed, SL-SCH decoding also failed slschDecoded = false; end % Store values needed to calculate throughput sharedbitTput = [sharedbitTput TBS*slschDecoded]; %#ok<AGROW> txedTrBlkSizes = [txedTrBlkSizes TBS]; %#ok<AGROW> if (displaySimulationInformation) if slschDecoded fprintf(' SL-SCH decoded\n'); else fprintf(' SL-SCH decoding failed\n'); end end end % Update the RV sequence index for the next transmission harqProcesses(harqID).RVIdx = mod(harqProcesses(harqID).RVIdx,size(RVSeq,2))+1; end if measureBLERForSCI % Calculate the SCI BLER simBLERSCI(snrIdx) = 100*mean(controlErrors,2); % Display the results dynamically in the command window fprintf('\nSNR = %.2f dB. SCI BLER(%%) for %d Frame(s) = %.4f %%\n',... SNRIn(snrIdx),NFrames,simBLERSCI(snrIdx)); end if measureTputForSLSCH % Calculate the maximum and simulated throughput maxThroughputSLSCH(snrIdx) = sum(txedTrBlkSizes); % Max possible throughput simThroughputSLSCH(snrIdx) = sum(sharedbitTput); % Simulated throughput % Display the results dynamically in the command window fprintf('\nSNR = %.2f dB. SL-SCH Throughput for %d Frame(s) = %.4f Mbps\n',... SNRIn(snrIdx),NFrames,1e-6*simThroughputSLSCH(snrIdx)/(NFrames*10e-3)); fprintf('SNR = %.2f dB. SL-SCH Throughput(%%) for %d Frame(s) = %.4f %%\n',... SNRIn(snrIdx),NFrames,simThroughputSLSCH(snrIdx)*100/maxThroughputSLSCH(snrIdx)); end end
Subframe: 0. HARQ process index: 1. Redundancy version: 0 SCI decoding failed SL-SCH decoding failed Subframe: 4. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoding failed Subframe: 8. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoding failed Subframe: 12. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 16. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoding failed Subframe: 20. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoding failed Subframe: 24. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 28. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 32. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoding failed Subframe: 36. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoding failed SNR = -5.00 dB. SCI BLER(%) for 4 Frame(s) = 10.0000 % SNR = -5.00 dB. SL-SCH Throughput for 4 Frame(s) = 0.2622 Mbps SNR = -5.00 dB. SL-SCH Throughput(%) for 4 Frame(s) = 30.0000 % Subframe: 0. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 4. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 8. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 12. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 16. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 20. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 24. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 28. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 32. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 36. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded SNR = 0.00 dB. SCI BLER(%) for 4 Frame(s) = 0.0000 % SNR = 0.00 dB. SL-SCH Throughput for 4 Frame(s) = 0.8740 Mbps SNR = 0.00 dB. SL-SCH Throughput(%) for 4 Frame(s) = 100.0000 % Subframe: 0. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 4. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 8. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 12. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 16. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 20. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 24. HARQ process index: 1. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 28. HARQ process index: 2. Redundancy version: 2 SCI decoded SL-SCH decoded Subframe: 32. HARQ process index: 1. Redundancy version: 0 SCI decoded SL-SCH decoded Subframe: 36. HARQ process index: 2. Redundancy version: 0 SCI decoded SL-SCH decoded SNR = 5.00 dB. SCI BLER(%) for 4 Frame(s) = 0.0000 % SNR = 5.00 dB. SL-SCH Throughput for 4 Frame(s) = 0.8740 Mbps SNR = 5.00 dB. SL-SCH Throughput(%) for 4 Frame(s) = 100.0000 %
Результаты симуляции отображены в командном окне MATLAB® после того, как каждая точка ОСШ будет завершена. Они также получены в выходных массивах simBLERSCI
, simThroughputSLSCH
и maxThroughputSLSCH
. Для каждой симулированной точки ОСШ, simBLERSCI
хранит измеренный BLER SCI, simThroughputSLSCH
хранит измеренную пропускную способность SL-SCH в количестве битов и maxThroughputSLSCH
хранит максимальную возможную пропускную способность SL-SCH в количестве битов.
if measureBLERForSCI % Plot PSCCH/SCI BLER plotResults('SCI', 'BLER',channel,SNRIn,simBLERSCI); end if measureTputForSLSCH % Plot PSSCH/SL-SCH throughput plotResults('SL-SCH', 'Throughput',channel,SNRIn,simThroughputSLSCH*100./maxThroughputSLSCH); end
Для статистически допустимых результатов симуляция должна быть запущена для большего числа систем координат. Фигуры ниже показа BLER SCI и пропускная способность SL-SCH заканчиваются при симуляции 1 000 систем координат для расширенной области значений значений ОСШ с практической оценкой канала.
3GPP TS 36.213 "Процедуры физического уровня"
3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"
Следующие локальные функции используются в этом примере:
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; hest = lteULPerfectChannelEstimate(rxConfig,channel,frameOffset); noiseGrid = lteSLSCFDMADemodulate(rxConfig,noise(1+frameOffset:end ,:)); nest = var(noiseGrid(:)); end % Plot the SCI BLER or SL-SCH Throughput function plotResults(chName,simOpt,channel,xvalues,yvalues) fadingDescription = sprintf('%s%s',channel.DelayProfile,num2str(channel.DopplerFreq)); figure; plot(xvalues, yvalues,'*-.'); v = axis; axis([v(1) v(2) -10 110]) title(sprintf('V2X Sidelink %s %s (%%) in %s fading and AWGN',chName,simOpt,fadingDescription)); xlabel('SNR (dB)'); ylabel([simOpt ' (%)']); grid on; end