Пропускная способность PDSCH для основанных на некниге шифров схем перед кодированием: порт 5 (TM7), порт 7 или 8 или порт 7-8 (TM8), порт 7-14 (TM9 и TM10)

Этот пример демонстрирует, как измерить Физический Нисходящий Разделяемый Канал (PDSCH) производительность пропускной способности с помощью LTE Toolbox™ в следующих основанных на некниге шифров режимах передачи (TM) перед кодированием:

  • TM7: основанное на некниге шифров предварительное кодирование для единственного слоя (Порт 5)

  • TM8: основанное на некниге шифров предварительное кодирование максимум для двух слоев (двойной слой Port 7-8 или один порт антенны, порт 7 или 8)

  • TM9 и TM10: основанное на некниге шифров предварительное кодирование максимум для восьми слоев Port 7-14 или одного порта антенны, порт 7 или 8

FDD и схемы дуплекса TDD поддерживаются. Пример также показывает, как параметрировать и настроить настройки для различных режимов передачи. Это также поддерживает использование Parallel Computing Toolbox™, чтобы уменьшать эффективное время симуляции.

Введение

Этот пример измеряет пропускную способность для многих точек ОСШ. Предоставленный код может действовать под многими режимами передачи: TM7, TM8, TM9 и TM10. FDD и схемы дуплекса TDD поддерживаются. Для получения информации о том, как к модели TM1, TM2, TM3, TM4 и TM6 проверяют следующий пример: Тест Соответствия Пропускной способности PDSCH для Одной Антенны (TM1), Разнообразие Передачи (TM2), Разомкнутый цикл (TM3) и Замкнутый цикл (TM4/6) Пространственное Мультиплексирование

Поскольку основанные на некниге шифров ТМ рассматриваются, предварительное кодирование (beamforming) матрица должно быть вычислено. Это достигается с помощью подхода сингулярного разложения (SVD). Совершенное знание канала принято.

Для каждого из рассмотренных вопросов ОСШ, работающих с подкадром основанием подкадра:

  • Предварительное кодирование (beamforming) матрица вычисляется от совершенной оценки канала.

  • Заполненная сетка ресурса сгенерирована, и OFDM модулируется, чтобы создать форму волны, чтобы передать.

  • Сгенерированная форма волны передается через шумный исчезающий канал.

  • Работа получателя (оценка канала, эквализация, демодуляция и декодирующий) выполняется.

  • Производительность пропускной способности PDSCH определяется с помощью результата блока CRC при выходе декодера канала.

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

Настройка симуляции

Пример выполняется в течение продолжительности симуляции NFrames = 2 системы координат для многих точек ОСШ. Большое количество NFrames должен использоваться, чтобы привести к значимым результатам пропускной способности. SNRIn может быть массив значений или скаляра. Некоторые ТМ и определенные схемы модуляции более устойчивы к шуму и нарушениям канала, чем другие, поэтому различные значения ОСШ, вероятно, придется использовать в различных наборах параметра.

NFrames = 2;        % Number of frames

SNRIn = [-4 1];     % SNR range in dB

Набор общих параметров для всех ТМ первоначально задан, они включают пропускную способность, желаемый уровень кода, схему модуляции и выделенный набор блоков ресурса. Определение номера RMC гарантирует, что планируются все нисходящие подкадры. Если RMC задан (например, 'R.0'), планирование подкадра как задано в TS 36.101 [1].

Переменная txMode выбирает TM через оператор switch. Для каждого TM заданы обязательные параметры. Этот пример не выполняет декодирование формата DCI, таким образом, DCIFormat поле не строго необходимо. Однако, поскольку формат DCI тесно соединяется с TM, он включен для полноты.

В целях этого примера TM9 и TM10 являются тем же самым, за исключением формата DCI, однако, они разделяются в операторе switch для полноты.

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

simulationParameters = []; % clear simulationParameters
simulationParameters.NDLRB = 50;
simulationParameters.PDSCH.TargetCodeRate = 0.5;
simulationParameters.PDSCH.Modulation = {'16QAM'};
simulationParameters.PDSCH.PRBSet = (0:9)';

txMode = 'TM8';     % TM7, TM8, TM9, TM10
DuplexMode = 'TDD'; % 'FDD', 'TDD'

