exponenta event banner

Частота ошибок блока PUCCH NR

Этот пример показывает, как измерить частоту появления ошибочных блоков (ЧАСТОТА БЛОКОВ С ОШИБКАМИ) информации о контроле за каналом восходящей связи (UCI), переданной на физическом канале контроля за каналом восходящей связи (PUCCH) в 5G НОМЕР использования связи 5G особенности Toolbox™.

Введение

В этом примере измеряется BLER UCI, передаваемого в формате 3 PUCCH 5G линии связи.

BLER UCI определяется как вероятность неправильного декодирования UCI при передаче UCI.

BLERUCI = # (ложный UCI) # (UCI)

  • # (false UCI) - количество случаев, когда передаваемый UCI декодируется неправильно.

  • # (UCI) - количество случаев передачи UCI.

Они 5G НОМЕР особенностей смоделированы в этом примере.

  • Кодирование и декодирование UCI

  • PUCCH и соответствующий опорный сигнал демодуляции (DM-RS)

  • Модуляция и демодуляция OFDM

  • Канал распространения линии задержки с отводом (TDL)

Другие особенности моделирования в этом примере:

  • Идеальная или практичная синхронизация и оценка канала

  • Уравнивание

Для сокращения общего времени моделирования можно использовать функции параллельного вычисления Toolbox™ для параллельного выполнения точек отношения сигнал/шум (SNR) контура SNR.

Длина моделирования и точки SNR

Задайте длину моделирования в терминах количества кадров 10 мс. Большое число для NFrames необходимо использовать для получения значимых результатов по пропускной способности. Установите точки SNR для моделирования. SNR определяется для каждого элемента ресурса (RE) и применяется к каждой приемной антенне.

simParameters = struct;         % Create simParameters structure
simParameters.NFrames = 5;      % Number of 10 ms frames
simParameters.SNRIn = -14:2:-4; % SNR range (dB)

Установите displaySimulationInformation переменная для true отображение информации моделирования BLER в каждой точке SNR.

displaySimulationInformation = true;

Конфигурация полки и PUCCH

Установите носитель со следующими свойствами:

  • Идентификация ячейки физического уровня

  • Интервал между поднесущими (SCS) в кГц

  • Циклический префикс

  • Полоса пропускания в блоках ресурсов (RB). Каждый RB содержит 12 поднесущих

  • Запуск RB несущей относительно блока 0 общих ресурсов (CRB 0)

Задайте конфигурацию формата 3 PUCCH со следующими свойствами:

  • Назначенный набор RB

  • Распределение символов ([S L])

  • Схема модуляции

  • Конфигурация скачкообразной перестройки частоты

  • RB запуска второго транзитного участка

  • Конфигурация скачкообразной перестройки группы

  • Скремблирование удостоверений

  • Дополнительная конфигурация DM-RS

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

  • Количество передающих антенн

  • Количество приемных антенн

% Set carrier resource grid properties (15 kHz SCS and 10 MHz bandwidth)
carrier = nrCarrierConfig;
carrier.NCellID = 0;
carrier.SubcarrierSpacing = 15;
carrier.CyclicPrefix = "normal";
carrier.NSizeGrid = 52;
carrier.NStartGrid = 0;

% Set PUCCH format 3 properties
pucch = nrPUCCH3Config;
pucch.PRBSet = 0;
pucch.SymbolAllocation = [0 14];
pucch.Modulation = "QPSK";
pucch.FrequencyHopping = "intraSlot";
pucch.SecondHopStartPRB = (carrier.NSizeGrid-1) - (numel(pucch.PRBSet)-1);
pucch.GroupHopping = "neither";
pucch.HoppingID = 0;
pucch.NID = [];
pucch.RNTI = 1;
pucch.AdditionalDMRS = 0;

% Set number of transmit and receive antennas
simParameters.NTxAnts = 1;
simParameters.NRxAnts = 2;

Конфигурирование UCI

Область NumUCIBits указывает количество случайных битов UCI, используемых для генерации полезной нагрузки UCI. Количество битов UCI должно находиться в диапазоне от 3 до 1706.

simParameters.NumUCIBits = 16; % Number of UCI bits

Конфигурация оценщика канала

Логическая переменная perfectChannelEstimator управляет оценкой канала и поведением синхронизации. При установке значения true, используется идеальная оценка канала и синхронизация. В противном случае используется практическая оценка канала и синхронизация на основе значений принятого PUCCH DM-RS.

perfectChannelEstimator = true;

