В этом примере показано, как измерить пропускную способность физического общего канала нисходящей линии связи (PDSCH) с использованием Toolbox™ LTE для следующих режимов передачи предварительного кодирования (TM), не основанных на кодовой книге:
TM7: предварительное кодирование на основе некодовой книги для одного уровня (порт 5)
TM8: предварительное кодирование, не основанное на кодовой книге, для двух уровней (двухуровневый порт 7-8 или одноантенный порт 7 или 8)
TM9 и TM10: предварительное кодирование на основе некодовой книги для до восьми уровней Порт 7-14 или один антенный порт, порт 7 или 8
Поддерживаются схемы дуплексирования FDD и TDD. В примере также показано, как параметризовать и настраивать настройки для различных режимов передачи. Он также поддерживает использование Toolbox™ параллельных вычислений для сокращения эффективного времени моделирования.
В этом примере измеряется пропускная способность для нескольких точек SNR. Предоставленный код может работать при ряде режимов передачи: TM7, TM8, TM9 и TM10. Поддерживаются схемы дуплексирования FDD и TDD. Для получения информации о моделировании TM1, TM2, TM3, TM4 и TM6 см. следующий пример: Тест соответствия пропускной способности PDSCH для одиночной антенны (TM1), разнесения передачи (TM2), разомкнутого контура (TM3) и пространственного мультиплексирования с замкнутым контуром (TM4/6).
Поскольку не основанные на кодовой книге ТМ рассматриваются, матрица предварительного кодирования (формирования луча) должна быть вычислена. Это достигается с использованием метода разложения по сингулярным значениям (SVD). Предполагается совершенное знание канала.
Для каждой из рассматриваемых точек SNR, работающих на основе подкадра за подкадром:
Матрица предварительного кодирования (формирования луча) вычисляется из совершенной оценки канала.
Формируют заполненную сетку ресурсов и модулируют OFDM для создания сигнала для передачи.
Сформированный сигнал пропускают через шумовой канал замирания.
Выполняются операции приемника (оценка канала, выравнивание, демодуляция и декодирование).
Пропускная способность PDSCH определяется с использованием результата блочного CRC на выходе канального декодера.
A parfor может использоваться вместо for цикл для вычисления SNR. Это указано в примере. parfor оператор является частью панели инструментов параллельных вычислений и выполняет циклы SNR параллельно, чтобы сократить общее время моделирования.
Пример выполняется для длины моделирования NFrames = 2 кадра для нескольких точек SNR. Большое количество NFrames следует использовать для получения значимых результатов по производительности. SNRIn может быть массивом значений или скаляром. Некоторые ТМ и некоторые схемы модуляции являются более устойчивыми к помехам и ухудшениям канала, чем другие, поэтому различные значения SNR могут быть использованы для различных наборов параметров.
NFrames = 2; % Number of frames SNRIn = [-4 1]; % SNR range in dB
Набор общих параметров для всех ТМ первоначально определен, они включают в себя полосу пропускания, требуемую кодовую скорость, схему модуляции и выделенный набор блоков ресурсов. Отсутствие указания номера RMC гарантирует, что все подкадры нисходящей линии связи запланированы. Если задан RMC (например, «R.0»), планирование подкадров определяется в TS 36.101 [1].
Переменная txMode выбирает TM с помощью оператора switch. Для каждой ТМ указываются требуемые параметры. В этом примере декодирование формата DCI не выполняется, поэтому DCIFormat поле не является строго необходимым. Однако, поскольку формат DCI тесно связан с TM, он включен для полноты.
Для целей этого примера TM9 и TM10 одинаковы, за исключением формата DCI, однако они разделены в операторе switch для полноты.
После определения основного набора параметров вызов lteRMCDL необходима для полного заполнения структуры параметров нисходящей линии связи enb.
simulationParameters = []; % clear simulationParameters simulationParameters.NDLRB = 50; simulationParameters.PDSCH.TargetCodeRate = 0.5; simulationParameters.PDSCH.Modulation = {'16QAM'}; simulationParameters.PDSCH.PRBSet = (0:9)'; txMode = 'TM8'; % TM7, TM8, TM9, TM10 DuplexMode = 'TDD'; % 'FDD', 'TDD' switch txMode case 'TM7' % single layer (Port 5) simulationParameters.PDSCH.DCIFormat = 'Format1'; simulationParameters.PDSCH.TxScheme = 'Port5'; simulationParameters.PDSCH.NLayers = 1; ntxants = 4; case 'TM8' % up to two layers (dual layer Port 7-8, or single antenna % port, port 7 or 8) simulationParameters.PDSCH.DCIFormat = 'Format2B'; simulationParameters.PDSCH.TxScheme = 'Port7-8'; %'Port7-8','Port8' simulationParameters.PDSCH.NLayers = 2; ntxants = 4; simulationParameters.PDSCH.NSCID = 0; case 'TM9' % up to eight layers (up to eight layers Port 7-14 or single % antenna port, port 7 or 8) simulationParameters.PDSCH.DCIFormat = 'Format2C'; simulationParameters.PDSCH.TxScheme = 'Port7-14'; simulationParameters.PDSCH.NLayers = 4; ntxants = 8; simulationParameters.CSIRefP = ntxants; case 'TM10' % up to eight layers (up to eight layers Port 7-14 or % single antenna port, port 7 or 8) simulationParameters.PDSCH.DCIFormat = 'Format2D'; simulationParameters.PDSCH.TxScheme = 'Port7-14'; simulationParameters.PDSCH.NLayers = 4; ntxants = 8; simulationParameters.CSIRefP = ntxants; otherwise error('Transmission mode should be one of TM7, TM8, TM9 or TM10.') end
Размер матрицы предварительного кодирования W (матрица формирования луча) NLayers около- ntxants. Количество передающих антенн взято из W в последующих вызовах функции панели инструментов. Количество приемных антенн указывается далее как часть канала распространения.
% Initialize W to zero
simulationParameters.PDSCH.W = zeros(simulationParameters.PDSCH.NLayers, ntxants);
Установите режим дуплексирования и укажите количество подкадров равным 1. Код генерирует один подкадр за один раз до полного NFrames генерируются.
simulationParameters.DuplexMode = DuplexMode; simulationParameters.TotSubframes = 1;
Звонить lteRMCDL для генерации параметров eNeyB по умолчанию, не указанных в simulationParameters. Они потребуются позже для генерации формы сигнала с использованием lteRMCDLTool.
enb = lteRMCDL(simulationParameters);
Продукция enb структура содержит, помимо других полей, размеры транспортного блока и последовательность версий избыточности для каждого подкадра кодового слова в кадре. Они используются позже в моделировании.
trBlkSizes = enb.PDSCH.TrBlkSizes; rvSequence = enb.PDSCH.RVSeq;
Количество кодовых слов, ncw, - количество записей в enb.PDSCH.Modulation поле.
ncw = length(string(enb.PDSCH.Modulation));
Распечатайте сводку некоторых наиболее релевантных параметров моделирования. Подтвердите выравнивание параметров с ожидаемыми значениями. Отображаемая скорость кодирования может быть полезна для обнаружения проблем при указании вручную размеров транспортного блока. Типичными значениями являются 1/3, 1/2 и 3/4.
hDisplayENBParameterSummary(enb, txMode);
-- Parameter summary: --------------------------------------------
Duplexing mode: TDD
Transmission mode: TM8
Transmission scheme: Port7-8
Number of downlink resource blocks: 50
Number of allocated resource blocks: 10
Cell-specific reference signal ports: 1
Number of transmit antennas: 4
Transmission layers: 2
Number of codewords: 1
Modulation codeword 1: 16QAM
Transport block sizes codeword 1: 4584 4008 0 0 4584 4584 4008 0 0 4584
Code rate codeword 1: 0.5053 0.4941 0 0 0.5053 0.5053 0.4941 0 0 0.5053
------------------------------------------------------------------
Структура channel содержит параметры конфигурации модели канала.
channel = struct; % Channel config structure channel.Seed = 6; % Channel seed channel.NRxAnts = 8; % Number of receive antennas channel.DelayProfile ='EPA'; % Delay profile channel.DopplerFreq = 5; % Doppler frequency channel.MIMOCorrelation = 'Low'; % Multi-antenna correlation channel.NTerms = 16; % Oscillators used in fading model channel.ModelType = 'GMEDS'; % Rayleigh fading model type channel.InitPhase = 'Random'; % Random initial phases channel.NormalizePathGains = 'On'; % Normalize delay profile power channel.NormalizeTxAnts = 'On'; % Normalize for transmit antennas % The channel sampling rate depends on the FFT size used in the OFDM % modulator. This can be obtained using the function lteOFDMInfo. ofdmInfo = lteOFDMInfo(enb); channel.SamplingRate = ofdmInfo.SamplingRate;
Определите структуру конфигурации блока оценки канала. Поскольку используются не основанные на кодовой книге ТМ, установите DMRS в качестве опорного сигнала для оценки канала.
cec = struct; % Channel estimation config structure cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 41; % Frequency window size cec.TimeWindow = 27; % Time window size cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size cec.Reference = 'DMRS'; % Use DMRS as reference signal
Переменная displaySimulationInformation управляет отображением информации моделирования, такой как идентификатор процесса HARQ, используемый для каждого подкадра. В случае ошибки CRC также отображается значение индекса для RV-последовательности.
displaySimulationInformation = true;
Для определения пропускной способности в каждой точке SNR подкадр по подкадрам цепочки обработки PDSCH включает в себя:
Вычисление матрицы предварительного кодирования - для вычисления матрицы предварительного кодирования используется совершенная оценка канала. Процесс расчета несколько отличается между FDD и TDD. Подробное описание этого шага приводится в следующем разделе.
Обновление текущего процесса HARQ - процесс HARQ либо несет новые транспортные данные, либо повторно передает ранее отправленные транспортные данные в зависимости от подтверждения (ACK) или отрицательного подтверждения (NACK) на основе результатов CRC. Все это обрабатывается планировщиком HARQ, hHARQScheduling. Данные PDSCH обновляются на основе состояния HARQ.
Создание сигнала передачи - передача данных, генерируемых процессом HARQ, в lteRMCDLTool для получения модулированного сигнала OFDM, содержащего физические каналы и сигналы.
Моделирование шумового канала - пропускает сигнал через канал замирания и добавляет шум (AWGN).
Выполнение синхронизации и демодуляции OFDM - смещение принятых символов для учета комбинации задержки реализации и расширения задержки канала. OFDM демодулируют символы.
Выполнение оценки канала - оценка отклика канала и уровня шума. Используйте эти оценки для декодирования PDSCH.
Декодирование PDSCH - получение оценки принятых кодовых слов с использованием ltePDSCHDecode демодулировать и дескремблировать восстановленные символы PDSCH для всех пар антенн передачи и приема.
Декодирование общего канала нисходящей линии связи (DL-SCH) и сохранение ошибки блочного CRC для процесса HARQ - передача вектора декодированных мягких битов в lteDLSCHDecode, которая декодирует кодовое слово и возвращает ошибку блочного CRC, используемую для определения пропускной способности системы. Содержимое нового мягкого буфера, harqProc(harqID).decState, доступен на выходе этой функции для использования при декодировании следующего подкадра.
Поскольку ТМ, не основанные на кодовой книге, моделируются, матрица предварительного кодирования (формирования луча) должна быть вычислена, которая основана на оценке канала. Для простоты предполагается совершенное знание канала.
На рисунке показана синхронизация, связанная с оценкой канала, матрицей предварительного кодирования. W вычисление и предварительное кодирование для режимов FDD и TDD.
Для TDD (структура кадра конфигурации 1 восходящей линии связи-нисходящей линии связи) канал оценивается в последнем подкадре UL перед подкадром DL. Эта оценка канала используется для вычисления матрицы предварительного кодирования. W. Все последующие подкадры DL (включая специальные подкадры) до следующего подкадра UL предварительно кодируются этой матрицей W.
Для FDD существует задержка одного подкадра между вычислениями матрицы предварительного кодирования. W и подкадр, где он используется. Например, матрица предварительного кодирования, используемая в подкадре n был вычислен с оценкой канала, полученной в подкадре n-1, как показано на рисунке.