switch txMode
    case 'TM7' % single layer (Port 5)
        simulationParameters.PDSCH.DCIFormat = 'Format1';
        simulationParameters.PDSCH.TxScheme = 'Port5';
        simulationParameters.PDSCH.NLayers = 1;
        ntxants = 4;
    case 'TM8' % up to two layers (dual layer Port 7-8, or single antenna
               % port, port 7 or 8)
        simulationParameters.PDSCH.DCIFormat = 'Format2B';
        simulationParameters.PDSCH.TxScheme = 'Port7-8'; %'Port7-8','Port8'
        simulationParameters.PDSCH.NLayers = 2;
        ntxants = 4;
        simulationParameters.PDSCH.NSCID = 0;
    case 'TM9' % up to eight layers (up to eight layers Port 7-14 or single
               % antenna port, port 7 or 8)
        simulationParameters.PDSCH.DCIFormat = 'Format2C';
        simulationParameters.PDSCH.TxScheme = 'Port7-14';
        simulationParameters.PDSCH.NLayers = 4;
        ntxants = 8;
        simulationParameters.CSIRefP = ntxants;
    case 'TM10' % up to eight layers (up to eight layers Port 7-14 or
                % single antenna port, port 7 or 8)
        simulationParameters.PDSCH.DCIFormat = 'Format2D';
        simulationParameters.PDSCH.TxScheme = 'Port7-14';
        simulationParameters.PDSCH.NLayers = 4;
        ntxants = 8;
        simulationParameters.CSIRefP = ntxants;
    otherwise
        error('Transmission mode should be one of TM7, TM8, TM9 or TM10.')
end

Размер предварительно кодирующего матричного W (beamforming матрица), NLayers - ntxants. Количество антенн передачи взято из W в последующих вызовах функции тулбокса. Количество получает антенны, задан позже как часть канала распространения.

% Initialize W to zero
simulationParameters.PDSCH.W = zeros(simulationParameters.PDSCH.NLayers, ntxants);

Установите режим дуплекса и задайте количество подкадров к 1. Код генерирует один подкадр за один раз неоднократно до в общей сложности NFrames сгенерированы.

simulationParameters.DuplexMode = DuplexMode;
simulationParameters.TotSubframes = 1;

Вызовите lteRMCDL, чтобы сгенерировать значение по умолчанию eNodeB параметры, не заданные в simulationParameters. Они будут требоваться позже сгенерировать форму волны с помощью lteRMCDLTool.

enb = lteRMCDL(simulationParameters);

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

trBlkSizes = enb.PDSCH.TrBlkSizes;
rvSequence = enb.PDSCH.RVSeq;

Количество кодовых комбинаций, ncw, количество записей в enb.PDSCH.Modulation поле .

ncw = length(string(enb.PDSCH.Modulation));

Распечатайте сводные данные некоторых более соответствующих параметров симуляции. Подтвердите, что установки параметров выравниваются с ожидаемыми значениями. Отображенный уровень кода, о котором сообщают может быть полезным, чтобы обнаружить проблемы, вручную задав транспортные размеры блока. Типичные значения являются 1/3, 1/2 и 3/4.

hDisplayENBParameterSummary(enb, txMode);
-- Parameter summary: --------------------------------------------
                      Duplexing mode: TDD
                   Transmission mode: TM8
                 Transmission scheme: Port7-8
  Number of downlink resource blocks: 50
 Number of allocated resource blocks: 10
Cell-specific reference signal ports: 1
         Number of transmit antennas: 4
                 Transmission layers: 2
                 Number of codewords: 1
               Modulation codeword 1: 16QAM
    Transport block sizes codeword 1:     4584    4008       0       0    4584    4584    4008       0       0    4584
                Code rate codeword 1:   0.5053  0.4941       0       0  0.5053  0.5053  0.4941       0       0  0.5053
------------------------------------------------------------------

Канал распространения и настройка средства оценки канала

Структура channel содержит параметры конфигурации модели канала.

