exponenta event banner

Тест соответствия пропускной способности PDSCH для одноантенного (TM1), разнесения передачи (TM2), разомкнутого (TM3) и замкнутого (TM4/6) пространственного мультиплексирования

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

  • TM1: Одиночная антенна (порт 0)

  • TM2: Разнесение передачи

  • TM3: Предварительное кодирование на основе кодовой книги с разомкнутым контуром: разнесение с циклической задержкой (CDD)

  • TM4: Пространственное мультиплексирование на основе кодовой книги с замкнутым контуром

  • TM6: Одноуровневое пространственное мультиплексирование на основе кодовой книги с замкнутым контуром

В примере также показано, как параметризовать и настраивать параметры для различных ТМ. Он также поддерживает использование Toolbox™ параллельных вычислений для сокращения эффективного времени моделирования.

Введение

В этом примере измеряется пропускная способность для нескольких точек SNR. Предоставленный код может работать при ряде режимов передачи: TM1, TM2, TM3, TM4 и TM6. Для получения информации о моделировании TM7, TM8, TM9 и TM10 см. следующий пример: Пропускная способность PDSCH для схем предварительного кодирования, не основанных на кодовых книгах: порт 5 (TM7), порт 7 или 8 или порт 7-8 (TM8), порт 7-14 (TM9 и TM10).

Пример работает на основе подкадра за подкадром. Для каждой из рассматриваемых точек SNR генерируется заполненная сетка ресурсов и OFDM модулируется для создания формы сигнала передачи. Сформированный сигнал пропускают через шумовой канал замирания. Затем приемником выполняются следующие операции: оценка канала, выравнивание, демодуляция и декодирование. Пропускная способность PDSCH определяется с использованием результата блочного CRC на выходе канального декодера.

Обратная связь индикации матрицы предварительного кодирования (PMI) реализована для ТМ, требующих обратной связи матрицы предварительного кодирования (TM4 и TM6).

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

Конфигурация моделирования

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

NFrames = 2;                % Number of frames
SNRIn = [10.3 12.3 14.3];   % SNR range in dB

Конфигурация eNeyB

В этом разделе выбирается интересующий TM и устанавливаются параметры eNireB. ТМ выбирается с помощью переменной txMode, которые могут принимать значения TM1, TM2, TM3, TM4 и TM6.

txMode = 'TM4'; % TM1, TM2, TM3, TM4, TM6

Для простоты все ТМ, смоделированные в этом примере, имеют полосу пропускания 50 блоков ресурсов с полным выделением и кодовой скоростью 0,5. Отсутствие указания номера RMC гарантирует, что все подкадры нисходящей линии связи запланированы. Если задан RMC (например, «R.0»), планирование подкадров определено в TS 36.101 [1], где подкадр 5 в большинстве случаев не запланирован.

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

simulationParameters = []; % clear simulationParameters
simulationParameters.NDLRB = 50;
simulationParameters.PDSCH.TargetCodeRate = 0.5;
simulationParameters.PDSCH.PRBSet = (0:49)';

switch txMode
% Single antenna (Port0) mode (TM1)
    case 'TM1'
        fprintf('\nTM1 - Single antenna (port 0)\n');
        simulationParameters.PDSCH.TxScheme = 'Port0';
        simulationParameters.PDSCH.DCIFormat = 'Format1';
        simulationParameters.CellRefP = 1;
        simulationParameters.PDSCH.Modulation = {'16QAM'};

% Transmit diversity mode (TM2)
    case 'TM2'
        fprintf('\nTM2 - Transmit diversity\n');
        simulationParameters.PDSCH.TxScheme = 'TxDiversity';
        simulationParameters.PDSCH.DCIFormat = 'Format1';
        simulationParameters.CellRefP = 2;
        simulationParameters.PDSCH.Modulation = {'16QAM'};
        simulationParameters.PDSCH.NLayers = 2;

