Пропускная способность NR PUSCH

В этом примере показано, как измерить физический восходящий канал совместно использованный канал (PUSCH) пропускная способность ссылки Нового радио (NR) 5G, как задано 3GPP стандарт NR. Пример реализует PUSCH и восходящий транспортный канал (UL-SCH). Модель передатчика включает символы ссылки демодуляции PUSCH (DM-RS). Пример поддерживает и кластеризованную линию задержки (CDL) и каналы распространения коснувшейся линии задержки (TDL). Можно выполнить совершенную или практическую синхронизацию и оценку канала. Чтобы уменьшать общее время симуляции, можно выполнить точки ОСШ в цикле ОСШ параллельно при помощи Parallel Computing Toolbox™.

Введение

Этот пример измеряет пропускную способность PUSCH ссылки 5G, как задано 3GPP стандарт NR [1], [2], [3], [4].

Следующий 5G функции NR моделируется:

  • UL-SCH транспортируют кодирование канала

  • PUSCH и генерация PUSCH DM-RS

  • Переменный интервал поднесущей и нумерология системы координат (2^n * 15 кГц)

  • Нормальный и расширенный циклический префикс

  • TDL и модели канала распространения CDL

Другие функции симуляции:

  • Книга шифров и некнига шифров базирующиеся схемы передачи PUSCH

  • Дополнительные PUSCH преобразовывают предварительное кодирование

  • Мудрый паз и не паз мудрый PUSCH и отображение DM-RS

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

  • Операция HARQ с 16 процессами

Фигура ниже показов цепь обработки реализована. Для ясности была не использована генерация DM-RS.

Обратите внимание на то, что этот пример не включает адаптацию с обратной связью предварительного кодирования MIMO согласно условиям канала. Предварительное кодирование PUSCH MIMO, используемое в примере, следующие:

  • Для основанной на книге шифров передачи матрица MIMO перед кодированием, используемая в модуляции PUSCH, может быть выбрана с помощью параметра TPMI.

  • Специфичная для реализации матрица MIMO перед кодированием (для основанной на некниге шифров передачи или предварительного кодирования MIMO между портами антенны передачи и антеннами для основанной на книге шифров передачи) является единичной матрицей.

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

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

Установите продолжительность симуляции в терминах количества систем координат на 10 мс. Большое количество NFrames должно использоваться, чтобы привести к значимым результатам пропускной способности. Установите точки ОСШ симулировать. ОСШ задан на RE и применяется, каждый получает антенну.

simParameters = [];             % Clear simParameters variable
simParameters.NFrames = 2;      % Number of 10ms frames
simParameters.SNRIn = [-5 0 5]; % SNR range (dB)

Переменная displaySimulationInformation управляет отображением информации о симуляции, такой как ID процесса HARQ, используемый для каждого подкадра. В случае ошибки CRC также отображено значение индекса к последовательности RV.

displaySimulationInformation = true;

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

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

perfectChannelEstimator = true;

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

Установите основные параметры симуляции. Они включают:

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

  • Интервал поднесущей: 15, 30, 60, 120, 240 (kHz)

  • Длина циклического префикса: нормальный или расширенный

  • ID ячейки

  • Количество передачи и получает антенны

Подструктура, содержащая UL-SCH и параметры PUSCH, также задана. Это включает:

  • Целевой уровень кода

  • Выделенные блоки ресурса (PRBSet)

  • Схема Modulation: 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'

  • Количество слоев

  • Преобразуйте предварительное кодирование (позволяют/запрещают)

  • Схема передачи PUSCH и MIMO, предварительно кодирующий матричную индикацию (TPMI)

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

  • PUSCH, сопоставляющий тип

  • Параметры конфигурации DM-RS

Другая симуляция широкие параметры:

  • Модель канала распространения: 'TDL' или 'CDL'

Обратите внимание на то, что, если преобразовывают предварительное кодирование, включен, номер слоев должен быть определен к 1.

% Bandwidth, numerology (SCS and CP type) and other general parameters
simParameters.NRB = 52;                % Bandwidth in number of resource blocks (52RBs at 15kHz SCS for 10MHz BW)
simParameters.SubcarrierSpacing = 15;  % 15, 30, 60, 120, 240 (kHz)
simParameters.CyclicPrefix = 'Normal'; % 'Normal' or 'Extended'
simParameters.NCellID = 0;             % Cell identity
simParameters.NTxAnts = 1;             % Number of transmit antennas
simParameters.NRxAnts = 2;             % Number of receive antennas

