exponenta event banner

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

Этот пример измеряет физический нисходящий канал совместно использованный канал (PDSCH) пропускная способность ссылки Нового радио (NR) 5G, как задано 3GPP стандарт NR. Это реализует транспорт и физические каналы (DL-SCH и PDSCH). Модель передатчика включает символы ссылки демодуляции PDSCH пакеты сигнала синхронизации (SS) и (DM-RS). Этот пример поддерживает кластеризованную строку задержки (CDL), и распространение коснувшейся строки задержки (TDL) образовывает канал и принимает совершенную синхронизацию и оценку канала.

Введение

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

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

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

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

  • SS разрывают генерацию (PSS/SSS/PBCH/PBCH DM-RS)

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

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

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

  • PDSCH, предварительно кодирующий использующий SVD

  • Модуляция CP-OFDM

  • Мудрый слот и не слот мудрый PDSCH и отображение DM-RS

  • SS разрывают генерацию (случаи A-E, растровое управление блоком SS/PBCH)

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

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

  • Пример использует одну часть пропускной способности через целого поставщика услуг

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

Этот пример поддерживает операцию с одной или двумя кодовыми комбинациями, зависящими от количества слоев, выбранных для передачи. Обратите внимание на то, что совершенная синхронизация и совершенное знание канала приняты, т.е. блок SS/PBCH и сигналы PDSCH DM-RS не используются в получателе. Одна матрица перед кодированием для целого выделения PDSCH определяется с помощью SVD путем усреднения оценки канала через все, выделил PDSCH PRBs. Поэтому для больших выделений PDSCH, т.е. занятия широкой пропускной способности, одна матрица перед кодированием не может быть хорошо соответствующей к каналу через все частоты, приводящие к ухудшению производительности. Нет никакого beamforming на блоках SS/PBCH в пакете SS.

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

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

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

gNodeB и Настройка PDSCH

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

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

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

  • Циклическая длина префикса: нормальный или расширенный

  • ID ячейки

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

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

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

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

  • Схема Modulation: 'QPSK', '16QAM', '64QAM', '256QAM'

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

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

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

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

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

  • SS разрывают параметры конфигурации. Обратите внимание на то, что SS разрываются, генерация может быть отключена путем установки поля SSBTransmitted на [0 0 0 0].

% Set waveform type and PDSCH numerology (SCS and CP type)
simParameters.NRB = 51;                  % Bandwidth in number of resource blocks (51RBs at 30kHz SCS for 20MHz BW)
simParameters.SubcarrierSpacing = 30;    % 15, 30, 60, 120, 240 (kHz)
simParameters.CyclicPrefix = 'Normal';   % 'Normal' or 'Extended'
simParameters.NCellID = 1;               % Cell identity

% DL-SCH/PDSCH parameters
simParameters.PDSCH.PRBSet = 0:simParameters.NRB-1; % PDSCH PRB allocation
simParameters.PDSCH.SymbolSet = 0:13;           % PDSCH symbol allocation in each slot
simParameters.PDSCH.EnableHARQ = true;          % Enable/disable HARQ, if disabled, single transmission with RV=0, i.e. no retransmissions

simParameters.PDSCH.NLayers = 2;                % Number of PDSCH layers
simParameters.NTxAnts = 8;                      % Number of PDSCH transmission antennas
if simParameters.PDSCH.NLayers > 4              % Multicodeword transmission
    simParameters.NumCW = 2;                        % Number of codewords
    simParameters.PDSCH.TargetCodeRate = [490 490]./1024; % Code rate used to calculate transport block sizes
    simParameters.PDSCH.Modulation = {'16QAM','16QAM'};   % 'QPSK', '16QAM', '64QAM', '256QAM'
    simParameters.NRxAnts = 8;                            % Number of UE receive antennas
else
    simParameters.NumCW = 1;                        % Number of codewords
    simParameters.PDSCH.TargetCodeRate = 490/1024;  % Code rate used to calculate transport block sizes
    simParameters.PDSCH.Modulation = '16QAM';       % 'QPSK', '16QAM', '64QAM', '256QAM'
    simParameters.NRxAnts = 2;                      % Number of UE receive antennas
end

