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

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

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

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

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

  • TM4: книга шифров Замкнутого цикла основывала пространственное мультиплексирование

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

Пример также показывает, как параметризовать и настроить настройки для различных ТМ. Это также поддерживает использование 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 при выходе декодера канала.

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

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

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

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

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

Настройка eNodeB

Этот раздел выбирает TM интереса и устанавливает eNodeB параметры. TM выбран с помощью переменной 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. Для каждого TM заданы обязательные параметры. Этот пример не выполняет декодирование формата 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, чтобы сгенерировать значение по умолчанию 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 ТМ с обратной связью (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

% The sampling rate for the channel model is set using the value returned
% from <matlab:doc('lteOFDMInfo') lteOFDMInfo>.

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

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

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

% Perfect channel estimator flag
perfectChanEstimator = false;

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

displaySimulationInformation = true;

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

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

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

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

  • Создайте Форму волны Передачи. Данные, сгенерированные процессом 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);

% The temporary variables 'enb_init' and 'channel_init' are used to create
% the temporary variables 'enb' and 'channel' within the SNR loop to create
% independent simulation loops for the 'parfor' loop
enb_init = enb;
channel_init = channel;
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
    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);
    % Initialize HARQ process IDs to 1 as the first non-zero transport
    % block will always be transmitted using the first HARQ process. This
    % will be updated with the full sequence output by lteRMCDLTool after
    % the first call to the function
    harqProcessSequence = 1;

    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

        % Create transmit waveform and get the HARQ scheduling ID sequence
        % from 'enbOut' structure output which also contains the waveform
        % configuration and OFDM modulation parameters
        [txWaveform,~,enbOut] = lteRMCDLTool(enb, 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 (%)');
legend(legendString,'Location','NorthWest');
grid on;

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

Приложение

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

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

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