Этот пример показов, как измерить физическую пропускную способность общего канала восходящей линии связи (PUSCH) 5G ссылки New Radio (NR), как определено стандартом 3GPP NR. Пример реализует PUSCH и транспортный канал восходящей линии связи (UL-SCH). Модель передатчика включает в себя опорные символы демодуляции PUSCH (DM-RS). Пример поддерживает как кластеризованную линию задержки (CDL), так и отработанные каналы задержки (TDL) распространения. Можно выполнить совершенную или практичную синхронизацию и оценку канала. Чтобы уменьшить общее время симуляции, можно выполнять точки ОСШ в цикле ОСШ параллельно с помощью Parallel Computing Toolbox™.
Этот пример измеряет пропускную способность PUSCH 5G ссылки, как определено 3GPP стандартом NR [1], [2], [3], [4].
Моделируются следующие 5G функции NR:
Кодирование транспортного канала UL-SCH
PUSCH и PUSCH DM-RS генерация
Переменный интервал между поднесущими и числовые системы координат (2 ^ n * 15kHz)
Нормальный и расширенный циклический префикс
Модели каналов распространения TDL и CDL
Другими функциями симуляции являются:
Схемы передачи PUSCH на основе кодовой книги и некодовой книги
Опциональное предварительное кодирование преобразования PUSCH
Slot wise и non slot wise PUSCH и DM-RS отображение
Совершенная или практичная синхронизация и оценка канала
HARQ- операции с 16 процессами
На рисунке ниже показана реализованная цепь обработки. Для ясности, генерация DM-RS была опущена.
Обратите внимание, что этот пример не включает в себя адаптацию с обратной связью предварительного кодирования MIMO в соответствии с условиями канала. Предварительное кодирование PUSCH MIMO, используемое в примере, является следующим:
Для передачи на основе кодовой книги матрица предварительного кодирования MIMO, используемая в модуляции PUSCH, может быть выбрана с использованием параметра TPMI.
Матрица предварительного кодирования MIMO (для передачи, основанной на некодовой книге, или предварительное кодирование MIMO между портами антенны передачи и антеннами для передачи, основанной на кодовой книге) является матрицей тождеств.
Чтобы уменьшить общее время симуляции, можно использовать Parallel Computing Toolbox, чтобы выполнять точки ОСШ цикла ОСШ параллельно.
Установите длину симуляции в терминах количества систем координат 10 мс. Большое количество NFrames должно использоваться, чтобы получить значимые результаты пропускной способности. Установите точки ОСШ для моделирования. ОСШ определяется по RE и применяется к каждой приемной антенне.
simParameters = []; % Clear simParameters variable simParameters.NFrames = 2; % Number of 10ms frames simParameters.SNRIn = [-5 0 5]; % SNR range (dB)
Переменная displaySimulationInformation
управляет отображением симуляции информации, такой как идентификатор процесса HARQ, используемый для каждого подкадра. В случае ошибки CRC также отображается значение индекса для RV-последовательности.
displaySimulationInformation = true;
Логическая переменная perfectChannelEstimator
управляет оценкой канала и поведением синхронизации. Когда установлено значение true
Используют идеальную оценку канала и синхронизацию. В противном случае используют практическую оценку и синхронизацию канала на основе значений принятого PUSCH DM-RS.
perfectChannelEstimator = true;
Установите ключевые параметры симуляции. К ним относятся:
Пропускная способность в ресурсных блоках (12 поднесущих на ресурсный блок)
Интервал между поднесущими: 15, 30, 60, 120, 240 (кГц)
Длина циклического префикса: normal или extended
Идентификатор камеры
Количество передающих и приемных антенн
Также задается подструктура, содержащая параметры UL-SCH и PUSCH. Это включает в себя:
Целевая скорость кода
Выделенные ресурсные блоки (PRBSet)
Схема модуляции: 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', '256QAM'.
Количество слоев
Прекодирование преобразования (включение/отключение)
Схема передачи PUSCH и индикация матрицы предварительного кодирования MIMO (TPMI)
Количество портов антенны
Тип отображения PUSCH
Параметры конфигурации DM-RS
Другими параметрами широкой симуляции являются:
Модель канала распространения: 'TDL' или 'CDL' apos;
Обратите внимание, что если предварительное кодирование преобразования включено, количество слоев должно быть установлено на 1.
% Bandwidth, numerology (SCS and CP type) and other general parameters simParameters.NRB = 52; % Bandwidth in number of resource blocks (52RBs at 15kHz SCS for 10MHz BW) simParameters.SubcarrierSpacing = 15; % 15, 30, 60, 120, 240 (kHz) simParameters.CyclicPrefix = 'Normal'; % 'Normal' or 'Extended' simParameters.NCellID = 0; % Cell identity simParameters.NTxAnts = 1; % Number of transmit antennas simParameters.NRxAnts = 2; % Number of receive antennas % UL-SCH/PUSCH parameters simParameters.PUSCH.TargetCodeRate = 193 / 1024; % Code rate used to calculate transport block sizes simParameters.PUSCH.PRBSet = (0:simParameters.NRB-1); % PUSCH PRB allocation simParameters.PUSCH.SymbolSet = 0:13; % PUSCH symbol allocation in each slot simParameters.PUSCH.NohPRB = 0; % Additional RE overhead per PRB simParameters.PUSCH.EnableHARQ = true; % Enable/disable HARQ, if disabled, single transmission with RV=0, i.e. no retransmissions simParameters.PUSCH.Modulation = 'QPSK'; % 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', '256QAM' simParameters.PUSCH.NLayers = 1; % Number of PUSCH layers simParameters.PUSCH.RNTI = 1; % Radio Network Temporary Identifier simParameters.PUSCH.TransformPrecoding = false; % Enable/disable transform precoding simParameters.PUSCH.TxScheme = 'nonCodebook'; % Transmission scheme ('nonCodebook','codebook') simParameters.PUSCH.NAntennaPorts = 1; % Number of antenna ports for codebook based precoding simParameters.PUSCH.TPMI = 0; % Precoding matrix indicator for codebook based precoding % PUSCH DM-RS configuration simParameters.PUSCH.PUSCHMappingType = 'A'; % PUSCH mapping type ('A'(slot-wise),'B'(non slot-wise)) simParameters.PUSCH.DMRSTypeAPosition = 2; % Mapping type A only. First DM-RS symbol position (2,3) simParameters.PUSCH.DMRSLength = 1; % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol)) simParameters.PUSCH.DMRSAdditionalPosition = 1; % Additional DM-RS symbol positions (max range 0...3) simParameters.PUSCH.DMRSConfigurationType = 1; % DM-RS configuration type (1,2) simParameters.PUSCH.NumCDMGroupsWithoutData = 2; % CDM groups without data simParameters.PUSCH.NIDNSCID = 0; % Scrambling identity (0...65535) simParameters.PUSCH.NSCID = 0; % Scrambling initialization (0,1) simParameters.PUSCH.NRSID = 0; % Scrambling ID for low-PAPR sequences (0...1007) simParameters.PUSCH.GroupHopping = 'Disable'; % Hopping type ('Enable','Disable') % Define the propagation channel type simParameters.ChannelType = 'TDL'; % 'CDL' or 'TDL'
Создайте объект строения поставщика услуг carrier
и структуру строения PUSCH pusch
.
carrier = nrCarrierConfig; carrier.SubcarrierSpacing = simParameters.SubcarrierSpacing; carrier.CyclicPrefix = simParameters.CyclicPrefix; carrier.NSizeGrid = simParameters.NRB; carrier.NCellID = simParameters.NCellID; pusch = simParameters.PUSCH;
Для ключевых параметров симуляции задайте локальные переменные для удобства.
snrIn = simParameters.SNRIn; nTxAnts = simParameters.NTxAnts; nRxAnts = simParameters.NRxAnts; channelType = simParameters.ChannelType;
Создайте объект модели канала. Поддерживаются модели каналов CDL и TDL [5].
if strcmpi(channelType,'CDL') channel = nrCDLChannel; channel.DelayProfile = 'CDL-A'; [txsize,rxsize] = hArrayGeometry(nTxAnts,nRxAnts,'uplink'); channel.TransmitAntennaArray.Size = txsize; channel.ReceiveAntennaArray.Size = rxsize; else channel = nrTDLChannel; channel.DelayProfile = 'TDL-A'; channel.NumTransmitAntennas = nTxAnts; channel.NumReceiveAntennas = nRxAnts; end channel.DelaySpread = 30e-9; % in seconds channel.MaximumDopplerShift = 10; % in Hz
Частота дискретизации для модели канала устанавливается с использованием значения, возвращенного из nrOFDMInfo.
waveformInfo = nrOFDMInfo(carrier); channel.SampleRate = waveformInfo.SampleRate;
Получите максимальное количество задержанных выборок компонентом многолучевого распространения канала. Это вычисляется из пути с наибольшей задержкой и задержкой реализации фильтра канала. Это требуется позже, чтобы промыть фильтр канала, чтобы получить принятый сигнал.
chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)); maxChDelay = maxChDelay + chInfo.ChannelFilterDelay;
Чтобы определить пропускную способность в каждой точке ОСШ, данные PUSCH анализируются по образцу передачи с помощью следующих шагов:
Обновление текущего процесса HARQ. Проверьте CRC предыдущей передачи для данного процесса HARQ. Определите, требуется ли повторная передача. Если это не так, сгенерируйте новые данные.
Сгенерируйте ресурсную сетку. Кодирование канала выполняется nrULSCH
. Он действует на входе предусмотренном транспортном блоке. Внутренне он хранит копию транспортного блока в случае необходимости повторной передачи. Кодированные биты модулируются nrPUSCH
. Специфическое для реализации предварительное кодирование MIMO применяется к полученному сигналу. Обратите внимание, что если TxScheme='codebook'
, предварительное кодирование MIMO на основе кодовой книги уже будет применено внутри nrPUSCH
и предварительное кодирование MIMO для конкретной реализации является дополнительным этапом предварительного кодирования MIMO.
Сгенерируйте форму волны. Сгенерированная сетка затем модулируется OFDM.
Моделируйте зашумленный канал. Форма волны передается через канал CDL или TDL с замираниями. Добавлен AWGN. ОСШ для каждого слоя задается для RE и каждой приемной антенны.
Выполните синхронизацию и демодуляцию OFDM. Для идеальной синхронизации импульсная характеристика канала восстанавливается и используется, чтобы синхронизировать принятую форму волны. Для практической синхронизации принятая форма волны коррелирует с PUSCH DM-RS. Синхронизированный сигнал затем демодулируется OFDM.
Выполните оценку канала. Если используется совершенная оценка канала, импульсная характеристика канала восстанавливается и OFDM демодулируется, чтобы обеспечить оценку канала. Для практической оценки канала используется PUSCH DM-RS.
Извлеките PUSCH и выполните эквализацию. Ресурсные элементы, соответствующие выделению PUSCH, извлекаются из принятой ресурсной сетки OFDM и оценки канала с помощью nrExtractResources
. Полученные ресурсные элементы PUSCH затем выравниваются MMSE с помощью nrEqualizeMMSE
.
Декодируйте PUSCH. Выравниваемые символы PUSCH вместе с оценкой шума демодулируются и дескремблируются nrPUSCHDecode
для получения оценки принятых кодовых слов.
Декодируйте общий канал восходящей линии связи (UL-SCH) и сохраните ошибку CRC блока для процесса HARQ. Вектор декодированных мягких бит передается в nrULSCHDecoder
который декодирует кодовое слово и возвращает ошибку CRC блока, используемую для определения пропускной способности системы.
% 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); % Set up Redundancy Version (RV) sequence, number of HARQ processes and % the sequence in which the HARQ processes are used if pusch.EnableHARQ % From PUSCH demodulation requirements in RAN WG4 meeting #88bis % (R4-1814062) rvSeq = [0 2 3 1]; else % HARQ disabled - single transmission with RV=0, no retransmissions rvSeq = 0; end % Create UL-SCH encoder System object encodeULSCH = nrULSCH; encodeULSCH.MultipleHARQProcesses = true; encodeULSCH.TargetCodeRate = pusch.TargetCodeRate; % Create UL-SCH decoder System object % Use layered belief propagation for LDPC decoding, with half the number of % iterations as compared to the default for belief propagation decoding decodeULSCH = nrULSCHDecoder; decodeULSCH.MultipleHARQProcesses = true; decodeULSCH.TargetCodeRate = pusch.TargetCodeRate; decodeULSCH.LDPCDecodingAlgorithm = 'Layered belief propagation'; decodeULSCH.MaximumLDPCIterationCount = 6; % The temporary variables 'carrier_init', 'pusch_init' and % 'decodeULSCH_init' are used to create the temporary variables 'carrier', % 'pusch' and 'decodeULSCH' within the SNR loop to create independent % instances in case of parallel simulation carrier_init = carrier; pusch_init = pusch; decodeULSCH_init = clone(decodeULSCH); % Get the values of 'NFrames' to avoid overhead in case of parallel % simulation NFrames = simParameters.NFrames; for snrIdx = 1:numel(snrIn) % comment out for parallel computing % parfor snrIdx = 1:numel(snrIn) % uncomment for parallel computing % To reduce the total simulation time, you can execute this loop in % parallel by using the Parallel Computing Toolbox. Comment out the 'for' % statement and uncomment the 'parfor' statement. If the Parallel Computing % Toolbox is not installed, 'parfor' defaults to normal 'for' statement. % Because parfor-loop iterations are executed in parallel in a % nondeterministic order, the simulation information displayed for each SNR % point can be intertwined. To switch off simulation information display, % set the 'displaySimulationInformation' variable above to false % Reset the random number generator and channel, so that each SNR point % will experience the same noise and channel realizations rng('default'); reset(channel); % Initialize variables for this SNR point, required for initialization % of variables when using the Parallel Computing Toolbox carrier = carrier_init; pusch = pusch_init; pathFilters = []; % Specify the order in which we cycle through the HARQ processes NHARQProcesses = 16; harqSequence = 1:NHARQProcesses; % Initialize the state of all HARQ processes and reset the UL-SCH % decoder harqProcesses = hNewHARQProcesses(NHARQProcesses,rvSeq,1); harqProcCntr = 0; % HARQ process counter decodeULSCH = clone(decodeULSCH_init); SNRdB = snrIn(snrIdx); fprintf('\nSimulating %s-based transmission scheme (%dx%d) and SCS=%dkHz with %s channel at %gdB SNR for %d 10ms frame(s)\n',pusch.TxScheme,nTxAnts,nRxAnts,carrier.SubcarrierSpacing,channelType,SNRdB,NFrames); % Total number of slots in the simulation period NSlots = NFrames * carrier.SlotsPerFrame; % Create 'ue' structure ue = struct(); ue.NRB = carrier.NSizeGrid; ue.CyclicPrefix = carrier.CyclicPrefix; ue.SubcarrierSpacing = carrier.SubcarrierSpacing; ue.NCellID = carrier.NCellID; % Timing offset, updated in every slot for perfect synchronization and % when the correlation is strong for practical synchronization offset = 0; % Loop over the entire waveform length for nslot = 0:NSlots-1 % Update the carrier and PUSCH slot numbers to account for a new % PUSCH transmission carrier.NSlot = nslot; pusch.NSlot = nslot; % Calculate the transport block size for this slot [puschIndices,dmrsIndices,dmrsSymbols,puschIndicesInfo] = hPUSCHResources(ue,pusch); MRB = numel(pusch.PRBSet); TBS = nrTBS(pusch.Modulation,pusch.NLayers,MRB,puschIndicesInfo.NREPerPRB,pusch.TargetCodeRate,pusch.NohPRB); % Get HARQ process index for the current PUSCH from the HARQ index % table harqProcIdx = harqSequence(mod(harqProcCntr,length(harqSequence))+1); % Update current HARQ process information (this updates the RV % depending on CRC pass or fail in the previous transmission for % this HARQ process) harqProcesses(harqProcIdx) = hUpdateHARQProcess(harqProcesses(harqProcIdx),1); % HARQ: check CRC from previous transmission, i.e. is a % retransmission required? NDI = false; if harqProcesses(harqProcIdx).blkerr % errored if (harqProcesses(harqProcIdx).RVIdx==1) % end of rvSeq resetSoftBuffer(decodeULSCH,harqProcIdx-1); NDI = true; end else % no error NDI = true; end if NDI trBlk = randi([0 1],TBS,1); setTransportBlock(encodeULSCH,trBlk,harqProcIdx-1); end % UL-SCH encoding codedTrBlock = encodeULSCH(pusch.Modulation,pusch.NLayers,puschIndicesInfo.G,harqProcesses(harqProcIdx).RV,harqProcIdx-1); % PUSCH modulation, including codebook based MIMO precoding if % TxScheme = 'codebook' puschSymbols = nrPUSCH(codedTrBlock,pusch.Modulation,pusch.NLayers,carrier.NCellID,pusch.RNTI,pusch.TransformPrecoding,MRB,pusch.TxScheme,pusch.NAntennaPorts,pusch.TPMI); % Create resource grid associated with PUSCH transmission period puschGrid = nrResourceGrid(carrier,nTxAnts); % Implementation-specific PUSCH MIMO precoding and mapping. This % MIMO precoding step is in addition to any codebook based % MIMO precoding done during PUSCH modulation above if (strcmpi(pusch.TxScheme,'codebook')) % codebook based MIMO precoding, F precodes between PUSCH % transmit antenna ports and transmit antennas F = eye(pusch.NAntennaPorts,nTxAnts); else % non-codebook based MIMO precoding, F precodes between PUSCH % layers and transmit antennas F = eye(pusch.NLayers,nTxAnts); end [~,puschAntIndices] = nrExtractResources(puschIndices,puschGrid); puschGrid(puschAntIndices) = puschSymbols * F; % Implementation-specific PUSCH DM-RS MIMO precoding and mapping. % The DM-RS creation in hPUSCHResources above includes codebook % based MIMO precoding if applicable for p = 1:size(dmrsSymbols,2) [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),puschGrid); puschGrid(dmrsAntIndices) = puschGrid(dmrsAntIndices) + dmrsSymbols(:,p) * F(p,:); end % OFDM modulation txWaveform = nrOFDMModulate(carrier,puschGrid); % Pass data through channel model. Append zeros at the end of the % transmitted waveform to flush channel content. These zeros take % into account any delay introduced in the channel. This is a mix % of multipath delay and implementation delay. This value may % change depending on the sampling rate, delay profile and delay % spread txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))]; %#ok<AGROW> [rxWaveform,pathGains,sampleTimes] = channel(txWaveform); % Add AWGN to the received time domain waveform % Normalize noise power by the IFFT size used in OFDM modulation, % as the OFDM modulator applies this normalization to the % transmitted waveform. Also normalize by the number of receive % antennas, as the default behaviour of the channel model is to % apply this normalization to the received waveform SNR = 10^(SNRdB/20); N0 = 1/(sqrt(2.0*nRxAnts*double(waveformInfo.Nfft))*SNR); noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform))); rxWaveform = rxWaveform + noise; if (perfectChannelEstimator) % Perfect synchronization. Use information provided by the % channel to find the strongest multipath component pathFilters = getPathFilters(channel); [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters); else % Practical synchronization. Correlate the received waveform % with the PUSCH DM-RS to give timing offset estimate 't' and % correlation magnitude 'mag'. The function % hSkipWeakTimingOffset is used to update the receiver timing % offset. If the correlation peak in 'mag' is weak, the current % timing estimate 't' is ignored and the previous estimate % 'offset' is used [t,mag] = nrTimingEstimate(carrier,rxWaveform,dmrsIndices,dmrsSymbols); %#ok<UNRCH> offset = hSkipWeakTimingOffset(offset,t,mag); end rxWaveform = rxWaveform(1+offset:end,:); % Perform OFDM demodulation on the received data to recreate the % resource grid, including padding in the event that practical % synchronization results in an incomplete slot being demodulated rxGrid = nrOFDMDemodulate(carrier,rxWaveform); [K,L,R] = size(rxGrid); if (L < carrier.SymbolsPerSlot) rxGrid = cat(2,rxGrid,zeros(K,carrier.SymbolsPerSlot-L,R)); end if (perfectChannelEstimator) % Perfect channel estimation, use the value of the path gains % provided by the channel estChannelGrid = nrPerfectChannelEstimate(carrier,pathGains,pathFilters,offset,sampleTimes); % Get perfect noise estimate (from the noise realization) noiseGrid = nrOFDMDemodulate(carrier,noise(1+offset:end,:)); noiseEst = var(noiseGrid(:)); % Apply MIMO deprecoding to estChannelGrid to give an estimate % per transmission layer K = size(estChannelGrid,1); estChannelGrid = reshape(estChannelGrid,K*carrier.SymbolsPerSlot*nRxAnts,nTxAnts); estChannelGrid = estChannelGrid * F.'; if (strcmpi(pusch.TxScheme,'codebook')) W = nrPUSCHCodebook(pusch.NLayers,pusch.NAntennaPorts,pusch.TPMI,pusch.TransformPrecoding); estChannelGrid = estChannelGrid * W.'; end estChannelGrid = reshape(estChannelGrid,K,carrier.SymbolsPerSlot,nRxAnts,[]); else % Practical channel estimation between the received grid and % each transmission layer, using the PUSCH DM-RS for each layer [~,dmrsLayerIndices,dmrsLayerSymbols] = hPUSCHResources(ue,setfield(pusch,'TxScheme','nonCodebook')); %#ok<UNRCH> [estChannelGrid,noiseEst] = nrChannelEstimate(carrier,rxGrid,dmrsLayerIndices,dmrsLayerSymbols,'CDMLengths',puschIndicesInfo.CDMLengths); end % Get PUSCH resource elements from the received grid [puschRx,puschHest] = nrExtractResources(puschIndices,rxGrid,estChannelGrid); % Equalization [puschEq,csi] = nrEqualizeMMSE(puschRx,puschHest,noiseEst); % Decode PUSCH physical channel [ulschLLRs,rxSymbols] = nrPUSCHDecode(puschEq,pusch.Modulation,carrier.NCellID,pusch.RNTI,noiseEst,pusch.TransformPrecoding,MRB); % Apply channel state information (CSI) produced by the equalizer, % including the effect of transform precoding if enabled if (pusch.TransformPrecoding) MSC = MRB * 12; csi = nrTransformDeprecode(csi,MRB) / sqrt(MSC); csi = repmat(csi((1:MSC:end).'),1,MSC).'; csi = reshape(csi,size(rxSymbols)); end csi = nrLayerDemap(csi); Qm = length(ulschLLRs) / length(rxSymbols); csi = reshape(repmat(csi{1}.',Qm,1),[],1); ulschLLRs = ulschLLRs .* csi; % Decode the UL-SCH transport channel decodeULSCH.TransportBlockLength = TBS; [decbits,harqProcesses(harqProcIdx).blkerr] = decodeULSCH(ulschLLRs,pusch.Modulation,pusch.NLayers,harqProcesses(harqProcIdx).RV,harqProcIdx-1); % Store values to calculate throughput simThroughput(snrIdx) = simThroughput(snrIdx) + (~harqProcesses(harqProcIdx).blkerr * TBS); maxThroughput(snrIdx) = maxThroughput(snrIdx) + TBS; % Display transport block error information if (displaySimulationInformation) fprintf('\n(%3.2f%%) HARQ Proc %d: ',100*(nslot+1)/NSlots,harqProcIdx); estrings = {'passed','failed'}; rvi = harqProcesses(harqProcIdx).RVIdx; if rvi == 1 ts = sprintf('Initial transmission (RV=%d)',rvSeq(rvi)); else ts = sprintf('Retransmission #%d (RV=%d)',rvi-1,rvSeq(rvi)); end fprintf('%s %s. ',ts,estrings{1+harqProcesses(harqProcIdx).blkerr}); end % Update HARQ process counter harqProcCntr = harqProcCntr + 1; end % Display the results dynamically in the command window if (displaySimulationInformation) fprintf('\n'); end 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)); end
Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at -5dB SNR for 2 10ms frame(s) (5.00%) HARQ Proc 1: Initial transmission (RV=0) failed. (10.00%) HARQ Proc 2: Initial transmission (RV=0) failed. (15.00%) HARQ Proc 3: Initial transmission (RV=0) failed. (20.00%) HARQ Proc 4: Initial transmission (RV=0) failed. (25.00%) HARQ Proc 5: Initial transmission (RV=0) failed. (30.00%) HARQ Proc 6: Initial transmission (RV=0) failed. (35.00%) HARQ Proc 7: Initial transmission (RV=0) failed. (40.00%) HARQ Proc 8: Initial transmission (RV=0) failed. (45.00%) HARQ Proc 9: Initial transmission (RV=0) failed. (50.00%) HARQ Proc 10: Initial transmission (RV=0) failed. (55.00%) HARQ Proc 11: Initial transmission (RV=0) failed. (60.00%) HARQ Proc 12: Initial transmission (RV=0) failed. (65.00%) HARQ Proc 13: Initial transmission (RV=0) failed. (70.00%) HARQ Proc 14: Initial transmission (RV=0) failed. (75.00%) HARQ Proc 15: Initial transmission (RV=0) failed. (80.00%) HARQ Proc 16: Initial transmission (RV=0) failed. (85.00%) HARQ Proc 1: Retransmission #1 (RV=2) passed. (90.00%) HARQ Proc 2: Retransmission #1 (RV=2) passed. (95.00%) HARQ Proc 3: Retransmission #1 (RV=2) passed. (100.00%) HARQ Proc 4: Retransmission #1 (RV=2) passed. Throughput(Mbps) for 2 frame(s) = 0.5712 Throughput(%) for 2 frame(s) = 20.0000 Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at 0dB SNR for 2 10ms frame(s) (5.00%) HARQ Proc 1: Initial transmission (RV=0) passed. (10.00%) HARQ Proc 2: Initial transmission (RV=0) passed. (15.00%) HARQ Proc 3: Initial transmission (RV=0) passed. (20.00%) HARQ Proc 4: Initial transmission (RV=0) passed. (25.00%) HARQ Proc 5: Initial transmission (RV=0) passed. (30.00%) HARQ Proc 6: Initial transmission (RV=0) passed. (35.00%) HARQ Proc 7: Initial transmission (RV=0) passed. (40.00%) HARQ Proc 8: Initial transmission (RV=0) passed. (45.00%) HARQ Proc 9: Initial transmission (RV=0) passed. (50.00%) HARQ Proc 10: Initial transmission (RV=0) passed. (55.00%) HARQ Proc 11: Initial transmission (RV=0) passed. (60.00%) HARQ Proc 12: Initial transmission (RV=0) passed. (65.00%) HARQ Proc 13: Initial transmission (RV=0) passed. (70.00%) HARQ Proc 14: Initial transmission (RV=0) passed. (75.00%) HARQ Proc 15: Initial transmission (RV=0) passed. (80.00%) HARQ Proc 16: Initial transmission (RV=0) passed. (85.00%) HARQ Proc 1: Initial transmission (RV=0) passed. (90.00%) HARQ Proc 2: Initial transmission (RV=0) passed. (95.00%) HARQ Proc 3: Initial transmission (RV=0) passed. (100.00%) HARQ Proc 4: Initial transmission (RV=0) passed. Throughput(Mbps) for 2 frame(s) = 2.8560 Throughput(%) for 2 frame(s) = 100.0000 Simulating nonCodebook-based transmission scheme (1x2) and SCS=15kHz with TDL channel at 5dB SNR for 2 10ms frame(s) (5.00%) HARQ Proc 1: Initial transmission (RV=0) passed. (10.00%) HARQ Proc 2: Initial transmission (RV=0) passed. (15.00%) HARQ Proc 3: Initial transmission (RV=0) passed. (20.00%) HARQ Proc 4: Initial transmission (RV=0) passed. (25.00%) HARQ Proc 5: Initial transmission (RV=0) passed. (30.00%) HARQ Proc 6: Initial transmission (RV=0) passed. (35.00%) HARQ Proc 7: Initial transmission (RV=0) passed. (40.00%) HARQ Proc 8: Initial transmission (RV=0) passed. (45.00%) HARQ Proc 9: Initial transmission (RV=0) passed. (50.00%) HARQ Proc 10: Initial transmission (RV=0) passed. (55.00%) HARQ Proc 11: Initial transmission (RV=0) passed. (60.00%) HARQ Proc 12: Initial transmission (RV=0) passed. (65.00%) HARQ Proc 13: Initial transmission (RV=0) passed. (70.00%) HARQ Proc 14: Initial transmission (RV=0) passed. (75.00%) HARQ Proc 15: Initial transmission (RV=0) passed. (80.00%) HARQ Proc 16: Initial transmission (RV=0) passed. (85.00%) HARQ Proc 1: Initial transmission (RV=0) passed. (90.00%) HARQ Proc 2: Initial transmission (RV=0) passed. (95.00%) HARQ Proc 3: Initial transmission (RV=0) passed. (100.00%) HARQ Proc 4: Initial transmission (RV=0) passed. Throughput(Mbps) for 2 frame(s) = 2.8560 Throughput(%) for 2 frame(s) = 100.0000
Отобразите измеренную пропускную способность. Это вычисляется как процент от максимально возможной пропускной способности ссылки, учитывая доступные ресурсы для передачи данных.
figure; plot(snrIn,simThroughput*100./maxThroughput,'o-.') xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on; if (pusch_init.TransformPrecoding) ofdmType = 'DFT-s-OFDM'; else ofdmType = 'CP-OFDM'; end title(sprintf('%s / NRB=%d / SCS=%dkHz / %s %d/1024 / %dx%d', ... ofdmType,carrier_init.NSizeGrid,carrier_init.SubcarrierSpacing, ... pusch_init.Modulation, ... round(pusch_init.TargetCodeRate*1024),nTxAnts,nRxAnts)); simResults.simParameters = simParameters; simResults.simThroughput = simThroughput; simResults.maxThroughput = maxThroughput;
Рисунок ниже показывает результаты пропускной способности, полученные с симуляцией 10000 подкадров (NFrames = 1000
, SNRIn = -16:2:6
).
В этом примере используются следующие вспомогательные функции:
3GPP TS 38.211. "NR; Физические каналы и модуляция (Release 15). Группа технических спецификаций Радиосеть доступ.
3GPP TS 38.212. "NR; Мультиплексирование и канальное кодирование (Release 15). Группа технических спецификаций Радиосеть доступ.
3GPP TS 38.213. "NR; Процедуры физического уровня для контроля (Release 15). Группа технических спецификаций Радиосеть доступ.
3GPP TS 38.214. "NR; Процедуры физического уровня для данных (Release 15). Группа технических спецификаций Радиосеть доступ.
3GPP TR 38.901. «Исследование модели канала для частот от 0,5 до 100 ГГц (Релиз 15)». 3rd Генерация Partnership Project; Группа технических спецификаций Радиосеть доступ.