% DM-RS and antenna port configuration (TS 38.211 section 7.4.1.1)
simParameters.PDSCH.PortSet = 0:simParameters.PDSCH.NLayers-1; % DM-RS ports to use for the layers
simParameters.PDSCH.PDSCHMappingType = 'A';     % PDSCH mapping type ('A'(slot-wise),'B'(non slot-wise))
simParameters.PDSCH.DMRSTypeAPosition = 2;      % Mapping type A only. First DM-RS symbol position (2,3)
simParameters.PDSCH.DMRSLength = 1;             % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol))
simParameters.PDSCH.DMRSAdditionalPosition = 0; % Additional DM-RS symbol positions (max range 0...3)
simParameters.PDSCH.DMRSConfigurationType = 2;  % DM-RS configuration type (1,2)
simParameters.PDSCH.NumCDMGroupsWithoutData = 0;% CDM groups without data
simParameters.PDSCH.NIDNSCID = 1;               % Scrambling identity (0...65535)
simParameters.PDSCH.NSCID = 0;                  % Scrambling initialization (0,1)
% Reserved PRB patterns (for CORESETs, forward compatibility etc)
simParameters.PDSCH.Reserved.Symbols = [];      % Reserved PDSCH symbols
simParameters.PDSCH.Reserved.PRB = [];          % Reserved PDSCH PRBs
simParameters.PDSCH.Reserved.Period = [];       % Periodicity of reserved resources

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

% SS burst configuration
simParameters.SSBurst.BlockPattern = 'Case B';    % 30kHz subcarrier spacing
simParameters.SSBurst.SSBTransmitted = [0 1 0 1]; % Bitmap indicating blocks transmitted in the burst
simParameters.SSBurst.SSBPeriodicity = 20;        % SS burst set periodicity in ms (5, 10, 20, 40, 80, 160)

validateNLayers(simParameters);

Создайте gNodeB конфигурационную структуру 'gnb' и конфигурационную структуру PDSCH 'pdsch'

gnb = simParameters;
pdsch = simParameters.PDSCH;

% Specify additional required fields for PDSCH
pdsch.RNTI = 1;

Xoh_PDSCH = 0;     % The Xoh-PDSCH overhead value is taken to be 0 here

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

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

nTxAnts = simParameters.NTxAnts;
nRxAnts = simParameters.NRxAnts;

if strcmpi(simParameters.ChannelType,'CDL')
    channel = nrCDLChannel; % CDL channel object

    % Use CDL-C model (Urban macrocell model)
    channel.DelayProfile = 'CDL-C';
    channel.DelaySpread = 300e-9;

    % Turn the overall number of antennas into a specific antenna panel
    % array geometry
    [channel.TransmitAntennaArray.Size, channel.ReceiveAntennaArray.Size] = ...
        hArrayGeometry(nTxAnts,nRxAnts);

elseif strcmpi(simParameters.ChannelType,'TDL')
    channel = nrTDLChannel; % TDL channel object
    % Set the channel geometry
    channel.DelayProfile = 'TDL-C';
    channel.DelaySpread = 300e-9;
    channel.NumTransmitAntennas = nTxAnts;
    channel.NumReceiveAntennas = nRxAnts;
else
    error('ChannelType parameter field must be either CDL or TDL.');
end

Уровень выборки для модели канала установлен с помощью значения, возвращенного от hOFDMInfo.

waveformInfo = hOFDMInfo(gnb);
channel.SampleRate = waveformInfo.SamplingRate;

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

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

Зарезервируйте Ресурсы PDSCH, Соответствующие пакету SS

Этот раздел показывает, как зарезервировать ресурсы для передачи пакета SS.

% Create SS burst information structure
ssburst = simParameters.SSBurst;
ssburst.NCellID = gnb.NCellID;
ssburst.SampleRate = waveformInfo.SamplingRate;

ssbInfo = hSSBurstInfo(ssburst);

% Map the occupied subcarriers and transmitted symbols of the SS burst
% (defined in the SS burst numerology) to PDSCH PRBs and symbols in the
% data numerology
[mappedPRB,mappedSymbols] = mapNumerology(ssbInfo.OccupiedSubcarriers,ssbInfo.OccupiedSymbols,ssbInfo.NRB,gnb.NRB,ssbInfo.SubcarrierSpacing,gnb.SubcarrierSpacing);

