exponenta event banner

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

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

Введение

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

UCI BLER определяется как вероятность неправильного декодирования 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) в кГц

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

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

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

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

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

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

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

  • Строение скачкообразного изменения частоты

  • Второй скачок запуска RB

  • Скачкообразные изменения строения

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

  • Дополнительное строение DM-RS

Установите эти дополнительные параметры всей симуляции:

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

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

% Set carrier resource grid properties (15 kHz SCS and 10 MHz bandwidth)
carrier = nrCarrierConfig;
carrier.NCellID = 0;
перевозчик. SubcarrierSpacing = 15;
перевозчик. CyclicPrefix = "normal";
перевозчик. NSizeGrid = 52;
перевозчик. NStartGrid = 0;

% Set PUCCH format 3 properties
pucch = nrPUCCH3Config;
pucch. PRBSet = 0;
pucch. SymbolAllocation = [0 14];
pucch. Модуляция = "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 в каждой точке ОСШ, UCI, переданный по PUCCH, анализируется по образцу передачи, используя эти шаги.

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

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

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

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

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

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

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

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

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

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

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

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

Приложение

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

Ссылки

  1. 3GPP TS 38.211. "NR; Физические каналы и модуляция (Release 15). Группа технических спецификаций Радиосеть доступ.

  2. 3GPP TS 38.212. "NR; Мультиплексирование и канальное кодирование (Release 15). Группа технических спецификаций Радиосеть доступ.

  3. 3GPP ТС 38.104. "NR; радиопередача и прием базовой станции (BS) (Release 15). Группа технических спецификаций Радиосеть доступ.

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

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

См. также

Функции

Объекты