% UL-SCH/PUSCH parameters
simParameters.PUSCH.TargetCodeRate = 193 / 1024;      % Code rate used to calculate transport block sizes
simParameters.PUSCH.PRBSet = (0:simParameters.NRB-1); % PUSCH PRB allocation
simParameters.PUSCH.SymbolSet = 0:13;            % PUSCH symbol allocation in each slot
simParameters.PUSCH.NohPRB = 0;                  % Additional RE overhead per PRB
simParameters.PUSCH.EnableHARQ = true;           % Enable/disable HARQ, if disabled, single transmission with RV=0, i.e. no retransmissions
simParameters.PUSCH.Modulation = 'QPSK';         % 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'
simParameters.PUSCH.NLayers = 1;                 % Number of PUSCH layers
simParameters.PUSCH.RNTI = 1;                    % Radio Network Temporary Identifier
simParameters.PUSCH.TransformPrecoding = false;  % Enable/disable transform precoding
simParameters.PUSCH.TxScheme = 'nonCodebook';    % Transmission scheme ('nonCodebook','codebook')
simParameters.PUSCH.NAntennaPorts = 1;           % Number of antenna ports for codebook based precoding
simParameters.PUSCH.TPMI = 0;                    % Precoding matrix indicator for codebook based precoding
% PUSCH DM-RS configuration
simParameters.PUSCH.PUSCHMappingType = 'A';      % PUSCH mapping type ('A'(slot-wise),'B'(non slot-wise))
simParameters.PUSCH.DMRSTypeAPosition = 2;       % Mapping type A only. First DM-RS symbol position (2,3)
simParameters.PUSCH.DMRSLength = 1;              % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol))
simParameters.PUSCH.DMRSAdditionalPosition = 1;  % Additional DM-RS symbol positions (max range 0...3)
simParameters.PUSCH.DMRSConfigurationType = 1;   % DM-RS configuration type (1,2)
simParameters.PUSCH.NumCDMGroupsWithoutData = 2; % CDM groups without data
simParameters.PUSCH.NIDNSCID = 0;                % Scrambling identity (0...65535)
simParameters.PUSCH.NSCID = 0;                   % Scrambling initialization (0,1)
simParameters.PUSCH.NRSID = 0;                   % Scrambling ID for low-PAPR sequences (0...1007)
simParameters.PUSCH.GroupHopping = 'Disable';    % Hopping type ('Enable','Disable')

% Define the propagation channel type
simParameters.ChannelType = 'TDL'; % 'CDL' or 'TDL'

Создайте объект carrier настройки поставщика услуг и конфигурационная структура PUSCH pusch.

carrier = nrCarrierConfig;
carrier.SubcarrierSpacing = simParameters.SubcarrierSpacing;
carrier.CyclicPrefix = simParameters.CyclicPrefix;
carrier.NSizeGrid = simParameters.NRB;
carrier.NCellID = simParameters.NCellID;
pusch = simParameters.PUSCH;

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

snrIn = simParameters.SNRIn;
nTxAnts = simParameters.NTxAnts;
nRxAnts = simParameters.NRxAnts;
channelType = simParameters.ChannelType;

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

Создайте объект модели канала. И CDL и модели канала TDL поддерживаются [5].

if strcmpi(channelType,'CDL')

    channel = nrCDLChannel;
    channel.DelayProfile = 'CDL-A';
    [txsize,rxsize] = hArrayGeometry(nTxAnts,nRxAnts,'uplink');
    channel.TransmitAntennaArray.Size = txsize;
    channel.ReceiveAntennaArray.Size = rxsize;

else

    channel = nrTDLChannel;
    channel.DelayProfile = 'TDL-A';
    channel.NumTransmitAntennas = nTxAnts;
    channel.NumReceiveAntennas = nRxAnts;

end

channel.DelaySpread = 30e-9; % in seconds
channel.MaximumDopplerShift = 10; % in Hz

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

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

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

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

Обработка цикла

