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

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

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

  • TM2: Передайте разнообразие

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

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

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

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

Введение

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

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

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

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

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

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

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

Строение eNodeB

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

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

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

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

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 чтобы сгенерировать параметры eNodeB по умолчанию, не указанные в 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 для TM с обратной связью (TM4 и TM6). Это задержка между PMI, передаваемым от UE к eNodeB, как определено в 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;

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

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

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

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

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

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

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

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

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

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

  • Обновление PMI. PMI выбирается и отправляется обратно в eNodeB для будущего использования. Этот шаг применим только к 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 ® после завершения каждой точки ОСШ. Они также захвачены в simThroughput и maxThroughput. simThroughput - массив с измеренной пропускной способностью в количестве бит для всех моделируемых точек ОСШ. maxThroughput сохраняет максимально возможную пропускную способность в количестве бит для каждой моделируемой точки ОСШ.

% 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 TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»