Конфигурация модели канала распространения

Создайте модель канала TDL с конфигурацией «TDLC300-100 Low», указанной в приложении G, таблица G.2.1.1-4 TS 38.104.

% Set up TDL channel
channel = nrTDLChannel;
channel.DelayProfile = 'Custom';
channel.MaximumDopplerShift = 100; % in Hz
channel.MIMOCorrelation = 'low';
channel.TransmissionDirection = 'Uplink';
delay = [0 65e-9 70e-9 190e-9 195e-9 200e-9 240e-9 325e-9 520e-9 1045e-9 1510e-9 2595e-9];
gain = [-6.9 0 -7.7 -2.5 -2.4 -9.9 -8 -6.6 -7.1 -13 -14.2 -16];
channel.PathDelays = delay;
channel.AveragePathGains = gain;
channel.NumTransmitAntennas = simParameters.NTxAnts;
channel.NumReceiveAntennas = simParameters.NRxAnts;

Установите частоту дискретизации для модели канала, используя значение, возвращаемое из nrOFDMInfo функция.

waveformInfo = nrOFDMInfo(carrier);
channel.SampleRate = waveformInfo.SampleRate;

Вычислите максимальное количество отложенных отсчетов из тракта канала с наибольшей задержкой и задержкой реализации канального фильтра. Эта максимальная задержка требуется позже для очистки канального фильтра для получения принятого сигнала.

chInfo = info(channel);
maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate));
maxChDelay = maxChDelay + chInfo.ChannelFilterDelay;

Цикл обработки и результаты

Чтобы определить BLER UCI в каждой точке SNR, UCI, передаваемый по PUCCH, анализируется для каждого экземпляра передачи с использованием этих этапов.

  1. Создать сетку ресурсов: nrUCIEncode функция кодирует UCI. nrPUCCH функция модулирует кодированный UCI. К модулированным символам применяется предварительное кодирование, специфичное для реализации с множеством входов и множеством выходов (MIMO). Эти модулированные символы вместе с опорным сигналом отображаются в сетку ресурсов.

  2. Генерация формы сигнала: nrOFDMModulate Функция OFDM модулирует сформированную сетку для получения формы сигнала во временной области.

  3. Модель и применение шумного канала: Генерируемый сигнал пропускается через TDL замирающий канал, чтобы получить замирающий сигнал. Затем к затухающей форме сигнала добавляют аддитивный белый гауссов шум (AWGN). SNR для каждого уровня определяется для RE и приемной антенны.

  4. Выполнять синхронизацию и демодуляцию OFDM: Для идеальной синхронизации используются коэффициенты усиления тракта и фильтры тракта канала. Для практической синхронизации принятый сигнал коррелируется с PUCCH DM-RS. nrOFDMDemodulate затем OFDM-демодулирует синхронизированный сигнал.

  5. Выполнение оценки канала: Для идеальной оценки канала используются коэффициенты усиления тракта, фильтры тракта и время выборки снимков канала. Для практической оценки канала используется PUCCH DM-RS.

  6. Извлеките PUCCH и выполните выравнивание: nrExtractResources функция извлекает RE, соответствующие выделению PUCCH, из принятой сетки ресурсов OFDM и оцененной сетки каналов. nrEqualizeMMSE затем функция выравнивает принятые RE PUCCH.

  7. Декодирование PUCCH: Выравниваемые символы PUCCH вместе с оценкой шума демодулируются и дескремблируются для получения оценки принятого кодового слова.

  8. Декодирование UCI: Декодированное кодовое слово передается через nrUCIDecode и записывают количество экземпляров неправильного декодирования UCI.

% Specify array to store output(s) for all SNR points
blerUCI = zeros(length(simParameters.SNRIn),1);

% Assign temporary variables for parallel simulation
nTxAnts = simParameters.NTxAnts;
nRxAnts = simParameters.NRxAnts;
snrIn = simParameters.SNRIn;
nFrames = simParameters.NFrames;
ouci = simParameters.NumUCIBits;
nFFT = waveformInfo.Nfft;
symbolsPerSlot = carrier.SymbolsPerSlot;
slotsPerFrame = carrier.SlotsPerFrame;

% Validate number of frames
validateattributes(nFrames,{'double'},{'scalar','positive','integer'},'','simParameters.NFrames')

% Validate SNR range
validateattributes(snrIn,{'double'},{'real','vector','finite'},'','simParameters.SNRIn')