Чтобы определить пропускную способность в каждой точке ОСШ, данные PUSCH анализируются на экземпляр передачи с помощью следующих шагов:

  • Обновите текущий процесс HARQ. Проверяйте CRC предыдущей передачи для данного процесса HARQ. Определите, требуется ли повторная передача. Если это не так сгенерируйте новые данные.

  • Сгенерируйте сетку ресурса. Кодирование канала выполняется nrULSCH. Это работает с входным транспортным обеспеченным блоком. Внутренне, это сохраняет копию транспортного блока в случае, если повторная передача требуется. Закодированные биты модулируются nrPUSCH. Специфичное для реализации предварительное кодирование MIMO применяется к получившемуся сигналу. Обратите внимание на то, что, если TxScheme='codebook', основанное на книге шифров предварительное кодирование MIMO будет уже применено в nrPUSCH и специфичное для реализации предварительное кодирование MIMO является дополнительным этапом предварительного кодирования MIMO.

  • Сгенерируйте форму волны. Сгенерированной сеткой является затем модулируемый OFDM.

  • Шумный канал модели. Форма волны передается через CDL или TDL, исчезающий канал. AWGN добавляется. ОСШ для каждого слоя задан на RE, и на получают антенну.

  • Выполните синхронизацию и демодуляцию OFDM. Для совершенной синхронизации импульсная характеристика канала восстанавливается и используется, чтобы синхронизировать полученную форму волны. Для практической синхронизации полученная форма волны коррелируется с PUSCH DM-RS. Синхронизируемым сигналом является затем демодулируемый OFDM.

  • Выполните оценку канала. Если совершенная оценка канала используется, импульсная характеристика канала восстановлена, и OFDM демодулируется, чтобы обеспечить оценку канала. Для практической оценки канала используется PUSCH DM-RS.

  • Извлеките PUSCH и выполните эквализацию. Элементы ресурса, соответствующие выделению PUSCH, извлечены из полученной сетки ресурса OFDM и оценки канала с помощью nrExtractResources. Полученными элементами ресурса PUSCH является затем MMSE, компенсируемый с помощью nrEqualizeMMSE.

  • Декодируйте PUSCH. Компенсируемые символы PUSCH, наряду с шумовой оценкой, демодулируются и дескремблированы nrPUSCHDecode получить оценку полученных кодовых комбинаций.

  • Декодируйте Восходящий Разделяемый Канал (UL-SCH) и сохраните ошибку блока CRC для процесса HARQ. Вектор декодируемых мягких битов передается nrULSCHDecoder который декодирует кодовую комбинацию и возвращается, ошибка блока CRC раньше определяла пропускную способность системы.

% Array to store the maximum throughput for all SNR points
maxThroughput = zeros(length(snrIn),1);
% Array to store the simulation throughput for all SNR points
simThroughput = zeros(length(snrIn),1);

% Set up Redundancy Version (RV) sequence, number of HARQ processes and
% the sequence in which the HARQ processes are used
if pusch.EnableHARQ
    % From PUSCH demodulation requirements in RAN WG4 meeting #88bis
    % (R4-1814062)
    rvSeq = [0 2 3 1];
else
    % HARQ disabled - single transmission with RV=0, no retransmissions
    rvSeq = 0;
end

% Create UL-SCH encoder System object
encodeULSCH = nrULSCH;
encodeULSCH.MultipleHARQProcesses = true;
encodeULSCH.TargetCodeRate = pusch.TargetCodeRate;

% Create UL-SCH decoder System object
% Use layered belief propagation for LDPC decoding, with half the number of
% iterations as compared to the default for belief propagation decoding
decodeULSCH = nrULSCHDecoder;
decodeULSCH.MultipleHARQProcesses = true;
decodeULSCH.TargetCodeRate = pusch.TargetCodeRate;
decodeULSCH.LDPCDecodingAlgorithm = 'Layered belief propagation';
decodeULSCH.MaximumLDPCIterationCount = 6;

% The temporary variables 'carrier_init', 'pusch_init' and
% 'decodeULSCH_init' are used to create the temporary variables 'carrier',
% 'pusch' and 'decodeULSCH' within the SNR loop to create independent
% instances in case of parallel simulation
carrier_init = carrier;
pusch_init = pusch;
decodeULSCH_init = clone(decodeULSCH);

