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

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

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

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

  • TM9 и TM10: предварительное кодирование на основе некодовой книги для до восьми слоев Порт 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) Пространственное Мультиплексирование

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

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

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

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

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

  • Выполняют операции приемника (оценка канала, эквализация, демодуляция и декодирование).

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

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

Область Строения

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

NFrames = 2;        % Number of frames

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

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

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

Для целей этого примера 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 (матрица формирования луча) NLayers -by- 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;

Определите структуру строения оценщика канала. Поскольку используются TM, не основанные на кодовой книге, установите 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 управляет отображением симуляции информации, такой как идентификатор процесса HARQ, используемый для каждого подкадра. В случае ошибки CRC также отображается значение индекса для RV-последовательности.

displaySimulationInformation = true;

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

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

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

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

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

  • Моделирование шумного канала - передайте форму волны через канал с замираниями и добавьте шум (AWGN).

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

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

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

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

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

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

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

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

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

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

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

  • Усреднение оценок канала для всех выделенных RB

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

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

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

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

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

Цикл обработки

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

% 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

% Get the HARQ ID sequence for HARQ processing. This is a list of indices
% for HARQ process scheduling.
[~,~,enbOut] = lteRMCDLTool(enb, []);
harqProcessSequenceInit = enbOut.PDSCH.HARQProcessSequence;

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 variables (they are modified during each SNR point
    % simulation)
    enb = enbInit;
    channel = channelInit;
    harqProcessSequence = harqProcessSequenceInit;

    % Initialize the state of all HARQ processes
    harqProcesses = hNewHARQProcess(enb);

    % 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
            txWaveform = 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>

            % 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: 3
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
Block error. RV index: 1, CRC: 1
 
Subframe: 15. HARQ process index: 3
No error. RV index: 2, CRC: 0
 
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: 3
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 при симуляции 1000 систем координат.

Приложение

Этот пример использует эти следующие вспомогательные функции.

Избранная библиография

  1. 3GPP TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»