В этом примере показано, как измерить пропускную способность физического общего канала нисходящей линии связи (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
В этом разделе выбирается интересующий 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 может быть [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 кадров, дало результаты, показанные ниже.

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