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

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

Введение

Этот пример измеряет пропускную способность 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, генерация были не использованы.

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

Чтобы уменьшать общее время симуляции, можно использовать 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)

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

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

perfectChannelEstimator = true;

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
% PDSCH resource block mapping (TS 38.211 Section 7.3.1.6)
simParameters.PDSCH.VRBToPRBInterleaving = 0;   % Disable interleaved resource mapping

% 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].

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

if strcmpi(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(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. Для совершенной синхронизации импульсная характеристика канала восстанавливается и используется, чтобы синхронизировать полученную форму волны. Для практической синхронизации полученная форма волны коррелируется с PDSCH DM-RS. Синхронизируемым сигналом является затем демодулируемый OFDM.

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

  • Предварительное кодирование матричного вычисления. Матрица 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(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 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

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

% Create DLSCH 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
decodeDLSCH = nrDLSCHDecoder;
decodeDLSCH.MultipleHARQProcesses = true;
decodeDLSCH.TargetCodeRate = pdsch.TargetCodeRate;
decodeDLSCH.LDPCDecodingAlgorithm = 'Layered belief propagation';
decodeDLSCH.MaximumLDPCIterationCount = 6;

% The temporary variables 'gnb_init', 'pdsch_init', 'ssburst_init' and
% 'decodeDLSCH_init' are used to create the temporary variables 'gnb',
% 'pdsch', 'ssburst' and 'decodeDLSCH' within the SNR loop to create
% independent instances in case of parallel simulation
gnb_init = gnb;
pdsch_init = pdsch;
ssburst_init = ssburst;
decodeDLSCH_init = clone(decodeDLSCH);

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

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

    % Initialize variables for this SNR point, required for initialization
    % of variables when using the Parallel Computing Toolbox
    gnb = gnb_init;
    pdsch = pdsch_init;
    ssburst = ssburst_init;
    decodeDLSCH = clone(decodeDLSCH_init);
    pathFilters = [];
    ssbWaveform = [];

    SNRdB = 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, ...
        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

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

    % 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
    waveformInfo = hOFDMInfo(gnb);
    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);

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

    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;

        if (perfectChannelEstimator)
            % 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);
        else
            % Practical synchronization. Correlate the received waveform
            % with the PDSCH 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(rxWaveform,gnb.NRB,gnb.SubcarrierSpacing,pdsch.NSlot,dmrsIndices,dmrsSymbols,'CyclicPrefix',gnb.CyclicPrefix); %#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 = hOFDMDemodulate(gnb, rxWaveform);
        [K,L,R] = size(rxGrid);
        if (L < waveformInfo.SymbolsPerSlot)
            rxGrid = cat(2,rxGrid,zeros(K,waveformInfo.SymbolsPerSlot-L,R));
        end

        if (perfectChannelEstimator)
            % Perfect channel estimation, using the value of the path gains
            % provided by the channel. This channel estimate does not
            % include the effect of transmitter precoding
            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 estChannelGrid
            estChannelGrid = precodeChannelEstimate(estChannelGrid,wtx.');
        else
            % Practical channel estimation between the received grid and
            % each transmission layer, using the PDSCH DM-RS for each
            % layer. This channel estimate includes the effect of
            % transmitter precoding
            [estChannelGrid,noiseEst] = nrChannelEstimate(rxGrid,dmrsIndices,dmrsSymbols,'CyclicPrefix',gnb.CyclicPrefix,'CDMLengths',pdschIndicesInfo.CDMLengths); %#ok<UNRCH>

            % Remove precoding from estChannelGrid prior to precoding
            % matrix calculation
            estChannelGridPorts = precodeChannelEstimate(estChannelGrid,conj(wtx));

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

        % 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) failed. 
(45.00%) HARQ Proc 2: CW0:Retransmission #1 (RV=2) failed. 
(47.50%) HARQ Proc 3: CW0:Retransmission #1 (RV=2) failed. 
(50.00%) HARQ Proc 4: CW0:Retransmission #1 (RV=2) failed. 
(52.50%) HARQ Proc 5: CW0:Retransmission #1 (RV=2) failed. 
(55.00%) HARQ Proc 6: CW0:Retransmission #1 (RV=2) failed. 
(57.50%) HARQ Proc 7: CW0:Retransmission #1 (RV=2) failed. 
(60.00%) HARQ Proc 8: CW0:Retransmission #1 (RV=2) failed. 
(62.50%) HARQ Proc 9: CW0:Retransmission #1 (RV=2) failed. 
(65.00%) HARQ Proc 10: CW0:Retransmission #1 (RV=2) failed. 
(67.50%) HARQ Proc 11: CW0:Retransmission #1 (RV=2) failed. 
(70.00%) HARQ Proc 12: CW0:Retransmission #1 (RV=2) failed. 
(72.50%) HARQ Proc 13: CW0:Retransmission #1 (RV=2) failed. 
(75.00%) HARQ Proc 14: CW0:Retransmission #1 (RV=2) failed. 
(77.50%) HARQ Proc 15: CW0:Retransmission #1 (RV=2) failed. 
(80.00%) HARQ Proc 16: CW0:Retransmission #1 (RV=2) failed. 
(82.50%) HARQ Proc 1: CW0:Retransmission #2 (RV=3) passed. 
(85.00%) HARQ Proc 2: CW0:Retransmission #2 (RV=3) passed. 
(87.50%) HARQ Proc 3: CW0:Retransmission #2 (RV=3) passed. 
(90.00%) HARQ Proc 4: CW0:Retransmission #2 (RV=3) passed. 
(92.50%) HARQ Proc 5: CW0:Retransmission #2 (RV=3) passed. 
(95.00%) HARQ Proc 6: CW0:Retransmission #2 (RV=3) passed. 
(97.50%) HARQ Proc 7: CW0:Retransmission #2 (RV=3) passed. 
(100.00%) HARQ Proc 8: CW0:Retransmission #2 (RV=3) passed. 

Throughput(Mbps) for 2 frame(s) = 12.0864
Throughput(%) for 2 frame(s) = 20.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) 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) passed. 
(22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. 
(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:Initial transmission (RV=0) failed. 
(62.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) failed. 
(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:Retransmission #1 (RV=2) passed. 

Throughput(Mbps) for 2 frame(s) = 25.6836
Throughput(%) for 2 frame(s) = 42.5000

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(snrIn,simThroughput*100./maxThroughput,'o-.')
xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on;
title(sprintf('(%dx%d) / NRB=%d / SCS=%dkHz',...
              nTxAnts,nRxAnts,gnb_init.NRB,gnb_init.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.

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

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).';
    wtx = wtx / sqrt(NLayers); % Normalise by NLayers

end

function estChannelGrid = precodeChannelEstimate(estChannelGrid,W)
% Apply precoding matrix W to the last dimension of the channel estimate

    % Linearize 4D matrix and reshape after multiplication
    K = size(estChannelGrid,1);
    L = size(estChannelGrid,2);
    R = size(estChannelGrid,3);
    estChannelGrid = reshape(estChannelGrid,K*L*R,[]);
    estChannelGrid = estChannelGrid * W;
    estChannelGrid = reshape(estChannelGrid,K,L,R,[]);

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

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

Объекты

Функции