% Configure the PDSCH to reserve these resources so that the PDSCH
% transmission does not overlap the SS burst
reservation.Symbols = mappedSymbols;
reservation.PRB = mappedPRB;
reservation.Period = ssburst.SSBPeriodicity * (gnb.SubcarrierSpacing/15); % Period in slots
pdsch.Reserved(end+1) = reservation;

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

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

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

  • Генерация сетки ресурса. Кодирование канала выполняется nrDLSCH. Это работает с входным транспортным обеспеченным блоком. Внутренне, это сохраняет копию транспортного блока в случае, если повторная передача требуется. Закодированные биты модулируются на PDSCH nrPDSCH. Операция перед кодированием применяется к получившемуся сигналу.

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

  • Шумное моделирование канала. Форма волны передается через CDL или TDL, исчезающий канал. AWGN добавляется. ОСШ задан на RE в каждой антенне UE. Для ОСШ 0 дБ сигнал и шум способствуют одинаково энергии на PDSCH RE на, получают антенну [5].

  • Выполните синхронизацию и демодуляцию OFDM. Информация, возвращенная каналом, используется для совершенной синхронизации. Синхронизируемым сигналом является затем демодулируемый OFDM.

  • Выполните совершенную оценку канала. Совершенная оценка канала используется.

  • Предварительное кодирование матричного вычисления. Матрица W перед кодированием для следующей передачи вычисляется с помощью сингулярного разложения (SVD). Одна матрица получена для полного выделения путем усреднения условий канала. Поэтому для канала с селективностью частоты, W мог быть менее точным для большей выделенной пропускной способности.

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

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

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

% Set up Redundancy Version (RV) sequence, number of HARQ processes and
% the sequence in which the HARQ processes are used
if pdsch.EnableHARQ
    % In the final report of RAN WG1 meeting #91 (R1-1719301), it was
    % observed in R1-1717405 that if performance is the priority, [0 2 3 1]
    % should be used. If self-decodability is the priority, it should be
    % taken into account that the upper limit of the code rate at which
    % each RV is self-decodable is in the following order: 0>3>>2>1
    rvSeq = [0 2 3 1];
else
    % HARQ disabled - single transmission with RV=0, no retransmissions
    rvSeq = 0;
end
% Specify the order in which we cycle through the HARQ processes
NHARQProcesses = 16;
harqSequence = 1:NHARQProcesses;

% Create DLSCH encoder system object
encodeDLSCH = nrDLSCH;
encodeDLSCH.MultipleHARQProcesses = true;
encodeDLSCH.TargetCodeRate = pdsch.TargetCodeRate;

% Create DLSCH decoder system object
decodeDLSCH = nrDLSCHDecoder;
decodeDLSCH.MultipleHARQProcesses = true;
decodeDLSCH.TargetCodeRate = pdsch.TargetCodeRate;

