Частота ошибок блока 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

См. также

Функции

Объекты

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