channel = struct;                    % Channel config structure
channel.Seed = 6;                    % Channel seed
channel.NRxAnts = 8;                 % Number of receive antennas
channel.DelayProfile ='EPA';         % Delay profile
channel.DopplerFreq = 5;             % Doppler frequency
channel.MIMOCorrelation = 'Low';     % Multi-antenna correlation
channel.NTerms = 16;                 % Oscillators used in fading model
channel.ModelType = 'GMEDS';         % Rayleigh fading model type
channel.InitPhase = 'Random';        % Random initial phases
channel.NormalizePathGains = 'On';   % Normalize delay profile power
channel.NormalizeTxAnts = 'On';      % Normalize for transmit antennas
% The channel sampling rate depends on the FFT size used in the OFDM
% modulator. This can be obtained using the function lteOFDMInfo.
ofdmInfo = lteOFDMInfo(enb);
channel.SamplingRate = ofdmInfo.SamplingRate;

Задайте конфигурационную структуру средства оценки канала. Поскольку основанные на некниге шифров ТМ используются, установите DMRS как ссылочный сигнал для оценки канала.

cec = struct;                        % Channel estimation config structure
cec.PilotAverage = 'UserDefined';    % Type of pilot symbol averaging
cec.FreqWindow = 41;                 % Frequency window size
cec.TimeWindow = 27;                 % Time window size
cec.InterpType = 'Cubic';            % 2D interpolation type
cec.InterpWindow = 'Centered';       % Interpolation window type
cec.InterpWinSize = 1;               % Interpolation window size
cec.Reference = 'DMRS';              % Use DMRS as reference signal

Отобразите информацию о симуляции

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

displaySimulationInformation = true;

Обработка цепи

Чтобы определить пропускную способность в каждой точке ОСШ, подкадре подкадром PDSCH, обработка цепи включает:

  • При вычислении Матрицы Перед кодированием - совершенная оценка канала используется, чтобы вычислить матрицу перед кодированием. Процесс вычисления отличается немного между FDD и TDD. Подробное объяснение этого шага дано в следующем разделе.

  • При обновлении Текущего Процесса HARQ - процесс HARQ или несет новые транспортные данные или повторную передачу ранее отправленных транспортных данных в зависимости от Подтверждения (ACK) или Отрицательное Подтверждение (NACK) на основе результатов CRC. Все это обработано планировщиком HARQ, hHARQScheduling.m. Данные PDSCH обновляются на основе состояния HARQ.

  • При создании Формы волны Передачи - Передача данные, сгенерированные процессом HARQ к lteRMCDLTool, чтобы произвести OFDM, модулировали форму волны, содержа физические каналы и сигналы.

  • Шумное Моделирование Канала - Передача форма волны через исчезающий канал и добавляет шум (AWGN).

  • Выполнение Синхронизации и Демодуляции OFDM - Смещение полученные символы, чтобы составлять комбинацию задержки реализации и распространения задержки канала. OFDM демодулируют символы.

  • Выполнение Оценки Канала - Оценка ответ канала и уровень шума. Используйте эти оценки, чтобы декодировать PDSCH.

  • Декодирование PDSCH - Получает оценку полученных кодовых комбинаций с помощью ltePDSCHDecode, чтобы демодулировать и дескремблировать восстановленные символы PDSCH за всю передачу и получить пары антенны.

  • При декодировании Нисходящего Разделяемого Канала (DL-SCH) и Хранении Ошибки CRC Блока для Процесса HARQ - Передача вектор декодируемых мягких битов к lteDLSCHDecode, который декодирует кодовую комбинацию и возвращает ошибку блока CRC, раньше определял пропускную способность системы. Содержимое нового мягкого буфера, harqProc(harqID).decState, доступно при выходе этой функции, которая будет использоваться при декодировании следующего подкадра.

Предварительное кодирование матричного вычисления

Поскольку основанные на некниге шифров ТМ моделируются, предварительное кодирование (beamforming) матрица должно быть вычислено, который основан на оценке канала. Для простоты принято совершенное знание канала.

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

Для TDD (восходящая нисходящая настройка 1 структура системы координат), канал оценивается в последнем подкадре UL перед подкадром DL. Эта оценка канала используется, чтобы вычислить предварительно кодирующий матричный W. Все последующие подкадры DL (включая специальные подкадры) до следующего подкадра UL предварительно закодированы с этим матричным W.

Для FDD существует задержка одного подкадра между вычислением предварительно кодирующего матричного W и подкадр, где это используется. Например, матрица перед кодированием использовала в подкадре n был вычислен с оценкой канала, полученной в подкадре n-1, как показано в фигуре.