% CDD mode (TM3)
    case 'TM3'
        fprintf('\nTM3 - CDD\n');
        simulationParameters.PDSCH.TxScheme = 'CDD';
        simulationParameters.PDSCH.DCIFormat = 'Format2A';
        simulationParameters.CellRefP = 2;
        simulationParameters.PDSCH.Modulation = {'16QAM', '16QAM'};
        simulationParameters.PDSCH.NLayers = 2;

% Spatial multiplexing mode (TM4)
    case 'TM4'
        fprintf('\nTM4 - Codebook based spatial multiplexing\n');
        simulationParameters.CellRefP = 2;
        simulationParameters.PDSCH.Modulation = {'16QAM', '16QAM'};
        simulationParameters.PDSCH.DCIFormat = 'Format2';
        simulationParameters.PDSCH.TxScheme = 'SpatialMux';
        simulationParameters.PDSCH.NLayers = 2;
        % No codebook restriction
        simulationParameters.PDSCH.CodebookSubset = '';

% Single layer spatial multiplexing mode (TM6)
    case 'TM6'
        fprintf(...
        '\nTM6 - Codebook based spatial multiplexing with single layer\n');
        simulationParameters.CellRefP = 4;
        simulationParameters.PDSCH.Modulation = {'QPSK'};
        simulationParameters.PDSCH.DCIFormat = 'Format2';
        simulationParameters.PDSCH.TxScheme = 'SpatialMux';
        simulationParameters.PDSCH.NLayers = 1;
        % No codebook restriction
        simulationParameters.PDSCH.CodebookSubset = '';

    otherwise
        error('Transmission mode should be one of TM1, TM2, TM3, TM4 or TM6.')
end

% Set other simulationParameters fields applying to all TMs
simulationParameters.TotSubframes = 1; % Generate one subframe at a time
simulationParameters.PDSCH.CSI = 'On'; % Soft bits are weighted by CSI
TM4 - Codebook based spatial multiplexing

Звонить lteRMCDL для генерации параметров eNeyB по умолчанию, не указанных в simulationParameters. Они потребуются позже для генерации формы сигнала с использованием lteRMCDLTool.

enb = lteRMCDL(simulationParameters);

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

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

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

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

Установка задержки PMI для ТМ с замкнутым контуром (TM4 и TM6). Это задержка между передачей PMI от UE к eNireB, как определено в TS36.101, таблица 8.2.1.4.2-1 [1].

pmiDelay = 8;

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

hDisplayENBParameterSummary(enb, txMode);
-- Parameter summary: --------------------------------------------
                      Duplexing mode: FDD
                   Transmission mode: TM4
                 Transmission scheme: SpatialMux
  Number of downlink resource blocks: 50
 Number of allocated resource blocks: 50
Cell-specific reference signal ports: 2
         Number of transmit antennas: 2
                 Transmission layers: 2
                 Number of codewords: 2
               Modulation codeword 1: 16QAM
    Transport block sizes codeword 1:    11448   11448   11448   11448   11448   11448   11448   11448   11448   11448
                Code rate codeword 1:    0.515    0.48    0.48    0.48    0.48  0.4918    0.48    0.48    0.48    0.48
               Modulation codeword 2: 16QAM
    Transport block sizes codeword 2:    11448   11448   11448   11448   11448   11448   11448   11448   11448   11448
                Code rate codeword 2:    0.515    0.48    0.48    0.48    0.48  0.4918    0.48    0.48    0.48    0.48
------------------------------------------------------------------

Конфигурация модели канала распространения

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

channel.Seed = 6;                    % Channel seed
channel.NRxAnts = 2;                 % 2 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

% Set the sampling rate for the channel model by using the value returned
% by the lteOFDMInfo function.

ofdmInfo = lteOFDMInfo(enb);
channel.SamplingRate = ofdmInfo.SamplingRate;

Конфигурация оценщика канала

Переменная perfectChanEstimator управляет поведением оценщика канала. Допустимые значения: true или false. Если установлено значение true в качестве оценки используют совершенный отклик канала, в противном случае получают несовершенную оценку на основе значений принятых пилот-сигналов.

% Perfect channel estimator flag
perfectChanEstimator = false;