% Get the values of 'NFrames' to avoid overhead in case of parallel
% simulation
NFrames = simParameters.NFrames;

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 the Parallel Computing Toolbox. Comment out the 'for'
% statement and uncomment the 'parfor' statement. If the Parallel Computing
% Toolbox is not installed, 'parfor' defaults to normal 'for' statement.
% Because 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 simulation information display,
% set the 'displaySimulationInformation' variable above to false

    % Reset the random number generator and channel, so that each SNR point
    % will experience the same noise and channel realizations
    rng('default');
    reset(channel);

    % Initialize variables for this SNR point, required for initialization
    % of variables when using the Parallel Computing Toolbox
    carrier = carrier_init;
    pusch = pusch_init;
    pathFilters = [];

    % Specify the order in which we cycle through the HARQ processes
    NHARQProcesses = 16;
    harqSequence = 1:NHARQProcesses;

    % Initialize the state of all HARQ processes and reset the UL-SCH
    % decoder
    harqProcesses = hNewHARQProcesses(NHARQProcesses,rvSeq,1);
    harqProcCntr = 0; % HARQ process counter
    decodeULSCH = clone(decodeULSCH_init);

    SNRdB = snrIn(snrIdx);
    fprintf('\nSimulating %s-based transmission scheme (%dx%d) and SCS=%dkHz with %s channel at %gdB SNR for %d 10ms frame(s)\n',pusch.TxScheme,nTxAnts,nRxAnts,carrier.SubcarrierSpacing,channelType,SNRdB,NFrames);

    % Total number of slots in the simulation period
    NSlots = NFrames * carrier.SlotsPerFrame;

    % Create 'ue' structure
    ue = struct();
    ue.NRB = carrier.NSizeGrid;
    ue.CyclicPrefix = carrier.CyclicPrefix;
    ue.SubcarrierSpacing = carrier.SubcarrierSpacing;
    ue.NCellID = carrier.NCellID;

    % Timing offset, updated in every slot for perfect synchronization and
    % when the correlation is strong for practical synchronization
    offset = 0;

    % Loop over the entire waveform length
    for nslot = 0:NSlots-1

        % Update the carrier and PUSCH slot numbers to account for a new
        % PUSCH transmission
        carrier.NSlot = nslot;
        pusch.NSlot = nslot;

        % Calculate the transport block size for this slot
        [puschIndices,dmrsIndices,dmrsSymbols,puschIndicesInfo] = hPUSCHResources(ue,pusch);
        MRB = numel(pusch.PRBSet);
        TBS = nrTBS(pusch.Modulation,pusch.NLayers,MRB,puschIndicesInfo.NREPerPRB,pusch.TargetCodeRate,pusch.NohPRB);

        % Get HARQ process index for the current PUSCH from the HARQ index
        % table
        harqProcIdx = harqSequence(mod(harqProcCntr,length(harqSequence))+1);

        % Update current HARQ process information (this updates the RV
        % depending on CRC pass or fail in the previous transmission for
        % this HARQ process)
        harqProcesses(harqProcIdx) = hUpdateHARQProcess(harqProcesses(harqProcIdx),1);

        % HARQ: check CRC from previous transmission, i.e. is a
        % retransmission required?
        NDI = false;
        if harqProcesses(harqProcIdx).blkerr % errored
            if (harqProcesses(harqProcIdx).RVIdx==1) % end of rvSeq
                resetSoftBuffer(decodeULSCH,harqProcIdx-1);
                NDI = true;
            end
        else % no error
            NDI = true;
        end
        if NDI
            trBlk = randi([0 1],TBS,1);
            setTransportBlock(encodeULSCH,trBlk,harqProcIdx-1);
        end

        % UL-SCH encoding
        codedTrBlock = encodeULSCH(pusch.Modulation,pusch.NLayers,puschIndicesInfo.G,harqProcesses(harqProcIdx).RV,harqProcIdx-1);

        % PUSCH modulation, including codebook based MIMO precoding if
        % TxScheme = 'codebook'
        puschSymbols = nrPUSCH(codedTrBlock,pusch.Modulation,pusch.NLayers,carrier.NCellID,pusch.RNTI,pusch.TransformPrecoding,MRB,pusch.TxScheme,pusch.NAntennaPorts,pusch.TPMI);

        % Create resource grid associated with PUSCH transmission period
        puschGrid = nrResourceGrid(carrier,nTxAnts);

        % Implementation-specific PUSCH MIMO precoding and mapping. This
        % MIMO precoding step is in addition to any codebook based
        % MIMO precoding done during PUSCH modulation above
        if (strcmpi(pusch.TxScheme,'codebook'))
            % codebook based MIMO precoding, F precodes between PUSCH
            % transmit antenna ports and transmit antennas
            F = eye(pusch.NAntennaPorts,nTxAnts);
        else
            % non-codebook based MIMO precoding, F precodes between PUSCH
            % layers and transmit antennas
            F = eye(pusch.NLayers,nTxAnts);
        end
        [~,puschAntIndices] = nrExtractResources(puschIndices,puschGrid);
        puschGrid(puschAntIndices) = puschSymbols * F;

        % Implementation-specific PUSCH DM-RS MIMO precoding and mapping.
        % The DM-RS creation in hPUSCHResources above includes codebook
        % based MIMO precoding if applicable
        for p = 1:size(dmrsSymbols,2)
            [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),puschGrid);
            puschGrid(dmrsAntIndices) = puschGrid(dmrsAntIndices) + dmrsSymbols(:,p) * F(p,:);
        end

        % OFDM modulation
        txWaveform = nrOFDMModulate(carrier,puschGrid);

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

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

        if (perfectChannelEstimator)
            % Perfect synchronization. Use information provided by the
            % channel to find the strongest multipath component
            pathFilters = getPathFilters(channel);
            [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters);
        else
            % Practical synchronization. Correlate the received waveform
            % with the PUSCH 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); %#ok<UNRCH>
            offset = hSkipWeakTimingOffset(offset,t,mag);
        end
        rxWaveform = rxWaveform(1+offset:end,:);

        % Perform OFDM demodulation on the received data to recreate the
        % resource grid, including 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 < carrier.SymbolsPerSlot)
            rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R));
        end

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

            % Get 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*carrier.SymbolsPerSlot*nRxAnts,nTxAnts);
            estChannelGrid = estChannelGrid * F.';
            if (strcmpi(pusch.TxScheme,'codebook'))
                W = nrPUSCHCodebook(pusch.NLayers,pusch.NAntennaPorts,pusch.TPMI,pusch.TransformPrecoding);
                estChannelGrid = estChannelGrid * W.';
            end
            estChannelGrid = reshape(estChannelGrid,K,carrier.SymbolsPerSlot,nRxAnts,[]);
        else
            % Practical channel estimation between the received grid and
            % each transmission layer, using the PUSCH DM-RS for each layer
            [~,dmrsLayerIndices,dmrsLayerSymbols] = hPUSCHResources(ue,setfield(pusch,'TxScheme','nonCodebook')); %#ok<UNRCH>
            [estChannelGrid,noiseEst] = nrChannelEstimate(carrier,rxGrid,dmrsLayerIndices,dmrsLayerSymbols,'CDMLengths',puschIndicesInfo.CDMLengths);
        end

        % Get PUSCH resource elements from the received grid
        [puschRx,puschHest] = nrExtractResources(puschIndices,rxGrid,estChannelGrid);

        % Equalization
        [puschEq,csi] = nrEqualizeMMSE(puschRx,puschHest,noiseEst);

        % Decode PUSCH physical channel
        [ulschLLRs,rxSymbols] = nrPUSCHDecode(puschEq,pusch.Modulation,carrier.NCellID,pusch.RNTI,noiseEst,pusch.TransformPrecoding,MRB);

        % Apply channel state information (CSI) produced by the equalizer,
        % including the effect of transform precoding if enabled
        if (pusch.TransformPrecoding)
            MSC = MRB * 12;
            csi = nrTransformDeprecode(csi,MRB) / sqrt(MSC);
            csi = repmat(csi((1:MSC:end).'),1,MSC).';
            csi = reshape(csi,size(rxSymbols));
        end
        csi = nrLayerDemap(csi);
        Qm = length(ulschLLRs) / length(rxSymbols);
        csi = reshape(repmat(csi{1}.',Qm,1),[],1);
        ulschLLRs = ulschLLRs .* csi;

        % Decode the UL-SCH transport channel
        decodeULSCH.TransportBlockLength = TBS;
        [decbits,harqProcesses(harqProcIdx).blkerr] = decodeULSCH(ulschLLRs,pusch.Modulation,pusch.NLayers,harqProcesses(harqProcIdx).RV,harqProcIdx-1);

        % Store values to calculate throughput
        simThroughput(snrIdx) = simThroughput(snrIdx) + (~harqProcesses(harqProcIdx).blkerr * TBS);
        maxThroughput(snrIdx) = maxThroughput(snrIdx) + TBS;

        % Display transport block error information
        if (displaySimulationInformation)
            fprintf('\n(%3.2f%%) HARQ Proc %d: ',100*(nslot+1)/NSlots,harqProcIdx);
            estrings = {'passed','failed'};
            rvi = harqProcesses(harqProcIdx).RVIdx;
            if rvi == 1
                ts = sprintf('Initial transmission (RV=%d)',rvSeq(rvi));
            else
                ts = sprintf('Retransmission #%d (RV=%d)',rvi-1,rvSeq(rvi));
            end
            fprintf('%s %s. ',ts,estrings{1+harqProcesses(harqProcIdx).blkerr});
        end

        % Update HARQ process counter
        harqProcCntr = harqProcCntr + 1;

    end

    % Display the results dynamically in the command window
    if (displaySimulationInformation)
        fprintf('\n');
    end
    fprintf([['\nThroughput(Mbps) for ' num2str(NFrames) ' frame(s) '],'= %.4f\n'], 1e-6*simThroughput(snrIdx)/(NFrames*10e-3));
    fprintf(['Throughput(%%) for ' num2str(NFrames) ' frame(s) = %.4f\n'],simThroughput(snrIdx)*100/maxThroughput(snrIdx));

end
Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at -5dB SNR for 2 10ms frame(s)

(5.00%) HARQ Proc 1: Initial transmission (RV=0) failed. 
(10.00%) HARQ Proc 2: Initial transmission (RV=0) failed. 
(15.00%) HARQ Proc 3: Initial transmission (RV=0) failed. 
(20.00%) HARQ Proc 4: Initial transmission (RV=0) failed. 
(25.00%) HARQ Proc 5: Initial transmission (RV=0) failed. 
(30.00%) HARQ Proc 6: Initial transmission (RV=0) failed. 
(35.00%) HARQ Proc 7: Initial transmission (RV=0) failed. 
(40.00%) HARQ Proc 8: Initial transmission (RV=0) failed. 
(45.00%) HARQ Proc 9: Initial transmission (RV=0) failed. 
(50.00%) HARQ Proc 10: Initial transmission (RV=0) failed. 
(55.00%) HARQ Proc 11: Initial transmission (RV=0) failed. 
(60.00%) HARQ Proc 12: Initial transmission (RV=0) failed. 
(65.00%) HARQ Proc 13: Initial transmission (RV=0) failed. 
(70.00%) HARQ Proc 14: Initial transmission (RV=0) failed. 
(75.00%) HARQ Proc 15: Initial transmission (RV=0) failed. 
(80.00%) HARQ Proc 16: Initial transmission (RV=0) failed. 
(85.00%) HARQ Proc 1: Retransmission #1 (RV=2) passed. 
(90.00%) HARQ Proc 2: Retransmission #1 (RV=2) passed. 
(95.00%) HARQ Proc 3: Retransmission #1 (RV=2) passed. 
(100.00%) HARQ Proc 4: Retransmission #1 (RV=2) passed. 

Throughput(Mbps) for 2 frame(s) = 0.5712
Throughput(%) for 2 frame(s) = 20.0000

Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at 0dB SNR for 2 10ms frame(s)

(5.00%) HARQ Proc 1: Initial transmission (RV=0) passed. 
(10.00%) HARQ Proc 2: Initial transmission (RV=0) passed. 
(15.00%) HARQ Proc 3: Initial transmission (RV=0) passed. 
(20.00%) HARQ Proc 4: Initial transmission (RV=0) passed. 
(25.00%) HARQ Proc 5: Initial transmission (RV=0) passed. 
(30.00%) HARQ Proc 6: Initial transmission (RV=0) passed. 
(35.00%) HARQ Proc 7: Initial transmission (RV=0) passed. 
(40.00%) HARQ Proc 8: Initial transmission (RV=0) passed. 
(45.00%) HARQ Proc 9: Initial transmission (RV=0) passed. 
(50.00%) HARQ Proc 10: Initial transmission (RV=0) passed. 
(55.00%) HARQ Proc 11: Initial transmission (RV=0) passed. 
(60.00%) HARQ Proc 12: Initial transmission (RV=0) passed. 
(65.00%) HARQ Proc 13: Initial transmission (RV=0) passed. 
(70.00%) HARQ Proc 14: Initial transmission (RV=0) passed. 
(75.00%) HARQ Proc 15: Initial transmission (RV=0) passed. 
(80.00%) HARQ Proc 16: Initial transmission (RV=0) passed. 
(85.00%) HARQ Proc 1: Initial transmission (RV=0) passed. 
(90.00%) HARQ Proc 2: Initial transmission (RV=0) passed. 
(95.00%) HARQ Proc 3: Initial transmission (RV=0) passed. 
(100.00%) HARQ Proc 4: Initial transmission (RV=0) passed. 

Throughput(Mbps) for 2 frame(s) = 2.8560
Throughput(%) for 2 frame(s) = 100.0000

Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at 5dB SNR for 2 10ms frame(s)

(5.00%) HARQ Proc 1: Initial transmission (RV=0) passed. 
(10.00%) HARQ Proc 2: Initial transmission (RV=0) passed. 
(15.00%) HARQ Proc 3: Initial transmission (RV=0) passed. 
(20.00%) HARQ Proc 4: Initial transmission (RV=0) passed. 
(25.00%) HARQ Proc 5: Initial transmission (RV=0) passed. 
(30.00%) HARQ Proc 6: Initial transmission (RV=0) passed. 
(35.00%) HARQ Proc 7: Initial transmission (RV=0) passed. 
(40.00%) HARQ Proc 8: Initial transmission (RV=0) passed. 
(45.00%) HARQ Proc 9: Initial transmission (RV=0) passed. 
(50.00%) HARQ Proc 10: Initial transmission (RV=0) passed. 
(55.00%) HARQ Proc 11: Initial transmission (RV=0) passed. 
(60.00%) HARQ Proc 12: Initial transmission (RV=0) passed. 
(65.00%) HARQ Proc 13: Initial transmission (RV=0) passed. 
(70.00%) HARQ Proc 14: Initial transmission (RV=0) passed. 
(75.00%) HARQ Proc 15: Initial transmission (RV=0) passed. 
(80.00%) HARQ Proc 16: Initial transmission (RV=0) passed. 
(85.00%) HARQ Proc 1: Initial transmission (RV=0) passed. 
(90.00%) HARQ Proc 2: Initial transmission (RV=0) passed. 
(95.00%) HARQ Proc 3: Initial transmission (RV=0) passed. 
(100.00%) HARQ Proc 4: Initial transmission (RV=0) passed. 

Throughput(Mbps) for 2 frame(s) = 2.8560
Throughput(%) for 2 frame(s) = 100.0000

Результаты

Отобразите измеренную пропускную способность. Это вычисляется как процент максимальной возможной пропускной способности ссылки, учитывая имеющиеся ресурсы для передачи данных.

figure;
plot(snrIn,simThroughput*100./maxThroughput,'o-.')
xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on;
if (pusch_init.TransformPrecoding)
    ofdmType = 'DFT-s-OFDM';
else
    ofdmType = 'CP-OFDM';
end
title(sprintf('%s / NRB=%d / SCS=%dkHz / %s %d/1024 / %dx%d', ...
    ofdmType,carrier_init.NSizeGrid,carrier_init.SubcarrierSpacing, ...
    pusch_init.Modulation, ...
    round(pusch_init.TargetCodeRate*1024),nTxAnts,nRxAnts));

simResults.simParameters = simParameters;
simResults.simThroughput = simThroughput;
simResults.maxThroughput = maxThroughput;

Фигура ниже результатов пропускной способности показов, полученных, симулируя 10 000 подкадров (NFrames = 1000, SNRIn = -16:2:6).

Приложение

Этот пример использует следующие функции помощника:

Выбранная библиография

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

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

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

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

  5. 3GPP TR 38.901. "Исследование модели канала для частот от 0,5 до 100 ГГц (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

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

Объекты

Функции