Функция hCalculatePrecodingMatrix вычисляет W :

  • Получение совершенного канала оценивает для продуманного подкадра

  • Усреднение канала оценивает для всего выделенного RBS

  • Вычисление сингулярного разложения и извлечение первого NLayers столбцы, чтобы получить вектор перед кодированием.

При желании различное вычисление или значение W может использоваться здесь вместо вызова hCalculatePrecodingMatrix.m.

Этот рисунок показывает процесс усреднения оценки канала и W вычисление.

Изображенный процесс показывает как одна матричная оценка канала, H, получен из полного набора выделенных блоков ресурса путем усреднения в зависимости от времени и частоты. Используя эту оценку канала, H, матрица перед кодированием, W, получен через сингулярное разложение.

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

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

'Для' цикла для обработки точек ОСШ включен ниже. Чтобы включить использование параллельных вычислений для увеличенной скорости используют 'parfor' вместо 'в' в цикле. Это требует Parallel Computing Toolbox. Если это не будет установлено, то 'parfor' примет значение по умолчанию к нормальному 'для' оператора. Если 'parfor' используется, рекомендуется что переменная displaySimulationInformation выше установлен в ложь, в противном случае отображения информации симуляции для каждой точки ОСШ перекроются.

% Initialize variables used in the simulation and analysis
% 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);
% Array to store RV sequence index history
allRvSeqIdxHistory = cell(1,numel(SNRIn));
% Copy of channel structure to optimize parallel processing (only if
% running the example with Parallel Computing Toolbox)
channelInit = channel;
% During simulation some fields of enb will be updated, make a copy to
% reinitialize it when simulating each SNR point
enbInit = enb;

% For TDD precalculate vector of subframe types: D, S and U for downlink,
% special and uplink respectively
if strcmpi(DuplexMode,'TDD')
    subframeType = char(10,1);
    initialSubframeNo = enb.NSubframe;
    for sNo=0:9 % for all subframes in a frame
        enb.NSubframe = sNo;
        duplexInfo = lteDuplexingInfo(enb);
        subframeType(sNo+1) = duplexInfo.SubframeType(1); % first char: D, S or U
    end
    enb.NSubframe = initialSubframeNo;
end

% CFI can be a scalar or a vector, create a local copy of CFI as a vector
% (one value per subframe)
if numel(enb.CFI) == 1
    CFI = repmat(enb.CFI,1,10);
else
    CFI = enb.CFI;
end