Если perfectChanEstimator имеет значение false для структуры конфигурации cec необходима для параметризации блока оценки канала. Канал медленно изменяется во времени и частоте, поэтому для усреднения шума используется большое окно усреднения.

% Configure channel estimator
cec.PilotAverage = 'UserDefined';   % Type of pilot symbol averaging
cec.FreqWindow = 41;                % Frequency window size in REs
cec.TimeWindow = 27;                % Time window size in REs
cec.InterpType = 'Cubic';           % 2D interpolation type
cec.InterpWindow = 'Centered';      % Interpolation window type
cec.InterpWinSize = 1;              % Interpolation window size

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

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

displaySimulationInformation = true;

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

Для определения пропускной способности в каждой точке SNR данные PDSCH анализируются на основе подкадра за подкадром, используя следующие шаги:

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

  • Установка PMI. Этот шаг применим только к TM4 и TM6 (пространственное мультиплексирование с замкнутым контуром и одноуровневое пространственное мультиплексирование с замкнутым контуром). PMI берется последовательно из набора PMI, txPMIsкаждый подкадр и используется eNeyB для выбора матрицы предварительного кодирования. PMI, рекомендованный UE, используется eNireB для передачи данных. Имеется задержка в pmiDelay подкадры между UE, рекомендующим PMI, и eNeyB, использующим его для выбора матрицы предварительного кодирования. Первоначально набор pmiDelay используются случайные PMI.

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

  • Шумное моделирование каналов. Сигнал пропускают через канал замирания и добавляют шум (AWGN).

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

  • Выполнение оценки канала. Оценивают отклик канала и уровни шума. Эти оценки используются для декодирования PDSCH.

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

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

  • Обновить PMI. PMI выбирается и подается обратно в eNireB для будущего использования. Этот шаг применим только к TM4 и TM6 (пространственное мультиплексирование по замкнутому контуру и одноуровневое пространственное мультиплексирование по замкнутому контуру).

% The number of transmit antennas P is obtained from the resource grid
% dimensions. 'dims' is M-by-N-by-P where M is the number of subcarriers, N
% is the number of symbols and P is the number of transmit antennas.
dims = lteDLResourceGridSize(enb);
P = dims(3);

% 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);

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

% Temporary variables 'enb_init', 'channel_init' and
% 'harqProcessSequence_init' are used to optimize parallel processing (only
% if running the example with Parallel Computing Toolbox)
enb_init = enb;
channel_init = channel;
harqProcessSequence_init = harqProcessSequence;
legendString = ['Throughput: ' char(enb.PDSCH.TxScheme)];
allRvSeqPtrHistory = cell(1,numel(SNRIn));
nFFT = ofdmInfo.Nfft;