Функция hCalculatePrecodingMatrix вычисляет W около:
Получение совершенной оценки канала для рассматриваемого подкадра
Усреднение оценок канала для всех выделенных RB
Вычисление разложения сингулярного значения и извлечение первого NLayers для получения вектора предварительного кодирования.
При необходимости другой расчет или значение W может использоваться здесь вместо вызова hCalculatePrecodingMatrix.
На этом рисунке показан процесс усреднения оценки канала и W расчет.

Изображенный процесс показывает, как оценка матрицы одного канала, H, получают из всего набора выделенных блоков ресурсов путем усреднения во времени и частоте. Используя эту оценку канала, Hматрица предварительного кодирования, W, получают путем разложения сингулярных значений.
Следует отметить, что для выделения одного блока ресурсов матрица предварительного кодирования W обычно будет хорошо соответствовать условиям канала с небольшим отклонением от оптимального предварительного кодирования. Но по мере увеличения размера выделения матрица предварительного кодирования учитывает среднее из условий канала по всему выделению. Это усреднение вызывает отклонение от оптимальной матрицы предварительного кодирования. Поэтому можно ожидать снижения производительности по мере увеличения объема выделяемых ресурсов.
Цикл «for» для обработки точек SNR включен ниже. Чтобы разрешить использование параллельных вычислений для увеличения скорости, используйте «parfor» вместо «for» в цикле. Для этого требуется панель инструментов параллельных вычислений. Если этот параметр не установлен, по умолчанию будет использоваться обычный оператор for. Если используется parfor, рекомендуется, чтобы переменная displaySimulationInformation выше установлено значение false, в противном случае информация моделирования для каждой точки SNR будет перекрываться.
% Initialize variables used in the simulation and analysis % Array to store the maximum throughput for all SNR points maxThroughput = zeros(length(SNRIn),1); % Array to store the simulation throughput for all SNR points simThroughput = zeros(length(SNRIn),1); % Array to store RV sequence index history allRvSeqIdxHistory = cell(1,numel(SNRIn)); % Copy of channel structure to optimize parallel processing (only if % running the example with Parallel Computing Toolbox) channelInit = channel; % During simulation some fields of enb will be updated, make a copy to % reinitialize it when simulating each SNR point enbInit = enb; % For TDD precalculate vector of subframe types: D, S and U for downlink, % special and uplink respectively if strcmpi(DuplexMode,'TDD') subframeType = char(10,1); initialSubframeNo = enb.NSubframe; for sNo=0:9 % for all subframes in a frame enb.NSubframe = sNo; duplexInfo = lteDuplexingInfo(enb); subframeType(sNo+1) = duplexInfo.SubframeType(1); % first char: D, S or U end enb.NSubframe = initialSubframeNo; end % CFI can be a scalar or a vector, create a local copy of CFI as a vector % (one value per subframe) if numel(enb.CFI) == 1 CFI = repmat(enb.CFI,1,10); else CFI = enb.CFI; end % Get the HARQ ID sequence for HARQ processing. This is a list of indices % for HARQ process scheduling. [~,~,enbOut] = lteRMCDLTool(enb, []); harqProcessSequenceInit = enbOut.PDSCH.HARQProcessSequence; for snrIdx = 1:numel(SNRIn) % comment out for parallel computing %parfor snrIdx = 1:numel(SNRIn) % uncomment for parallel computing % Set the random number generator seed depending on the loop variable % to ensure independent random streams rng(snrIdx,'combRecursive'); % Reinitialize variables (they are modified during each SNR point % simulation) enb = enbInit; channel = channelInit; harqProcessSequence = harqProcessSequenceInit; % Initialize the state of all HARQ processes harqProcesses = hNewHARQProcess(enb); % Set up variables for the main loop lastOffset = 7; % Initialize overall frame timing offset % (set equal to channel implementation delay) frameOffset = 7; % Initialize frame timing offset % (set equal to channel implementation delay) blkCRC = []; % Block CRC for all considered subframes bitTput = []; % Number of successfully received bits per subframe txedTrBlkSizes = []; % Number of transmitted bits per subframe precodingMatrix = []; % Precoding matrix rxSymbols = []; % DL-SCH symbols for constellation plot (codeword 1) rxSymbols2 = []; % DL-SCH symbols for constellation plot (codeword 2) % The variable rvSeqIdxHistory stores the history of the value of the % RV index sequence for all the HARQ processes rvSeqIdxHistory = nan(ncw, NFrames*10); % Flag to indicate if a precoding matrix W is available. This is useful % if no W has been calculated at the beginning of the simulation. isWready = false; % Flag to indicate is a subframe is to be processed. Set to true if % there is data to be processed in the subframe, i.e. DL subframe or % non-zero transport block size. processSubframe = false; % Main for loop: for all subframes for subframeNo = 0:(NFrames*10-1) % Update subframe number enb.NSubframe = subframeNo; % Load CFI for current subframe enb.CFI = CFI(mod(subframeNo,length(CFI))+1); % Channel time for the current subframe channel.InitTime = subframeNo/1000; % Get HARQ process ID for the subframe from HARQ process sequence harqID = harqProcessSequence(mod(subframeNo, length(harqProcessSequence))+1); % Extract the current subframe transport block size(s) trBlk = trBlkSizes(:, mod(subframeNo, 10)+1).'; % Load precoding matrix calculated in previous subframe if it % exists and if there is data to transmit. Set the flag to trigger % subframe processing. if isWready && any(trBlk) harqProcesses(harqID).txConfig.W = precodingMatrix; processSubframe = true; else processSubframe = false; end % Precoding matrix calculation if strcmpi(DuplexMode,'TDD') % Estimate channel in UL subframe if strcmp(subframeType(mod(subframeNo,10)+1),'U') processSubframe = false; % UL subframe, no DL data % Only perform channel estimate if next subframe is DL if strcmp(subframeType(mod((subframeNo+1),10)+1),'D') precodingMatrix = hCalculatePrecodingMatrix(enb, channel); isWready = true; end end else %FDD % Get transport block for next subframe trBlkNext = trBlkSizes(:, mod(subframeNo+1, 10)+1).'; % Calculate the precoding matrix for next subframe only if it % carries data (i.e. non-zero trBlkNext) if any(trBlkNext) precodingMatrix = hCalculatePrecodingMatrix(enb, channel); isWready = true; else isWready = false; end end % Subframe processing if processSubframe % Update current HARQ process harqProcesses(harqID) = hHARQScheduling( ... harqProcesses(harqID), subframeNo, rvSequence); % Display run time information if displaySimulationInformation && any(trBlk) disp(' '); disp(['Subframe: ' num2str(subframeNo) '. HARQ process index: ' num2str(harqID)]); end % Update RV sequence index table rvSeqIdxHistory(:,subframeNo+1) = ... harqProcesses(harqID).txConfig.RVIdx.'; % Update the PDSCH transmission configuration with HARQ % process state enb.PDSCH = harqProcesses(harqID).txConfig; % Cell payload dlschTransportBlk = harqProcesses(harqID).data; % Create transmit waveform txWaveform = lteRMCDLTool(enb, dlschTransportBlk); % Add 25 sample padding. This is to cover the range of delays % expected from channel modeling (a combination of % implementation delay and channel delay spread) txWaveform = [txWaveform; zeros(25, ntxants)]; %#ok<AGROW> % Pass data through channel model rxNoiselessWaveform = lteFadingChannel(channel,txWaveform); % Calculate noise gain including compensation for downlink % power allocation SNR = 10^((SNRIn(snrIdx)-enb.PDSCH.Rho)/20); % Normalize noise power to take account of sampling rate, % which is a function of the IFFT size used in OFDM % modulation, and the number of antennas N0 = 1/(sqrt(2.0*ntxants*double(ofdmInfo.Nfft))*SNR); % Create additive white Gaussian noise noise = N0*complex(randn(size(rxNoiselessWaveform)),... randn(size(rxNoiselessWaveform))); % Add AWGN to the received time domain waveform and scale % for required power rxWaveform = rxNoiselessWaveform + noise; % Receiver % Once every frame, on subframe 0, calculate a new % synchronization offset. An offset within the range of % delays expected from the channel modeling (a combination % of implementation delay and channel delay spread) % indicates success if (mod(subframeNo,10)==0) frameOffset = lteDLFrameOffset(enb,rxWaveform); if (frameOffset > 25) frameOffset = lastOffset; end lastOffset = frameOffset; end rxWaveform = rxWaveform(1+frameOffset:end,:); % Perform OFDM demodulation on the received data to obtain % the resource grid rxSubframe = lteOFDMDemodulate(enb,rxWaveform); % Channel estimation [estChannelGrid,noiseEst] = ... lteDLChannelEstimate(enb,enb.PDSCH,cec,rxSubframe); % Perform equalization, deprecoding, layer demapping, % demodulation and descrambling on the received data using the % channel estimate. % Get PDSCH indices pdschIndices = ltePDSCHIndices(enb,enb.PDSCH,enb.PDSCH.PRBSet); % Get PDSCH resource elements. Scale the received subframe % by the PDSCH power factor Rho. The PDSCH is scaled by % Rho, while the cell reference symbols used for channel % estimation (used in the PDSCH decoding stage) are not. [pdschRx, pdschHest] = lteExtractResources(pdschIndices, ... rxSubframe*(10^(-enb.PDSCH.Rho/20)),estChannelGrid); % Decode PDSCH [dlschBits,dlschSymbols] = ltePDSCHDecode(enb,enb.PDSCH,... pdschRx,pdschHest,noiseEst); % Store the decoded DLSCH symbols for constellation % plotting rxSymbols = [rxSymbols; dlschSymbols{1}(:)]; %#ok<AGROW> if ncw>1 rxSymbols2 = [rxSymbols2; dlschSymbols{2}(:)]; %#ok<AGROW> end % Decode the DL-SCH [decbits,harqProcesses(harqID).blkerr,harqProcesses(harqID).decState] = ... lteDLSCHDecode(enb,enb.PDSCH,trBlk,dlschBits, ... harqProcesses(harqID).decState); % Display block errors if displaySimulationInformation if any(harqProcesses(harqID).blkerr) disp(['Block error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx) ', CRC: ' num2str(harqProcesses(harqID).blkerr)]) else disp(['No error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx) ', CRC: ' num2str(harqProcesses(harqID).blkerr)]) end end % Store values needed to calculate throughput % Only for subframes with data if(any(trBlk)) blkCRC = [blkCRC harqProcesses(harqID).blkerr]; %#ok<AGROW> bitTput = [bitTput trBlk.*(1- ... harqProcesses(harqID).blkerr)]; %#ok<AGROW> txedTrBlkSizes = [txedTrBlkSizes trBlk]; %#ok<AGROW> end end end % Plot received symbol constellation if displaySimulationInformation figure;plot(rxSymbols,'.r'); title(['Received constellation. SNR ' ... num2str(SNRIn(snrIdx)) ' dB. Codeword 1']) xlabel('In-phase Amplitude'); ylabel('Quadrature Amplitude'); if ncw>1 figure;plot(rxSymbols2,'.r'); title(['Received constellation. SNR ' ... num2str(SNRIn(snrIdx)) ' dB. Codeword 2']) xlabel('In-phase Amplitude'); ylabel('Quadrature Amplitude'); end end % Calculate the maximum and simulated throughput maxThroughput(snrIdx) = sum(txedTrBlkSizes); % Max possible throughput simThroughput(snrIdx) = sum(bitTput,2); % Simulated throughput % Display the results dynamically in the command window fprintf('\nSNR = %.2f dB. Throughput for %d Frame(s) = %.4f Mbps\n',... SNRIn(snrIdx),NFrames,1e-6*simThroughput(snrIdx)/(NFrames*10e-3)); fprintf('SNR = %.2f dB. Throughput(%%) for %d Frame(s) = %.4f %%\n',... SNRIn(snrIdx),NFrames,simThroughput(snrIdx)*100/maxThroughput(snrIdx)); allRvSeqIdxHistory{snrIdx} = rvSeqIdxHistory; end
Subframe: 4. HARQ process index: 3 Block error. RV index: 1, CRC: 1 Subframe: 5. HARQ process index: 4 Block error. RV index: 1, CRC: 1 Subframe: 6. HARQ process index: 5 Block error. RV index: 1, CRC: 1 Subframe: 9. HARQ process index: 6 Block error. RV index: 1, CRC: 1 Subframe: 10. HARQ process index: 7 Block error. RV index: 1, CRC: 1 Subframe: 11. HARQ process index: 2 Block error. RV index: 1, CRC: 1 Subframe: 14. HARQ process index: 1 Block error. RV index: 1, CRC: 1 Subframe: 15. HARQ process index: 3 No error. RV index: 2, CRC: 0 Subframe: 16. HARQ process index: 5 No error. RV index: 2, CRC: 0 Subframe: 19. HARQ process index: 4 No error. RV index: 2, CRC: 0 SNR = -4.00 dB. Throughput for 2 Frame(s) = 0.6588 Mbps SNR = -4.00 dB. Throughput(%) for 2 Frame(s) = 29.8694 % Subframe: 4. HARQ process index: 3 No error. RV index: 1, CRC: 0 Subframe: 5. HARQ process index: 4 No error. RV index: 1, CRC: 0 Subframe: 6. HARQ process index: 5 No error. RV index: 1, CRC: 0 Subframe: 9. HARQ process index: 6 No error. RV index: 1, CRC: 0 Subframe: 10. HARQ process index: 7 No error. RV index: 1, CRC: 0 Subframe: 11. HARQ process index: 2 No error. RV index: 1, CRC: 0 Subframe: 14. HARQ process index: 1 No error. RV index: 1, CRC: 0 Subframe: 15. HARQ process index: 3 No error. RV index: 1, CRC: 0 Subframe: 16. HARQ process index: 5 No error. RV index: 1, CRC: 0 Subframe: 19. HARQ process index: 4 No error. RV index: 1, CRC: 0 SNR = 1.00 dB. Throughput for 2 Frame(s) = 2.2056 Mbps SNR = 1.00 dB. Throughput(%) for 2 Frame(s) = 100.0000 %


Приведенный ниже код создает графики со значением индексов для элементов в последовательности RV для моделируемых подкадров. Это дает представление о необходимых повторных передачах. Причина построения индексов вместо значений RV заключается в том, что последние не могут быть организованы в порядке возрастания. Например, в некоторых случаях последовательность RV может быть [0, 2, 3, 1]. Построение графика этих значений по мере их использования не дает четкого представления о количестве необходимых повторных передач.
При передаче нового транспортного блока используется первый элемент последовательности RV, и для этого подкадра показано значение 1. Это происходит в начале моделирования. Если требуется повторная передача, выбирается следующий элемент в последовательности RV и индекс увеличивается. Значение 2 будет нанесено на график для подкадра, где происходит повторная передача. Если требуются дальнейшие повторные передачи, значение индекса будет дополнительно увеличиваться. Графики не показывают никакого значения в подкадре 5 последовательных кадров. Это происходит потому, что в этих подкадрах не передаются данные для настройки, используемой в этом примере.
hPlotRVSequence(SNRIn,allRvSeqIdxHistory,NFrames);


Результаты по пропускной способности отображаются в окне команд MATLAB ® после завершения каждой точки SNR. Они также фиксируются в выходных массивахsimThroughput и maxThroughput. simThroughput сохраняет измеренную пропускную способность в количестве битов для всех моделируемых точек SNR. maxThroughput сохраняет максимально возможную пропускную способность в количестве битов для каждой моделируемой точки SNR.
% Plot throughput figure legendString = [char(txMode) ': ' num2str(simulationParameters.PDSCH.NLayers) ... ' layer(s), ' num2str(ntxants) ' ant(s)']; plot(SNRIn, simThroughput*100./maxThroughput,'*-.'); xlabel('SNR (dB)'); ylabel('Throughput (%)'); title('Throughput vs SNR'); legend(legendString,'Location','NorthWest'); grid on;

Для статистически достоверных результатов моделирование должно выполняться для большего числа кадров. На рисунке ниже сравниваются результаты по пропускной способности для TDD и FDD при моделировании 1000 кадров.


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