% Validate PUCCH configuration
classPUCCH = validatestring(class(pucch),{'nrPUCCH2Config','nrPUCCH3Config','nrPUCCH4Config'},'','class of PUCCH');
formatPUCCH = classPUCCH(8);

% The temporary variables carrier_init and pucch_init are used to
% create the temporary variables carrier and pucch in the SNR loop
% to create independent instances in case of parallel simulation.
carrier_init = carrier;
pucch_init = pucch;

for snrIdx = 1:numel(snrIn) % Comment out for parallel computing
% parfor snrIdx = 1:numel(snrIn) % Uncomment for parallel computing
    % To reduce the total simulation time, you can execute this loop in
    % parallel by using Parallel Computing Toolbox features. Comment out the
    % for-loop statement and uncomment the parfor-loop statement. If
    % Parallel Computing Toolbox is not installed, parfor-loop defaults to
    % a for-loop statement. Because the parfor-loop iterations are executed
    % in parallel in a nondeterministic order, the simulation information
    % displayed for each SNR point can be intertwined. To switch off the
    % simulation information display, set the displaySimulationInformation
    % variable (defined earlier in this example) to false.

    % Reset the random number generator and channel so that each SNR point
    % experiences the same noise and channel realizations.
    rng('default')
    reset(channel)

    % Initialize variables for this SNR point (required when using
    % Parallel Computing Toolbox)
    carrier = carrier_init;
    pucch = pucch_init;
    pathFilters = [];

    % Get operating SNR value
    SNRdB = snrIn(snrIdx);

    % Get total number of slots in the simulation period
    NSlots = nFrames*slotsPerFrame;

    % Set timing offset, which is updated in every slot for perfect
    % synchronization and when correlation is strong for practical
    % synchronization
    offset = 0;

    % Set variable to store block errors for each SNR point with 0
    ucierr = 0;
    for nslot = 0:NSlots-1

        % Update carrier slot number to account for new slot transmission
        carrier.NSlot = nslot;

        % Get PUCCH resources
        [pucchIndices,pucchIndicesInfo] = nrPUCCHIndices(carrier,pucch);
        dmrsIndices = nrPUCCHDMRSIndices(carrier,pucch);
        dmrsSymbols = nrPUCCHDMRS(carrier,pucch);

        % Create random UCI bits
        uci = randi([0 1],ouci,1);

        % Perform UCI encoding
        codedUCI = nrUCIEncode(uci,pucchIndicesInfo.G);

        % Perform PUCCH modulation
        pucchSymbols = nrPUCCH(carrier,pucch,codedUCI);

        % Create resource grid associated with PUCCH transmission antennas
        pucchGrid = nrResourceGrid(carrier,nTxAnts);

        % Perform implementation-specific PUCCH MIMO precoding and mapping
        F = eye(1,nTxAnts);
        [~,pucchAntIndices] = nrExtractResources(pucchIndices,pucchGrid);
        pucchGrid(pucchAntIndices) = pucchSymbols*F;

        % Perform implementation-specific PUCCH DM-RS MIMO precoding and mapping
        [~,dmrsAntIndices] = nrExtractResources(dmrsIndices,pucchGrid);
        pucchGrid(dmrsAntIndices) = dmrsSymbols*F;

        % Perform OFDM modulation
        txWaveform = nrOFDMModulate(carrier,pucchGrid);

        % Pass data through the channel model. Append zeros at the end of
        % the transmitted waveform to flush the channel content. These
        % zeros take into account any delay introduced in the channel. This
        % delay is a combination of the multipath delay and implementation
        % delay. This value can change depending on the sampling rate,
        % delay profile, and delay spread.
        txWaveformChDelay = [txWaveform; zeros(maxChDelay,size(txWaveform,2))];
        [rxWaveform,pathGains,sampleTimes] = channel(txWaveformChDelay);

        % Add AWGN to the received time domain waveform. Normalize the
        % noise power by the size of the inverse fast Fourier transform
        % (IFFT) used in OFDM modulation, because the OFDM modulator
        % applies this normalization to the transmitted waveform. Also,
        % normalize the noise power by the number of receive antennas,
        % because the default behavior of the channel model is to apply
        % this normalization to the received waveform.
        SNR = 10^(SNRdB/20);
        N0 = 1/(sqrt(2.0*nRxAnts*nFFT)*SNR);
        noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));
        rxWaveform = rxWaveform + noise;

        % Perform synchronization
        if perfectChannelEstimator == 1
            % For perfect synchronization, use the information provided by
            % the channel to find the strongest multipath component.
            pathFilters = getPathFilters(channel);
            [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters);
        else
            % For practical synchronization, correlate the received
            % waveform with the PUCCH DM-RS to give timing offset estimate
            % t and correlation magnitude mag. The function hSkipWeakTimingOffset
            % is used to update the receiver timing offset. If the correlation
            % peak in mag is weak, the current timing estimate t is ignored
            % and the previous estimate offset is used.
            [t,mag] = nrTimingEstimate(carrier,rxWaveform,dmrsIndices,dmrsSymbols);
            offset = hSkipWeakTimingOffset(offset,t,mag);
        end
        rxWaveform = rxWaveform(1+offset:end,:);

        % Perform OFDM demodulation on the received data to recreate the
        % resource grid. Include zero padding in the event that practical
        % synchronization results in an incomplete slot being demodulated.
        rxGrid = nrOFDMDemodulate(carrier,rxWaveform);
        [K,L,R] = size(rxGrid);
        if (L < symbolsPerSlot)
            rxGrid = cat(2,rxGrid,zeros(K,symbolsPerSlot-L,R));
        end

        % Perform channel estimation
        if perfectChannelEstimator == 1
            % For perfect channel estimation, use the value of the path
            % gains provided by the channel.
            estChannelGrid = nrPerfectChannelEstimate(carrier,pathGains,pathFilters,offset,sampleTimes);

            % Get the perfect noise estimate (from the noise realization).
            noiseGrid = nrOFDMDemodulate(carrier,noise(1+offset:end,:));
            noiseEst = var(noiseGrid(:));

            % Apply MIMO deprecoding to estChannelGrid to give an
            % estimate per transmission layer.
            K = size(estChannelGrid,1);
            estChannelGrid = reshape(estChannelGrid,K*symbolsPerSlot*nRxAnts,nTxAnts);
            estChannelGrid = estChannelGrid*F.';
            estChannelGrid = reshape(estChannelGrid,K,symbolsPerSlot,nRxAnts,[]);
        else
            % For practical channel estimation, use PUCCH DM-RS.
            [estChannelGrid,noiseEst] = nrChannelEstimate(carrier,rxGrid,dmrsIndices,dmrsSymbols);
        end

        % Get PUCCH REs from received grid and estimated channel grid
        [pucchRx,pucchHest] = nrExtractResources(pucchIndices,rxGrid,estChannelGrid);

        % Perform equalization
        [pucchEq,csi] = nrEqualizeMMSE(pucchRx,pucchHest,noiseEst);

        % Decode PUCCH symbols
        [uciLLRs,rxSymbols] = hPUCCHDecode(carrier,pucch,pucchEq,noiseEst);

        % Decode UCI
        decucibits = nrUCIDecode(uciLLRs{1},ouci);

        % Store values to calculate BLER
        ucierr = ucierr + (~isequal(decucibits,uci));

    end

    % Calculate UCI BLER for each SNR point
    blerUCI(snrIdx) = ucierr/NSlots;

    % Display results dynamically
    if displaySimulationInformation == 1
        fprintf(['UCI BLER of PUCCH format ' formatPUCCH ' for ' num2str(nFrames) ' frame(s) at SNR ' num2str(snrIn(snrIdx)) ' dB: ' num2str(blerUCI(snrIdx)) '\n'])
    end