for snrIdx = 1:numel(SNRIn)
% parfor snrIdx = 1:numel(SNRIn)
% To enable the use of parallel computing for increased speed comment out
% the 'for' statement above and uncomment the 'parfor' statement below.
% This needs the Parallel Computing Toolbox. If this is not installed
% 'parfor' will default to the normal 'for' statement. If 'parfor' is
% used it is recommended that the variable 'displaySimulationInformation'
% above is set to false, otherwise the simulation information displays for
% each SNR point will overlap.

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

    SNRdB = SNRIn(snrIdx);
    fprintf('\nSimulating at %g dB SNR for %d Frame(s)\n' ,SNRdB, NFrames);

    % Initialize variables used in the simulation and analysis
    offsets = 0;            % Initialize frame offset value
    offset = 0;             % Initialize frame offset value for radio frame
    blkCRC = [];            % Block CRC for all considered subframes
    bitTput = [];           % Number of successfully received bits per subframe
    txedTrBlkSizes = [];    % Number of transmitted bits per subframe
    enb = enb_init;         % Initialize RMC configuration
    channel = channel_init; % Initialize channel configuration
    harqProcessSequence = harqProcessSequence_init; % Initialize HARQ process sequence
    pmiIdx = 0;             % PMI index in delay queue

    % The variable harqPtrTable stores the history of the value of the
    % pointer to the RV sequence values for all the HARQ processes.
    % Pre-allocate with NaNs as some subframes do not have data
    rvSeqPtrHistory = NaN(ncw, NFrames*10);

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

    % Use random PMIs for the first 'pmiDelay' subframes until feedback is
    % available from the UE; note that PMI feedback is only applicable for
    % spatial multiplexing TMs (TM4 and TM6), but the code here is required
    % for complete initialization of variables in the SNR loop when using
    % the Parallel Computing Toolbox.
    pmidims = ltePMIInfo(enb,enb.PDSCH);
    txPMIs = randi([0 pmidims.MaxPMI], pmidims.NSubbands, pmiDelay);

    for subframeNo = 0:(NFrames*10-1)

        % Update subframe number
        enb.NSubframe = subframeNo;

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

        % If there is a transport block scheduled in the current subframe
        % (indicated by non-zero 'harqID'), perform transmission and
        % reception. Otherwise continue to the next subframe
        if harqID == 0
            continue;
        end

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

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

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

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

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

        % Set the PMI to the appropriate value in the delay queue
        if strcmpi(enb.PDSCH.TxScheme,'SpatialMux')
            pmiIdx = mod(subframeNo, pmiDelay);  % PMI index in delay queue
            enb.PDSCH.PMISet = txPMIs(:, pmiIdx+1); % Set PMI
        end

        % Generate transmit waveform
        txWaveform = lteRMCDLTool(enb, data);

        % 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, P)]; %#ok<AGROW>

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

        % Initialize channel time for each subframe
        channel.InitTime = subframeNo/1000;

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

        % Calculate noise gain including compensation for downlink power
        % allocation
        SNR = 10^((SNRdB-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*enb.CellRefP*double(nFFT))*SNR);

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

        % Add AWGN to the received time domain waveform
        rxWaveform = rxWaveform + noise;

        % Once every frame, on subframe 0, calculate a new synchronization
        % offset
        if (mod(subframeNo,10) == 0)
            offset = lteDLFrameOffset(enb, rxWaveform);
            if (offset > 25)
                offset = offsets(end);
            end
            offsets = [offsets offset]; %#ok
        end

        % Synchronize the received waveform
        rxWaveform = rxWaveform(1+offset:end, :);

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

        % Channel estimation
        if(perfectChanEstimator)
            estChannelGrid = lteDLPerfectChannelEstimate(enb, channel, offset); %#ok
            noiseGrid = lteOFDMDemodulate(enb, noise(1+offset:end ,:));
            noiseEst = var(noiseGrid(:));
        else
            [estChannelGrid, noiseEst] = lteDLChannelEstimate( ...
                enb, enb.PDSCH, cec, rxSubframe);
        end

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

        % Get PDSCH resource elements from the received subframe. Scale the
        % received subframe by the PDSCH power factor Rho. The PDSCH is
        % scaled by this amount, 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 = ltePDSCHDecode(...
                             enb, enb.PDSCH, pdschRx, pdschHest, noiseEst);

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

        % Provide PMI feedback to the eNodeB
        if strcmpi(enb.PDSCH.TxScheme,'SpatialMux')
            PMI = ltePMISelect(enb, enb.PDSCH, estChannelGrid, noiseEst);
            txPMIs(:, pmiIdx+1) = PMI;
        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([['\nThroughput(Mbps) for ', num2str(NFrames) ' Frame(s) '],...
        '= %.4f\n'], 1e-6*simThroughput(snrIdx)/(NFrames*10e-3));
    fprintf(['Throughput(%%) for ', num2str(NFrames) ' Frame(s) = %.4f\n'],...
        simThroughput(snrIdx)*100/maxThroughput(snrIdx));

    allRvSeqPtrHistory{snrIdx} = rvSeqPtrHistory;

end

% Plot the RV sequence for all HARQ processes
hPlotRVSequence(SNRIn,allRvSeqPtrHistory,NFrames);
Simulating at 10.3 dB SNR for 2 Frame(s)
 