for snrIdx = 1:numel(SNRIn)     % comment out for parallel computing
%parfor snrIdx = 1:numel(SNRIn) % uncomment for parallel computing

    % Set the random number generator seed depending on the loop variable
    % to ensure independent random streams
    rng(snrIdx,'combRecursive');

    % Reinitialize enb and channel structures (they are modified during
    % each SNR point simulation)
    enb = enbInit;
    channel = channelInit;

    % Initialize the state of all HARQ processes
    harqProcesses = hNewHARQProcess(enb);
    % Initialize HARQ process IDs to 1 as the first non-zero transport
    % block will always be transmitted using the first HARQ process. This
    % will be updated with the full sequence output by lteRMCDLTool after
    % the first call to the function
    harqProcessSequence = 1;

    % Set up variables for the main loop
    lastOffset = 7;       % Initialize overall frame timing offset
                          % (set equal to channel implementation delay)
    frameOffset = 7;      % Initialize frame timing offset
                          % (set equal to channel implementation delay)
    blkCRC = [];          % Block CRC for all considered subframes
    bitTput = [];         % Number of successfully received bits per subframe
    txedTrBlkSizes = [];  % Number of transmitted bits per subframe
    precodingMatrix = []; % Precoding matrix
    rxSymbols = [];       % DL-SCH symbols for constellation plot (codeword 1)
    rxSymbols2 = [];      % DL-SCH symbols for constellation plot (codeword 2)

    % The variable rvSeqIdxHistory stores the history of the value of the
    % RV index sequence for all the HARQ processes
    rvSeqIdxHistory = nan(ncw, NFrames*10);

    % Flag to indicate if a precoding matrix W is available. This is useful
    % if no W has been calculated at the beginning of the simulation.
    isWready = false;
    % Flag to indicate is a subframe is to be processed. Set to true if
    % there is data to be processed in the subframe, i.e. DL subframe or
    % non-zero transport block size.
    processSubframe = false;

    % Main for loop: for all subframes
    for subframeNo = 0:(NFrames*10-1)

        % Update subframe number
        enb.NSubframe = subframeNo;

        % Load CFI for current subframe
        enb.CFI = CFI(mod(subframeNo,length(CFI))+1);

        % Channel time for the current subframe
        channel.InitTime = subframeNo/1000;

        % Get HARQ process ID for the subframe from HARQ process sequence
        harqID = harqProcessSequence(mod(subframeNo, length(harqProcessSequence))+1);

        % Extract the current subframe transport block size(s)
        trBlk = trBlkSizes(:, mod(subframeNo, 10)+1).';

        % Load precoding matrix calculated in previous subframe if it
        % exists and if there is data to transmit. Set the flag to trigger
        % subframe processing.
        if isWready && any(trBlk)
            harqProcesses(harqID).txConfig.W = precodingMatrix;
            processSubframe = true;
        else
            processSubframe = false;
        end

        % Precoding matrix calculation
        if strcmpi(DuplexMode,'TDD')
            % Estimate channel in UL subframe
            if strcmp(subframeType(mod(subframeNo,10)+1),'U')
                processSubframe = false; % UL subframe, no DL data
                % Only perform channel estimate if next subframe is DL
                if strcmp(subframeType(mod((subframeNo+1),10)+1),'D')
                    precodingMatrix = hCalculatePrecodingMatrix(enb, channel);
                    isWready = true;
                end
            end
        else %FDD
            % Get transport block for next subframe
            trBlkNext = trBlkSizes(:, mod(subframeNo+1, 10)+1).';

            % Calculate the precoding matrix for next subframe only if it
            % carries data (i.e. non-zero trBlkNext)
            if any(trBlkNext)
                precodingMatrix = hCalculatePrecodingMatrix(enb, channel);
                isWready = true;
            else
                isWready = false;
            end
        end

        % Subframe processing
        if processSubframe

            % Update current HARQ process
            harqProcesses(harqID) = hHARQScheduling( ...
                harqProcesses(harqID), subframeNo, rvSequence);

            % Display run time information
            if displaySimulationInformation && any(trBlk)
                disp(' ');
                disp(['Subframe: ' num2str(subframeNo) '. HARQ process index: ' num2str(harqID)]);
            end

            % Update RV sequence index table
            rvSeqIdxHistory(:,subframeNo+1) = ...
                harqProcesses(harqID).txConfig.RVIdx.';

            % Update the PDSCH transmission configuration with HARQ
            % process state
            enb.PDSCH = harqProcesses(harqID).txConfig;

            % Cell payload
            dlschTransportBlk = harqProcesses(harqID).data;

            % Create transmit waveform and get the HARQ scheduling ID
            % sequence from 'enbOut' structure output which also contains
            % the waveform configuration and OFDM modulation parameters
            [txWaveform,~,enbOut] = lteRMCDLTool(enb, dlschTransportBlk);

            % Add 25 sample padding. This is to cover the range of delays
            % expected from channel modeling (a combination of
            % implementation delay and channel delay spread)
            txWaveform =  [txWaveform; zeros(25, ntxants)]; %#ok<AGROW>

            % Get the HARQ ID sequence from 'enbOut' for HARQ processing
            harqProcessSequence = enbOut.PDSCH.HARQProcessSequence;

            % Pass data through channel model
            rxNoiselessWaveform = lteFadingChannel(channel,txWaveform);

            % Calculate noise gain including compensation for downlink
            % power allocation
            SNR = 10^((SNRIn(snrIdx)-enb.PDSCH.Rho)/20);

            % Normalize noise power to take account of sampling rate,
            % which is a function of the IFFT size used in OFDM
            % modulation, and the number of antennas
            N0 = 1/(sqrt(2.0*ntxants*double(ofdmInfo.Nfft))*SNR);

            % Create additive white Gaussian noise
            noise = N0*complex(randn(size(rxNoiselessWaveform)),...
                randn(size(rxNoiselessWaveform)));

            % Add AWGN to the received time domain waveform and scale
            % for required power
            rxWaveform = rxNoiselessWaveform + noise;

            % Receiver
            % Once every frame, on subframe 0, calculate a new
            % synchronization offset. An offset within the range of
            % delays expected from the channel modeling (a combination
            % of implementation delay and channel delay spread)
            % indicates success
            if (mod(subframeNo,10)==0)
                frameOffset = lteDLFrameOffset(enb,rxWaveform);
                if (frameOffset > 25)
                    frameOffset = lastOffset;
                end
                lastOffset = frameOffset;
            end
            rxWaveform = rxWaveform(1+frameOffset:end,:);

            % Perform OFDM demodulation on the received data to obtain
            % the resource grid
            rxSubframe = lteOFDMDemodulate(enb,rxWaveform);

            % Channel estimation
            [estChannelGrid,noiseEst] = ...
                lteDLChannelEstimate(enb,enb.PDSCH,cec,rxSubframe);

            % Perform equalization, deprecoding, layer demapping,
            % demodulation and descrambling on the received data using the
            % channel estimate.

            % Get PDSCH indices
            pdschIndices = ltePDSCHIndices(enb,enb.PDSCH,enb.PDSCH.PRBSet);

            % Get PDSCH resource elements. Scale the received subframe
            % by the PDSCH power factor Rho. The PDSCH is scaled by
            % Rho, while the cell reference symbols used for channel
            % estimation (used in the PDSCH decoding stage) are not.
            [pdschRx, pdschHest] = lteExtractResources(pdschIndices, ...
                rxSubframe*(10^(-enb.PDSCH.Rho/20)),estChannelGrid);

            % Decode PDSCH
            [dlschBits,dlschSymbols] = ltePDSCHDecode(enb,enb.PDSCH,...
                pdschRx,pdschHest,noiseEst);

            % Store the decoded DLSCH symbols for constellation
            % plotting
            rxSymbols = [rxSymbols; dlschSymbols{1}(:)]; %#ok<AGROW>
            if ncw>1
                rxSymbols2 = [rxSymbols2; dlschSymbols{2}(:)]; %#ok<AGROW>
            end

            % Decode the DL-SCH
            [decbits,harqProcesses(harqID).blkerr,harqProcesses(harqID).decState] = ...
                lteDLSCHDecode(enb,enb.PDSCH,trBlk,dlschBits, ...
                harqProcesses(harqID).decState);

            % Display block errors
            if displaySimulationInformation
                if any(harqProcesses(harqID).blkerr)
                    disp(['Block error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx) ', CRC: ' num2str(harqProcesses(harqID).blkerr)])
                else
                    disp(['No error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx) ', CRC: ' num2str(harqProcesses(harqID).blkerr)])
                end
            end

            % Store values needed to calculate throughput
            % Only for subframes with data
            if(any(trBlk))
                blkCRC = [blkCRC harqProcesses(harqID).blkerr]; %#ok<AGROW>
                bitTput = [bitTput trBlk.*(1- ...
                    harqProcesses(harqID).blkerr)]; %#ok<AGROW>
                txedTrBlkSizes = [txedTrBlkSizes trBlk]; %#ok<AGROW>
            end
        end
    end

    % Plot received symbol constellation
    if displaySimulationInformation
        figure;plot(rxSymbols,'.r'); title(['Received constellation. SNR ' ...
                                 num2str(SNRIn(snrIdx)) ' dB. Codeword 1'])
        xlabel('In-phase Amplitude');
        ylabel('Quadrature Amplitude');
        if ncw>1
            figure;plot(rxSymbols2,'.r'); title(['Received constellation. SNR ' ...
                                 num2str(SNRIn(snrIdx)) ' dB. Codeword 2'])
            xlabel('In-phase Amplitude');
            ylabel('Quadrature Amplitude');
        end
    end

    % Calculate the 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('\nSNR = %.2f dB. Throughput for %d Frame(s) = %.4f Mbps\n',...
         SNRIn(snrIdx),NFrames,1e-6*simThroughput(snrIdx)/(NFrames*10e-3));
    fprintf('SNR = %.2f dB. Throughput(%%) for %d Frame(s) = %.4f %%\n',...
    SNRIn(snrIdx),NFrames,simThroughput(snrIdx)*100/maxThroughput(snrIdx));

    allRvSeqIdxHistory{snrIdx} = rvSeqIdxHistory;

end
 
Subframe: 4. HARQ process index: 1
Block error. RV index: 1, CRC: 1
 
Subframe: 5. HARQ process index: 4
Block error. RV index: 1, CRC: 1
 
Subframe: 6. HARQ process index: 5
Block error. RV index: 1, CRC: 1
 
Subframe: 9. HARQ process index: 6
Block error. RV index: 1, CRC: 1
 
Subframe: 10. HARQ process index: 7
Block error. RV index: 1, CRC: 1
 
Subframe: 11. HARQ process index: 2
Block error. RV index: 1, CRC: 1
 
Subframe: 14. HARQ process index: 1
No error. RV index: 2, CRC: 0
 
Subframe: 15. HARQ process index: 3
Block error. RV index: 1, CRC: 1
 
Subframe: 16. HARQ process index: 5
No error. RV index: 2, CRC: 0
 
Subframe: 19. HARQ process index: 4
No error. RV index: 2, CRC: 0

SNR = -4.00 dB. Throughput for 2 Frame(s) = 0.6588 Mbps
SNR = -4.00 dB. Throughput(%) for 2 Frame(s) = 29.8694 %
 
Subframe: 4. HARQ process index: 1
No error. RV index: 1, CRC: 0
 
Subframe: 5. HARQ process index: 4
No error. RV index: 1, CRC: 0
 
Subframe: 6. HARQ process index: 5
No error. RV index: 1, CRC: 0
 
Subframe: 9. HARQ process index: 6
No error. RV index: 1, CRC: 0
 
Subframe: 10. HARQ process index: 7
No error. RV index: 1, CRC: 0
 
Subframe: 11. HARQ process index: 2
No error. RV index: 1, CRC: 0
 
Subframe: 14. HARQ process index: 1
No error. RV index: 1, CRC: 0
 
Subframe: 15. HARQ process index: 3
No error. RV index: 1, CRC: 0
 
Subframe: 16. HARQ process index: 5
No error. RV index: 1, CRC: 0
 
Subframe: 19. HARQ process index: 4
No error. RV index: 1, CRC: 0

SNR = 1.00 dB. Throughput for 2 Frame(s) = 2.2056 Mbps
SNR = 1.00 dB. Throughput(%) for 2 Frame(s) = 100.0000 %

Последовательность RV индексирует графики

Код ниже генерирует графики со значением индексов к элементам в последовательности RV для симулированных подкадров. Это обеспечивает идею требуемых повторных передач. Причина графического вывода индексов вместо значений RV состоит в том, что последний не может быть организован в порядке возрастания. Например, в некоторых случаях последовательность RV может быть [0, 2, 3, 1]. Графический вывод этих значений, когда они используются, не обеспечит четкое представление о количестве необходимых повторных передач.

При передаче нового транспортного блока используется первый элемент последовательности RV, и значение 1 показывают для того подкадра. Дело обстоит так в начале симуляции. Если повторная передача требуется, следующий элемент в последовательности RV выбран, и индекс увеличен. Значение 2 будет построено для подкадра, где повторная передача происходит. Если дальнейшие повторные передачи будут требоваться, значение индекса увеличится далее. Графики не показывают значения в подкадре 5 из последовательных систем координат. Это вызвано тем, что никакие данные не передаются в тех подкадрах для настройки, используемой в этом примере.

hPlotRVSequence(SNRIn,allRvSeqIdxHistory,NFrames);

Результаты пропускной способности

Результаты пропускной способности отображены в командном окне MATLAB® после того, как каждая точка ОСШ будет завершена. Они также получены в выходных массивах simThroughput и maxThroughput. simThroughput хранит измеренную пропускную способность в количестве битов для всех симулированных точек ОСШ. maxThroughput хранит максимальную возможную пропускную способность в количестве битов для каждой симулированной точки ОСШ.

% Plot throughput
figure
legendString = [char(txMode) ': ' num2str(simulationParameters.PDSCH.NLayers) ...
                ' layer(s), ' num2str(ntxants) ' ant(s)'];
plot(SNRIn, simThroughput*100./maxThroughput,'*-.');
xlabel('SNR (dB)');
ylabel('Throughput (%)');
title('Throughput vs SNR');
legend(legendString,'Location','NorthWest');
grid on;

Для статистически допустимых результатов симуляция должна быть запущена для большего числа систем координат. Фигура ниже сравнивает результаты пропускной способности для TDD и FDD при симуляции 1 000 систем координат.

Приложение

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

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

  1. 3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"