for snrIdx = 1:numel(simParameters.SNRIn)

    % Set the random number generator settings to default values
    rng('default');
    reset(decodeDLSCH);

    SNRdB = simParameters.SNRIn(snrIdx);
    fprintf('\nSimulating transmission scheme 1 (%dx%d) and SCS=%dkHz with %s channel at %gdB SNR for %d 10ms frame(s)\n',...
        nTxAnts,nRxAnts,gnb.SubcarrierSpacing, ...
        simParameters.ChannelType,SNRdB,gnb.NFrames);

    % Initialize variables used in the simulation and analysis
    bitTput = [];           % Number of successfully received bits per transmission
    txedTrBlkSizes = [];    % Number of transmitted info bits per transmission

    % Initialize the state of all HARQ processes
    harqProcesses = hNewHARQProcesses(NHARQProcesses,rvSeq,gnb.NumCW);
    harqProcCntr = 0; % HARQ process counter

    % Reset the channel so that each SNR point will experience the same
    % channel realization
    reset(channel);

    % Total number of OFDM symbols in the simulation period
    NSymbols = gnb.NFrames * 10 * waveformInfo.SymbolsPerSubframe;

    % OFDM symbol number associated with start of each PDSCH transmission
    gnb.NSymbol = 0;

    % Running counter of the number of PDSCH transmission instances
    % The simulation will use this counter as the slot number for each
    % PDSCH
    pdsch.NSlot = 0;

    % Index to the start of the current set of SS burst samples to be
    % transmitted
    ssbSampleIndex = 1;

    % Obtain a precoding matrix (wtx) to be used in the transmission of the
    % first transport block
    estChannelGrid = getInitialChannelEstimate(gnb,nTxAnts,channel);
    newWtx = getPrecodingMatrix(pdsch.PRBSet,pdsch.NLayers,estChannelGrid);

    while gnb.NSymbol < NSymbols  % Move to next slot, gnb.NSymbol increased in steps of one slot

        % Generate a new SS burst when necessary
        if (ssbSampleIndex==1)
            nSubframe = gnb.NSymbol / waveformInfo.SymbolsPerSubframe;
            ssburst.NFrame = floor(nSubframe / 10);
            ssburst.NHalfFrame = mod(nSubframe / 5,2);
            [ssbWaveform,~,ssbInfo] = hSSBurst(ssburst);
        end

        % Get HARQ process index for the current PDSCH from 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),gnb.NumCW);

        % Calculate the transport block sizes for the codewords in the slot
        [pdschIndices,dmrsIndices,dmrsSymbols,pdschIndicesInfo] = hPDSCHResources(gnb,pdsch);
        trBlkSizes = hPDSCHTBS(pdsch,pdschIndicesInfo.NREPerPRB-Xoh_PDSCH);

        % HARQ: check CRC from previous transmission per codeword, i.e. is
        % a retransmission required?
        for cwIdx = 1:gnb.NumCW
            NDI = false;
            if harqProcesses(harqProcIdx).blkerr(cwIdx) % Errored
                if (harqProcesses(harqProcIdx).RVIdx(cwIdx)==1) % end of rvSeq
                    resetSoftBuffer(decodeDLSCH,cwIdx-1,harqProcIdx-1);
                    NDI = true;
                end
            else    % No error
                NDI = true;
            end
            if NDI
                trBlk = randi([0 1],trBlkSizes(cwIdx),1);
                setTransportBlock(encodeDLSCH,trBlk,cwIdx-1,harqProcIdx-1);
            end
        end

        % Encode the DL-SCH transport blocks
        codedTrBlock = encodeDLSCH(pdsch.Modulation,pdsch.NLayers,...
            pdschIndicesInfo.G,harqProcesses(harqProcIdx).RV,harqProcIdx-1);

        % Get wtx (precoding matrix) calculated in previous slot
        wtx = newWtx;

        % PDSCH modulation and precoding
        pdschSymbols = nrPDSCH(codedTrBlock,pdsch.Modulation,pdsch.NLayers,gnb.NCellID,pdsch.RNTI);
        pdschSymbols = pdschSymbols*wtx;

        % PDSCH mapping in grid associated with PDSCH transmission period
        pdschGrid = zeros(waveformInfo.NSubcarriers,waveformInfo.SymbolsPerSlot,nTxAnts);
        [~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid);
        pdschGrid(pdschAntIndices) = pdschSymbols;

        % PDSCH DM-RS precoding and mapping
        for p = 1:size(dmrsSymbols,2)
            [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),pdschGrid);
            pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols(:,p)*wtx(p,:);
        end

        % OFDM modulation of associated resource elements
        txWaveform = hOFDMModulate(gnb, pdschGrid);

        % Add the appropriate portion of SS burst waveform to the
        % transmitted waveform
        Nt = size(txWaveform,1);
        txWaveform = txWaveform + ssbWaveform(ssbSampleIndex + (0:Nt-1),:);
        ssbSampleIndex = mod(ssbSampleIndex + Nt,size(ssbWaveform,1));

        % 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))];
        [rxWaveform,pathGains,sampleTimes] = channel(txWaveform);

        % Add AWGN to the received time domain waveform
        % Normalize noise power to take account of sampling rate, which is
        % a function of the IFFT size used in OFDM modulation. The SNR
        % is defined per RE for each receive antenna (TS 38.101-4).
        SNR = 10^(SNRdB/20);    % Calculate linear noise gain
        N0 = 1/(sqrt(2.0*nRxAnts*double(waveformInfo.Nfft))*SNR);
        noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform)));
        rxWaveform = rxWaveform + noise;

        % Perfect synchronization. Use information provided by the channel
        % to find the strongest multipath component
        pathFilters = getPathFilters(channel); % get path filters for perfect channel estimation
        [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters);
        rxWaveform = rxWaveform(1+offset:end, :);

        % Perform OFDM demodulation on the received data to recreate the
        % resource grid
        rxGrid = hOFDMDemodulate(gnb, rxWaveform);

        % Perfect channel estimation, use the value of the path gains
        % provided by the channel
        estChannelGrid = nrPerfectChannelEstimate(pathGains,pathFilters,gnb.NRB,gnb.SubcarrierSpacing,pdsch.NSlot,offset,sampleTimes,gnb.CyclicPrefix);

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

        % Get precoding matrix for next slot
        newWtx = getPrecodingMatrix(pdsch.PRBSet,pdsch.NLayers,estChannelGrid);

        % Apply precoding to Hest
        % Linearize 4D matrix and reshape after multiplication
        K = size(estChannelGrid,1);
        estChannelGrid = reshape(estChannelGrid,K*waveformInfo.SymbolsPerSlot*nRxAnts,nTxAnts);
        estChannelGrid = estChannelGrid*wtx.';
        estChannelGrid = reshape(estChannelGrid,K,waveformInfo.SymbolsPerSlot,nRxAnts,pdsch.NLayers);

        % Get PDSCH resource elements from the received grid
        [pdschRx,pdschHest] = nrExtractResources(pdschIndices,rxGrid,estChannelGrid);

        % Equalization
        [pdschEq,csi] = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst);

        % Decode PDSCH physical channel
        [dlschLLRs,rxSymbols] = nrPDSCHDecode(pdschEq,pdsch.Modulation,gnb.NCellID,pdsch.RNTI,noiseEst);

        % Scale LLRs by CSI
        csi = nrLayerDemap(csi); % CSI layer demapping
        for cwIdx = 1:gnb.NumCW
            Qm = length(dlschLLRs{cwIdx})/length(rxSymbols{cwIdx}); % bits per symbol
            csi{cwIdx} = repmat(csi{cwIdx}.',Qm,1);   % expand by each bit per symbol
            dlschLLRs{cwIdx} = dlschLLRs{cwIdx} .* csi{cwIdx}(:);   % scale
        end

        % Decode the DL-SCH transport channel
        decodeDLSCH.TransportBlockLength = trBlkSizes;
        [decbits,harqProcesses(harqProcIdx).blkerr] = decodeDLSCH(dlschLLRs,pdsch.Modulation,pdsch.NLayers,harqProcesses(harqProcIdx).RV,harqProcIdx-1);

        % Store values to calculate throughput (only for active PDSCH instances)
        if(any(trBlkSizes) ~= 0)
            bitTput = [bitTput trBlkSizes.*(1-harqProcesses(harqProcIdx).blkerr)];
            txedTrBlkSizes = [txedTrBlkSizes trBlkSizes];
        end

        % Update starting symbol number of next PDSCH transmission
        gnb.NSymbol = gnb.NSymbol + size(pdschGrid,2);
        % Update count of overall number of PDSCH transmissions
        pdsch.NSlot = pdsch.NSlot + 1;
        % Update HARQ process counter
        harqProcCntr = harqProcCntr + 1;

        % Display transport block error information per codeword managed by current HARQ process
        fprintf('\n(%3.2f%%) HARQ Proc %d: ',100*gnb.NSymbol/NSymbols,harqProcIdx);
        estrings = {'passed','failed'};
        rvi = harqProcesses(harqProcIdx).RVIdx;
        for cw=1:length(rvi)
            cwrvi = rvi(cw);
            % Create a report on the RV state given position in RV sequence and decoding error
            if cwrvi == 1
                ts = sprintf('Initial transmission (RV=%d)',rvSeq(cwrvi));
            else
                ts = sprintf('Retransmission #%d (RV=%d)',cwrvi-1,rvSeq(cwrvi));
            end
            fprintf('CW%d:%s %s. ',cw-1,ts,estrings{1+harqProcesses(harqProcIdx).blkerr(cw)});
        end

     end

    % Calculate maximum and simulated throughput
    maxThroughput(snrIdx) = sum(txedTrBlkSizes); % Max possible throughput
    simThroughput(snrIdx) = sum(bitTput,2);      % Simulated throughput

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

end
Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at -5dB SNR for 2 10ms frame(s)

(2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) failed. 
(5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) failed. 
(7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) failed. 
(10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) failed. 
(12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) failed. 
(15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) failed. 
(17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) failed. 
(20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) failed. 
(22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) failed. 
(25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) failed. 
(27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) failed. 
(30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) failed. 
(32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) failed. 
(35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) failed. 
(37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) failed. 
(40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) failed. 
(42.50%) HARQ Proc 1: CW0:Retransmission #1 (RV=2) passed. 
(45.00%) HARQ Proc 2: CW0:Retransmission #1 (RV=2) passed. 
(47.50%) HARQ Proc 3: CW0:Retransmission #1 (RV=2) passed. 
(50.00%) HARQ Proc 4: CW0:Retransmission #1 (RV=2) passed. 
(52.50%) HARQ Proc 5: CW0:Retransmission #1 (RV=2) passed. 
(55.00%) HARQ Proc 6: CW0:Retransmission #1 (RV=2) passed. 
(57.50%) HARQ Proc 7: CW0:Retransmission #1 (RV=2) passed. 
(60.00%) HARQ Proc 8: CW0:Retransmission #1 (RV=2) passed. 
(62.50%) HARQ Proc 9: CW0:Retransmission #1 (RV=2) passed. 
(65.00%) HARQ Proc 10: CW0:Retransmission #1 (RV=2) passed. 
(67.50%) HARQ Proc 11: CW0:Retransmission #1 (RV=2) passed. 
(70.00%) HARQ Proc 12: CW0:Retransmission #1 (RV=2) passed. 
(72.50%) HARQ Proc 13: CW0:Retransmission #1 (RV=2) passed. 
(75.00%) HARQ Proc 14: CW0:Retransmission #1 (RV=2) passed. 
(77.50%) HARQ Proc 15: CW0:Retransmission #1 (RV=2) passed. 
(80.00%) HARQ Proc 16: CW0:Retransmission #1 (RV=2) passed. 
(82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) failed. 
(85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) failed. 
(87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) failed. 
(90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) failed. 
(92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) failed. 
(95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) failed. 
(97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) failed. 
(100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) failed. 

Throughput(Mbps) for 2 frame(s) = 24.1728
Throughput(%) for 2 frame(s) = 40.0000

Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at 0dB SNR for 2 10ms frame(s)

(2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 
(22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. 
(25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. 
(27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. 
(30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. 
(32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. 
(35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. 
(37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. 
(40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. 
(42.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(45.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(47.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(50.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(52.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(55.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(57.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(60.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 
(62.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. 
(65.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. 
(67.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. 
(70.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. 
(72.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. 
(75.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. 
(77.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. 
(80.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. 
(82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 

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

Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at 5dB SNR for 2 10ms frame(s)

(2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 
(22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. 
(25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. 
(27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. 
(30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. 
(32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. 
(35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. 
(37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. 
(40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. 
(42.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(45.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(47.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(50.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(52.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(55.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(57.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(60.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 
(62.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. 
(65.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. 
(67.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. 
(70.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. 
(72.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. 
(75.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. 
(77.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. 
(80.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. 
(82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. 
(85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. 
(87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. 
(90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. 
(92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. 
(95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. 
(97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. 
(100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. 

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

Результаты

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

figure;
plot(simParameters.SNRIn,simThroughput*100./maxThroughput,'o-.')
xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on;
title(sprintf('(%dx%d) / NRB=%d / SCS=%dkHz',...
              nTxAnts,nRxAnts,gnb.NRB,gnb.SubcarrierSpacing));

% Bundle key parameters and results into a combined structure for recording
simResults.simParameters = simParameters;
simResults.simThroughput = simThroughput;

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

Приложение

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

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

  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. R1-166999. "Подробная настройка F-OFDM и W-OFDM для оценки LLS", 3GPP ЗАПУСТИЛ № 86 WG1, Spreadtrum Communications, август 2016.

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

  7. 3GPP TS 38.101-4. "NR; передача радио Оборудования пользователя (UE) и прием. Часть 4: Требования к производительности (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

Localfunctions

function validateNLayers(simParameters)
% Validate the number of layers
    if length(simParameters.PDSCH.PortSet)~= simParameters.PDSCH.NLayers
        error('The number of elements of PortSet (%d) must be the same as the number of layers (%d)',...
            length(simParameters.PDSCH.PortSet), simParameters.PDSCH.NLayers);
    end

    if simParameters.PDSCH.NLayers > min(simParameters.NTxAnts,simParameters.NRxAnts)
        error('The number of layers (%d) must satisfy NLayers <= min(NTxAnts,NRxAnts) = min(%d,%d) = (%d)',...
            simParameters.PDSCH.NLayers,simParameters.NTxAnts,simParameters.NRxAnts,min(simParameters.NTxAnts,simParameters.NRxAnts));
    end
end

function estChannelGrid = getInitialChannelEstimate(gnb,nTxAnts,channel)
% Obtain channel estimate before first transmission. This can be used to
% obtain a precoding matrix for the first slot.

    ofdmInfo = hOFDMInfo(gnb);

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

    % Temporary waveform (only needed for the sizes)
    tmpWaveform = zeros((ofdmInfo.SamplesPerSubframe/ofdmInfo.SlotsPerSubframe)+maxChDelay,nTxAnts);

    % Filter through channel
    [~,pathGains,sampleTimes] = channel(tmpWaveform);

    % Perfect timing synch
    pathFilters = getPathFilters(channel);
    offset = nrPerfectTimingEstimate(pathGains,pathFilters);

    nslot = gnb.NSymbol/ofdmInfo.SymbolsPerSlot;

    % Perfect channel estimate
    estChannelGrid = nrPerfectChannelEstimate(pathGains,pathFilters,gnb.NRB,gnb.SubcarrierSpacing,nslot,offset,sampleTimes);

end

function wtx = getPrecodingMatrix(PRBSet,NLayers,hestGrid)
% Calculate precoding matrix given an allocation and a channel estimate

    % Allocated subcarrier indices
    allocSc = (1:12)' + 12*PRBSet(:).';
    allocSc = allocSc(:);

    % Average channel estimate
    [~,~,R,P] = size(hestGrid);
    estAllocGrid = hestGrid(allocSc,:,:,:);
    Hest = permute(mean(reshape(estAllocGrid,[],R,P)),[2 3 1]);

    % SVD decomposition
    [~,~,V] = svd(Hest);
    wtx = V(:,1:NLayers).';

end

function [mappedPRB,mappedSymbols] = mapNumerology(subcarriers,symbols,nrbs,nrbt,fs,ft)
% Map the SSBurst numerology to PDSCH numerology. The outputs are:
%   - mappedPRB: 0-based PRB indices for carrier resource grid (arranged in a column)
%   - mappedSymbols: 0-based OFDM symbol indices in a slot for carrier resource grid (arranged in a row)
%     carrier resource grid is sized using gnb.NRB, gnb.CyclicPrefix, spanning 1 slot
% The input parameters are:
%   - subcarriers: 1-based row subscripts for SSB resource grid (arranged in a column)
%   - symbols: 1-based column subscripts for SSB resource grid (arranged in an N-by-4 matrix, 4 symbols for each transmitted burst in a row, N transmitted bursts)
%     SSB resource grid is sized using ssbInfo.NRB, normal CP, spanning 5 subframes
%   - nrbs: source (SSB) NRB
%   - nrbt: target (carrier) NRB
%   - fs: source (SSB) SCS
%   - ft: target (carrier) SCS

    mappedPRB = unique(fix((subcarriers-(nrbs*6) - 1)*fs/(ft*12) + nrbt/2),'stable');

    symbols = symbols.';
    symbols = symbols(:).' - 1;

    if (ft < fs)
        % If ft/fs < 1, reduction
        mappedSymbols = unique(fix(symbols*ft/fs),'stable');
    else
        % Else, repetition by ft/fs
        mappedSymbols = reshape((0:(ft/fs-1))' + symbols(:)'*ft/fs,1,[]);
    end

end

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

Системные объекты

Функции