Subframe: 0. HARQ process ID: 1
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 1. HARQ process ID: 2
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 2. HARQ process ID: 3
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 3. HARQ process ID: 4
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 4. HARQ process ID: 5
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 5. HARQ process ID: 6
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 6. HARQ process ID: 7
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 7. HARQ process ID: 8
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 8. HARQ process ID: 1
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 9. HARQ process ID: 2
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 10. HARQ process ID: 3
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 11. HARQ process ID: 4
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 12. HARQ process ID: 5
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 13. HARQ process ID: 6
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 14. HARQ process ID: 7
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 15. HARQ process ID: 8
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 16. HARQ process ID: 1
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 17. HARQ process ID: 2
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 18. HARQ process ID: 3
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 19. HARQ process ID: 4
Block error. RV index: 1  3, CRC: 0  1

Throughput(Mbps) for 2 Frame(s) = 9.7308
Throughput(%) for 2 Frame(s) = 42.5000

Simulating at 12.3 dB SNR for 2 Frame(s)
 
Subframe: 0. HARQ process ID: 1
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 1. HARQ process ID: 2
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 2. HARQ process ID: 3
Block error. RV index: 1  1, CRC: 1  1
 
Subframe: 3. HARQ process ID: 4
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 4. HARQ process ID: 5
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 5. HARQ process ID: 6
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 6. HARQ process ID: 7
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 7. HARQ process ID: 8
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 8. HARQ process ID: 1
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 9. HARQ process ID: 2
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 10. HARQ process ID: 3
Block error. RV index: 2  2, CRC: 0  1
 
Subframe: 11. HARQ process ID: 4
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 12. HARQ process ID: 5
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 13. HARQ process ID: 6
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 14. HARQ process ID: 7
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 15. HARQ process ID: 8
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 16. HARQ process ID: 1
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 17. HARQ process ID: 2
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 18. HARQ process ID: 3
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 19. HARQ process ID: 4
No error. RV index: 1  3, CRC: 0  0

Throughput(Mbps) for 2 Frame(s) = 13.1652
Throughput(%) for 2 Frame(s) = 57.5000

Simulating at 14.3 dB SNR for 2 Frame(s)
 
Subframe: 0. HARQ process ID: 1
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 1. HARQ process ID: 2
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 2. HARQ process ID: 3
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 3. HARQ process ID: 4
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 4. HARQ process ID: 5
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 5. HARQ process ID: 6
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 6. HARQ process ID: 7
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 7. HARQ process ID: 8
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 8. HARQ process ID: 1
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 9. HARQ process ID: 2
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 10. HARQ process ID: 3
Block error. RV index: 1  2, CRC: 0  1
 
Subframe: 11. HARQ process ID: 4
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 12. HARQ process ID: 5
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 13. HARQ process ID: 6
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 14. HARQ process ID: 7
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 15. HARQ process ID: 8
No error. RV index: 1  2, CRC: 0  0
 
Subframe: 16. HARQ process ID: 1
Block error. RV index: 1  1, CRC: 0  1
 
Subframe: 17. HARQ process ID: 2
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 18. HARQ process ID: 3
No error. RV index: 1  3, CRC: 0  0
 
Subframe: 19. HARQ process ID: 4
Block error. RV index: 1  1, CRC: 0  1

Throughput(Mbps) for 2 Frame(s) = 16.0272
Throughput(%) for 2 Frame(s) = 70.0000

Графики указателя последовательности RV

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

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

Рисунок, показанный ниже, был получен, имитируя 10 кадров. Обратите внимание, что в некоторых случаях требуется до 3 повторных передач.

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

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

% Plot throughput
figure
plot(SNRIn, simThroughput*100./maxThroughput,'*-.');
xlabel('SNR (dB)');
ylabel('Throughput (%)');
title('Throughput vs. SNR')
legend(legendString,'Location','NorthWest');
grid on;

Сгенерированный график был получен с малым количеством кадров, поэтому показанные результаты не являются репрезентативными. Более длительное моделирование, полученное с помощью 1000 кадров, дало результаты, показанные ниже.

Приложение

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

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

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