end
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -14 dB: 0.74
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -12 dB: 0.44
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -10 dB: 0.28
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -8 dB: 0.1
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -6 dB: 0.06
UCI BLER of PUCCH format 3 for 5 frame(s) at SNR -4 dB: 0.02
% Plot results
figure
semilogy(snrIn,blerUCI,'-*')
grid on
xlabel('SNR (dB)')
ylabel('Block Error Rate')
title(sprintf('PUCCH Format = %s / NSizeGrid = %d / SCS = %d kHz / %dx%d',...
    formatPUCCH,carrier_init.NSizeGrid,carrier_init.SubcarrierSpacing,nTxAnts,nRxAnts))

Figure contains an axes. The axes with title PUCCH Format = 3 / NSizeGrid = 52 / SCS = 15 kHz / 1x2 contains an object of type line.

На следующем рисунке показаны результаты BLER, полученные при моделировании 1500 кадров (NFrames = 1500, SNRIn = -15:3:3) для несущей с SCS 30 кГц, занимающей полосу пропускания 20 МГц. Настройка моделирования включает в себя конфигурацию формата 3 PUCCH по умолчанию, размещенную в примере, с количеством битов UCI, установленным на 16, и perfectChannelEstimator переменная имеет значение false.

Дальнейшие исследования

  • Для анализа UCI BLER в каждой точке SNR переключите значение perfectChannelEstimator и изменить диапазон значений SNR.

  • Для проверки производительности BLER различных сценариев измените нумерологию несущих, количество передающих и приемных антенн и модель канала.

  • Для наблюдения за производительностью BLER форматов PUCCH 2 и 4 используйте nrPUCCH2Config объект и nrPUCCH4Config объект, соответственно, для pucch переменная в разделе «Несущая» и «Конфигурация PUCCH».

