Частота появления ошибочных блоков NR PUCCH

В этом примере показано, как измериться, частота появления ошибочных блоков (BLER) восходящей управляющей информации (UCI) передала на физическом восходящем канале управления (PUCCH) в 5G ссылку NR, использующую функции 5G Toolbox™.

Введение

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

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

BLERUCI=#(falseUCI)#(UCI)

  • #(falseUCI) количество экземпляров, когда передано, UCI неправильно декодируется.

  • #(UCI) количество экземпляров, когда UCI передается.

Они 5G функции NR моделируются в этом примере.

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

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

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

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

Другие функции симуляции в этом примере:

  • Совершенная или практическая синхронизация и оценка канала

  • Эквализация

Чтобы уменьшать общее время симуляции, можно использовать функции Parallel Computing Toolbox™, чтобы выполнить сигнал к шумовому отношению (ОСШ) точки цикла ОСШ параллельно.

Продолжительность симуляции и точки ОСШ

Установите продолжительность симуляции в терминах количества систем координат на 10 мс. Большое количество для NFrames должен использоваться, чтобы привести к значимым результатам пропускной способности. Установите точки ОСШ симулировать. ОСШ задан на элемент ресурса (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 в каждой точке ОСШ.

displaySimulationInformation = true;

Поставщик услуг и настройка PUCCH

Установите поставщика услуг с этими свойствами:

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

  • Разрядка поднесущей (SCS) в kHz

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

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

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

Установите настройку формата 3 PUCCH с этими свойствами:

  • Выделенный набор RBS

  • Выделение символа ([S L])

  • Схема Modulation

  • Настройка скачкообразного движения частоты

  • Второй транзитный участок, начинающий 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 до 1 706.

simParameters.NumUCIBits = 16; % Number of UCI bits

Настройка средства оценки канала

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

perfectChannelEstimator = true;

Настройка модели канала распространения

Создайте модель канала TDL с настройкой 'TDLC300-100 Низко', заданный в Приложении 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 в каждой точке ОСШ, UCI, переданный на PUCCH, анализируется на экземпляр передачи с помощью этих шагов.

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

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

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

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

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

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

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

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

  • Чтобы анализировать BLER UCI в каждой точке ОСШ, переключите значение perfectChannelEstimator переменная и изменение область значений значений ОСШ.

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

  • Чтобы наблюдать эффективность BLER форматов 2 и 4 PUCCH, используйте nrPUCCH2Config возразите и nrPUCCH4Config объект, соответственно, для pucch переменная в разделе Carrier и PUCCH Configuration.

Сводные данные

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

Приложение

Пример использует этот файл помощника.

Ссылки

  1. 3GPP TS 38.211. "NR; Физические каналы и модуляция (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

  2. 3GPP TS 38.212. "NR; Мультиплексирование и кодирование канала (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

  3. 3GPP TS 38.104. “NR; передача радио Базовой станции (BS) и прием (Релиз 15)”. Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

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

Этот пример использует эти локальные функции, чтобы поддержать декодирование 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

Смотрите также

Функции

Объекты

Для просмотра документации необходимо авторизоваться на сайте