Резюме

Пример демонстрирует, как измерять BLER UCI, когда UCI передается в формате 3 PUCCH. В примере также отображается и отображается BLER как функция SNR.

Приложение

В примере используется этот вспомогательный файл.

Ссылки

  1. 3GPP ТС 38.211. "НР; Физические каналы и модуляция (выпуск 15). "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.

  2. 3GPP TS 38.212. "НР; мультиплексирование и канальное кодирование (выпуск 15). "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.

  3. 3GPP ТС 38.104. "НР; радиопередача и прием базовой станции (BS) (выпуск 15). "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.

Локальные функции

В этом примере эти локальные функции используются для поддержки декодирования PUCCH форматов 2, 3 и 4.

function [cw,symbols] = hPUCCHDecode(carrier,pucch,sym,nVar)
%hPUCCHDecode Perform PUCCH decoding for formats 2, 3, and 4

    % Perform transform deprecoding for PUCCH formats 3 and 4
    tfdpcde = sym;
    modulation = 'QPSK';
    if ~isa(pucch,'nrPUCCH2Config')
        mRB = unique(numel(pucch.PRBSet(:)));
        tfdpcde = nrTransformDeprecode(sym,mRB);
        modulation = pucch.Modulation;
    end

    % Perform block-wise despreading for PUCCH format 4
    symbols = tfdpcde;
    if isa(pucch,'nrPUCCH4Config')
        mSC = mRB*12;
        tfdpcde = reshape(tfdpcde,mSC,[]);
        sf = double(pucch.SpreadingFactor);
        wn = getOrthogonalSeqFormat4(sf,pucch.OCCI);
        % Multiply tfdpcde with conjugate of wn
        temp = tfdpcde.*conj(wn);
        symbols = zeros(mSC/sf,size(temp,2),'like',temp);
        for i = 1:(mSC/sf)
            % Average all symbols representing same modulation symbol
            symbols(i,:) = mean(temp(i:mSC/sf:mSC,:));
        end
    end

    % Perform symbol demodulation
    symdemod = nrSymbolDemodulate(symbols(:),modulation,nVar);

    % Perform descrambling
    opts = struct;
    opts.MappingType = 'signed';
    opts.OutputDataType = class(sym);
    if isempty(pucch.NID)
        % Update scrambling identity with cell identity when scrambling
        % identity is empty
        pucch.NID = carrier.NCellID;
    end
    c = nrPUCCHPRBS(pucch.NID,pucch.RNTI,length(symdemod),opts);
    cw = {symdemod.*c};

end

function wn = getOrthogonalSeqFormat4(sf,occi)
% WN = getOrthogonalSeqFormat4(SF,OCCI) returns the orthogonal cover code
% sequence WN as per TS 38.211 Section 6.3.2.6.3.
% SF   - Spreading factor for PUCCH format 4, specified as 2 or 4.
% OCCI - Orthogonal cover code sequence index, specified as a value greater
%        than or equal to 0 and less than SF.

    if sf == 2
        % TS 38.211 Table 6.3.2.6.3-1
        w = [1 1 1 1 1 1  1  1  1  1  1  1;  % occi equals 0
             1 1 1 1 1 1 -1 -1 -1 -1 -1 -1]; % occi equals 1
    else
        % TS 38.211 Table 6.3.2.6.3-2
        w = [1 1 1   1   1   1  1  1  1   1   1   1;  % occi equals 0
             1 1 1 -1j -1j -1j -1 -1 -1  1j  1j  1j;  % occi equals 1
             1 1 1  -1  -1  -1  1  1  1  -1  -1  -1;  % occi equals 2
             1 1 1  1j  1j  1j -1 -1 -1 -1j -1j -1j]; % occi equals 3
    end
    % Extract orthogonal cover code sequence based on index occi
    wn = w(occi+1,:).';

end

См. также

Функции

Объекты