В этом примере показано, как измерить физический нисходящий канал совместно использованный канал (PDSCH) пропускная способность ссылки Нового радио (NR) 5G, как задано 3GPP стандарт NR. Пример реализует PDSCH и нисходящий транспортный канал DL-SCH. Модель передатчика включает символы ссылки демодуляции PDSCH пакеты сигнала синхронизации (SS) и (DM-RS). Пример поддерживает и кластеризованную линию задержки (CDL) и каналы распространения коснувшейся линии задержки (TDL). Можно выполнить совершенную или практическую синхронизацию и оценку канала. Чтобы уменьшать общее время симуляции, можно выполнить точки ОСШ в цикле ОСШ параллельно при помощи Parallel Computing Toolbox™.
Этот пример измеряет пропускную способность PDSCH ссылки 5G, как задано 3GPP стандарт NR [1], [2], [3], [4].
Следующий 5G функции NR моделируется:
DL-SCH транспортируют кодирование канала
PDSCH и генерация PDSCH DM-RS
SS разрывают генерацию (PSS/SSS/PBCH/PBCH DM-RS)
Переменный интервал поднесущей и нумерология системы координат (2^n * 15 кГц) для нормального и расширенного циклического префикса
TDL и модели канала распространения CDL
Другие функции симуляции:
PDSCH, предварительно кодирующий использующий SVD
Модуляция CP-OFDM
Мудрый паз и не паз мудрый PDSCH и отображение DM-RS
SS разрывают генерацию (случаи A-E, растровое управление блоком SS/PBCH)
Совершенная или практическая синхронизация и оценка канала
Операция HARQ с 16 процессами
Пример использует одну часть пропускной способности через целого поставщика услуг
Фигура ниже показов цепь обработки реализована. Для ясности разрываются DM-RS и SS, генерация были не использованы.
Этот пример поддерживает операцию с одной или двумя кодовыми комбинациями, зависящими от количества слоев, выбранных для передачи. Одна матрица перед кодированием для целого выделения PDSCH определяется с помощью SVD путем усреднения оценки канала через все, выделил PDSCH PRBs. Поэтому для больших выделений PDSCH, т.е. занятия широкой пропускной способности, одна матрица перед кодированием не может быть хорошо соответствующей к каналу через все частоты, приводящие к ухудшению производительности. Нет никакого beamforming на блоках SS/PBCH в пакете SS.
Чтобы уменьшать общее время симуляции, можно использовать 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)
Логическая переменная perfectChannelEstimator
средства управления образовывают канал поведение синхронизации и оценка. Когда установлено в true
, совершенная оценка канала и синхронизация используются. В противном случае практическая оценка канала и синхронизация используются, на основе значений полученного PDSCH DM-RS.
perfectChannelEstimator = true;
Установите основные параметры симуляции. Они включают:
Пропускная способность в блоках ресурса (12 поднесущих на блок ресурса).
Интервал поднесущей: 15, 30, 60, 120, 240 (kHz)
Циклическая длина префикса: нормальный или расширенный
ID ячейки
Количество передачи и получает антенны
Подструктура, содержащая DL-SCH и параметры PDSCH, также задана. Это включает:
Целевой уровень кода
Выделенные блоки ресурса (PRBSet)
Схема Modulation: 'QPSK', '16QAM', '64QAM', '256QAM'
Количество слоев
PDSCH, сопоставляющий тип
Параметры конфигурации DM-RS
Другая симуляция широкие параметры:
Модель канала распространения: 'TDL' или 'CDL'
SS разрывают параметры конфигурации. Обратите внимание на то, что SS разрываются, генерация может быть отключена путем установки SSBTransmitted
поле к [0 0 0 0].
% Set waveform type and PDSCH numerology (SCS and CP type) simParameters.NRB = 51; % Bandwidth in number of resource blocks (51RBs at 30kHz SCS for 20MHz BW) simParameters.SubcarrierSpacing = 30; % 15, 30, 60, 120, 240 (kHz) simParameters.CyclicPrefix = 'Normal'; % 'Normal' or 'Extended' simParameters.NCellID = 1; % Cell identity % DL-SCH/PDSCH parameters simParameters.PDSCH.PRBSet = 0:simParameters.NRB-1; % PDSCH PRB allocation simParameters.PDSCH.SymbolSet = 0:13; % PDSCH symbol allocation in each slot simParameters.PDSCH.EnableHARQ = true; % Enable/disable HARQ, if disabled, single transmission with RV=0, i.e. no retransmissions simParameters.PDSCH.NLayers = 2; % Number of PDSCH layers simParameters.NTxAnts = 8; % Number of PDSCH transmission antennas if simParameters.PDSCH.NLayers > 4 % Multicodeword transmission simParameters.NumCW = 2; % Number of codewords simParameters.PDSCH.TargetCodeRate = [490 490]./1024; % Code rate used to calculate transport block sizes simParameters.PDSCH.Modulation = {'16QAM','16QAM'}; % 'QPSK', '16QAM', '64QAM', '256QAM' simParameters.NRxAnts = 8; % Number of UE receive antennas else simParameters.NumCW = 1; % Number of codewords simParameters.PDSCH.TargetCodeRate = 490/1024; % Code rate used to calculate transport block sizes simParameters.PDSCH.Modulation = '16QAM'; % 'QPSK', '16QAM', '64QAM', '256QAM' simParameters.NRxAnts = 2; % Number of UE receive antennas end % DM-RS and antenna port configuration (TS 38.211 Section 7.4.1.1) simParameters.PDSCH.PortSet = 0:simParameters.PDSCH.NLayers-1; % DM-RS ports to use for the layers simParameters.PDSCH.PDSCHMappingType = 'A'; % PDSCH mapping type ('A'(slot-wise),'B'(non slot-wise)) simParameters.PDSCH.DMRSTypeAPosition = 2; % Mapping type A only. First DM-RS symbol position (2,3) simParameters.PDSCH.DMRSLength = 1; % Number of front-loaded DM-RS symbols (1(single symbol),2(double symbol)) simParameters.PDSCH.DMRSAdditionalPosition = 0; % Additional DM-RS symbol positions (max range 0...3) simParameters.PDSCH.DMRSConfigurationType = 2; % DM-RS configuration type (1,2) simParameters.PDSCH.NumCDMGroupsWithoutData = 1;% Number of CDM groups without data simParameters.PDSCH.NIDNSCID = 1; % Scrambling identity (0...65535) simParameters.PDSCH.NSCID = 0; % Scrambling initialization (0,1) % Reserved PRB patterns (for CORESETs, forward compatibility etc) simParameters.PDSCH.Reserved.Symbols = []; % Reserved PDSCH symbols simParameters.PDSCH.Reserved.PRB = []; % Reserved PDSCH PRBs simParameters.PDSCH.Reserved.Period = []; % Periodicity of reserved resources % PDSCH resource block mapping (TS 38.211 Section 7.3.1.6) simParameters.PDSCH.VRBToPRBInterleaving = 0; % Disable interleaved resource mapping % Define the propagation channel type simParameters.ChannelType = 'CDL'; % 'CDL' or 'TDL' % SS burst configuration simParameters.SSBurst.BlockPattern = 'Case B'; % 30kHz subcarrier spacing simParameters.SSBurst.SSBTransmitted = [0 1 0 1]; % Bitmap indicating blocks transmitted in the burst simParameters.SSBurst.SSBPeriodicity = 20; % SS burst set periodicity in ms (5, 10, 20, 40, 80, 160) validateNLayers(simParameters);
Создайте gNodeB конфигурационную структуру 'gnb' и конфигурационную структуру PDSCH 'pdsch'
gnb = simParameters; pdsch = simParameters.PDSCH; % Specify additional required fields for PDSCH pdsch.RNTI = 1; Xoh_PDSCH = 0; % The Xoh-PDSCH overhead value is taken to be 0 here
Создайте объект модели канала. И CDL и модели канала TDL поддерживаются [6].
snrIn = simParameters.SNRIn; nTxAnts = simParameters.NTxAnts; nRxAnts = simParameters.NRxAnts; channelType = simParameters.ChannelType; if strcmpi(channelType,'CDL') channel = nrCDLChannel; % CDL channel object % Use CDL-C model (Urban macrocell model) channel.DelayProfile = 'CDL-C'; channel.DelaySpread = 300e-9; % Turn the overall number of antennas into a specific antenna panel % array geometry [channel.TransmitAntennaArray.Size, channel.ReceiveAntennaArray.Size] = ... hArrayGeometry(nTxAnts,nRxAnts); elseif strcmpi(channelType,'TDL') channel = nrTDLChannel; % TDL channel object % Set the channel geometry channel.DelayProfile = 'TDL-C'; channel.DelaySpread = 300e-9; channel.NumTransmitAntennas = nTxAnts; channel.NumReceiveAntennas = nRxAnts; else error('ChannelType parameter field must be either CDL or TDL.'); end
Уровень выборки для модели канала установлен с помощью значения, возвращенного от hOFDMInfo.
waveformInfo = hOFDMInfo(gnb); channel.SampleRate = waveformInfo.SamplingRate;
Получите максимальное количество задержанных выборок каналом многопутевой компонент. Это вычисляется от пути к каналу с самой большой задержкой и задержкой реализации фильтра канала. Это требуется позже сбросить фильтр канала, чтобы получить полученный сигнал.
chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay;
Этот раздел показывает, как зарезервировать ресурсы для передачи пакета SS.
% Create SS burst information structure ssburst = simParameters.SSBurst; ssburst.NCellID = gnb.NCellID; ssburst.SampleRate = waveformInfo.SamplingRate; ssbInfo = hSSBurstInfo(ssburst); % Map the occupied subcarriers and transmitted symbols of the SS burst % (defined in the SS burst numerology) to PDSCH PRBs and symbols in the % data numerology [mappedPRB,mappedSymbols] = mapNumerology(ssbInfo.OccupiedSubcarriers,ssbInfo.OccupiedSymbols,ssbInfo.NRB,gnb.NRB,ssbInfo.SubcarrierSpacing,gnb.SubcarrierSpacing); % Configure the PDSCH to reserve these resources so that the PDSCH % transmission does not overlap the SS burst reservation.Symbols = mappedSymbols; reservation.PRB = mappedPRB; reservation.Period = ssburst.SSBPeriodicity * (gnb.SubcarrierSpacing/15); % Period in slots pdsch.Reserved(end+1) = reservation;
Чтобы определить пропускную способность в каждой точке ОСШ, данные PDSCH анализируются на экземпляр передачи с помощью следующих шагов:
Обновите текущий процесс HARQ. Проверяйте CRC предыдущей передачи для данного процесса HARQ. Определите, требуется ли повторная передача. Если это не так сгенерируйте новые данные.
Генерация сетки ресурса. Кодирование канала выполняется nrDLSCH
. Это работает с входным транспортным обеспеченным блоком. Внутренне, это сохраняет копию транспортного блока в случае, если повторная передача требуется. Закодированные биты модулируются на PDSCH nrPDSCH
. Операция перед кодированием применяется к получившемуся сигналу.
Генерация сигналов. Сгенерированной сеткой является затем модулируемый OFDM.
Шумное моделирование канала. Форма волны передается через CDL или TDL, исчезающий канал. AWGN добавляется. ОСШ задан на RE в каждой антенне UE. Для ОСШ 0 дБ сигнал и шум способствуют одинаково энергии на PDSCH RE на, получают антенну [5].
Выполните синхронизацию и демодуляцию OFDM. Для совершенной синхронизации импульсная характеристика канала восстанавливается и используется, чтобы синхронизировать полученную форму волны. Для практической синхронизации полученная форма волны коррелируется с PDSCH DM-RS. Синхронизируемым сигналом является затем демодулируемый OFDM.
Выполните оценку канала. Если совершенная оценка канала используется, импульсная характеристика канала восстановлена, и OFDM демодулируется, чтобы обеспечить оценку канала. Для практической оценки канала используется PDSCH DM-RS.
Предварительное кодирование матричного вычисления. Матрица W перед кодированием для следующей передачи вычисляется с помощью сингулярного разложения (SVD). Одна матрица получена для полного выделения путем усреднения условий канала. Поэтому для канала с селективностью частоты, W мог быть менее точным для большей выделенной пропускной способности.
Декодируйте PDSCH. Восстановленные символы PDSCH для всей передачи и получают пары антенны, наряду с шумовой оценкой, демодулируются и дескремблированы nrPDSCHDecode
получить оценку полученных кодовых комбинаций.
Декодируйте Нисходящий Разделяемый Канал (DL-SCH) и сохраните ошибку блока CRC для процесса HARQ. Вектор декодируемых мягких битов передается nrDLSCHDecoder
который декодирует кодовую комбинацию и возвращается, ошибка блока 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 pdsch.EnableHARQ % In the final report of RAN WG1 meeting #91 (R1-1719301), it was % observed in R1-1717405 that if performance is the priority, [0 2 3 1] % should be used. If self-decodability is the priority, it should be % taken into account that the upper limit of the code rate at which % each RV is self-decodable is in the following order: 0>3>>2>1 rvSeq = [0 2 3 1]; else % HARQ disabled - single transmission with RV=0, no retransmissions rvSeq = 0; end % Create DLSCH encoder system object encodeDLSCH = nrDLSCH; encodeDLSCH.MultipleHARQProcesses = true; encodeDLSCH.TargetCodeRate = pdsch.TargetCodeRate; % Create DLSCH 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 decodeDLSCH = nrDLSCHDecoder; decodeDLSCH.MultipleHARQProcesses = true; decodeDLSCH.TargetCodeRate = pdsch.TargetCodeRate; decodeDLSCH.LDPCDecodingAlgorithm = 'Layered belief propagation'; decodeDLSCH.MaximumLDPCIterationCount = 6; % The temporary variables 'gnb_init', 'pdsch_init', 'ssburst_init' and % 'decodeDLSCH_init' are used to create the temporary variables 'gnb', % 'pdsch', 'ssburst' and 'decodeDLSCH' within the SNR loop to create % independent instances in case of parallel simulation gnb_init = gnb; pdsch_init = pdsch; ssburst_init = ssburst; decodeDLSCH_init = clone(decodeDLSCH); 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 % Set the random number generator settings to default values rng('default'); % Initialize variables for this SNR point, required for initialization % of variables when using the Parallel Computing Toolbox gnb = gnb_init; pdsch = pdsch_init; ssburst = ssburst_init; decodeDLSCH = clone(decodeDLSCH_init); pathFilters = []; ssbWaveform = []; SNRdB = snrIn(snrIdx); fprintf('\nSimulating transmission scheme 1 (%dx%d) and SCS=%dkHz with %s channel at %gdB SNR for %d 10ms frame(s)\n',... nTxAnts,nRxAnts,gnb.SubcarrierSpacing, ... channelType,SNRdB,gnb.NFrames); % Initialize variables used in the simulation and analysis bitTput = []; % Number of successfully received bits per transmission txedTrBlkSizes = []; % Number of transmitted info bits per transmission % Specify the order in which we cycle through the HARQ processes NHARQProcesses = 16; harqSequence = 1:NHARQProcesses; % Initialize the state of all HARQ processes harqProcesses = hNewHARQProcesses(NHARQProcesses,rvSeq,gnb.NumCW); harqProcCntr = 0; % HARQ process counter % Reset the channel so that each SNR point will experience the same % channel realization reset(channel); % Total number of OFDM symbols in the simulation period waveformInfo = hOFDMInfo(gnb); NSymbols = gnb.NFrames * 10 * waveformInfo.SymbolsPerSubframe; % OFDM symbol number associated with start of each PDSCH transmission gnb.NSymbol = 0; % Running counter of the number of PDSCH transmission instances % The simulation will use this counter as the slot number for each % PDSCH pdsch.NSlot = 0; % Index to the start of the current set of SS burst samples to be % transmitted ssbSampleIndex = 1; % Obtain a precoding matrix (wtx) to be used in the transmission of the % first transport block estChannelGrid = getInitialChannelEstimate(gnb,nTxAnts,channel); newWtx = getPrecodingMatrix(pdsch.PRBSet,pdsch.NLayers,estChannelGrid); % Timing offset, updated in every slot for perfect synchronization and % when the correlation is strong for practical synchronization offset = 0; while gnb.NSymbol < NSymbols % Move to next slot, gnb.NSymbol increased in steps of one slot % Generate a new SS burst when necessary if (ssbSampleIndex==1) nSubframe = gnb.NSymbol / waveformInfo.SymbolsPerSubframe; ssburst.NFrame = floor(nSubframe / 10); ssburst.NHalfFrame = mod(nSubframe / 5,2); [ssbWaveform,~,ssbInfo] = hSSBurst(ssburst); end % Get HARQ process index for the current PDSCH from 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),gnb.NumCW); % Calculate the transport block sizes for the codewords in the slot [pdschIndices,dmrsIndices,dmrsSymbols,pdschIndicesInfo] = hPDSCHResources(gnb,pdsch); trBlkSizes = hPDSCHTBS(pdsch,pdschIndicesInfo.NREPerPRB-Xoh_PDSCH); % HARQ: check CRC from previous transmission per codeword, i.e. is % a retransmission required? for cwIdx = 1:gnb.NumCW NDI = false; if harqProcesses(harqProcIdx).blkerr(cwIdx) % Errored if (harqProcesses(harqProcIdx).RVIdx(cwIdx)==1) % end of rvSeq resetSoftBuffer(decodeDLSCH,cwIdx-1,harqProcIdx-1); NDI = true; end else % No error NDI = true; end if NDI trBlk = randi([0 1],trBlkSizes(cwIdx),1); setTransportBlock(encodeDLSCH,trBlk,cwIdx-1,harqProcIdx-1); end end % Encode the DL-SCH transport blocks codedTrBlock = encodeDLSCH(pdsch.Modulation,pdsch.NLayers,... pdschIndicesInfo.G,harqProcesses(harqProcIdx).RV,harqProcIdx-1); % Get wtx (precoding matrix) calculated in previous slot wtx = newWtx; % PDSCH modulation and precoding pdschSymbols = nrPDSCH(codedTrBlock,pdsch.Modulation,pdsch.NLayers,gnb.NCellID,pdsch.RNTI); pdschSymbols = pdschSymbols*wtx; % PDSCH mapping in grid associated with PDSCH transmission period pdschGrid = zeros(waveformInfo.NSubcarriers,waveformInfo.SymbolsPerSlot,nTxAnts); [~,pdschAntIndices] = nrExtractResources(pdschIndices,pdschGrid); pdschGrid(pdschAntIndices) = pdschSymbols; % PDSCH DM-RS precoding and mapping for p = 1:size(dmrsSymbols,2) [~,dmrsAntIndices] = nrExtractResources(dmrsIndices(:,p),pdschGrid); pdschGrid(dmrsAntIndices) = pdschGrid(dmrsAntIndices) + dmrsSymbols(:,p)*wtx(p,:); end % OFDM modulation of associated resource elements txWaveform = hOFDMModulate(gnb, pdschGrid); % Add the appropriate portion of SS burst waveform to the % transmitted waveform Nt = size(txWaveform,1); txWaveform = txWaveform + ssbWaveform(ssbSampleIndex + (0:Nt-1),:); ssbSampleIndex = mod(ssbSampleIndex + Nt,size(ssbWaveform,1)); % 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))]; [rxWaveform,pathGains,sampleTimes] = channel(txWaveform); % Add AWGN to the received time domain waveform % Normalize noise power to take account of sampling rate, which is % a function of the IFFT size used in OFDM modulation. The SNR % is defined per RE for each receive antenna (TS 38.101-4). SNR = 10^(SNRdB/20); % Calculate linear noise gain 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); % get path filters for perfect channel estimation [offset,mag] = nrPerfectTimingEstimate(pathGains,pathFilters); else % Practical synchronization. Correlate the received waveform % with the PDSCH 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(rxWaveform,gnb.NRB,gnb.SubcarrierSpacing,pdsch.NSlot,dmrsIndices,dmrsSymbols,'CyclicPrefix',gnb.CyclicPrefix); %#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 = hOFDMDemodulate(gnb, rxWaveform); [K,L,R] = size(rxGrid); if (L < waveformInfo.SymbolsPerSlot) rxGrid = cat(2,rxGrid,zeros(K,waveformInfo.SymbolsPerSlot-L,R)); end if (perfectChannelEstimator) % Perfect channel estimation, using the value of the path gains % provided by the channel. This channel estimate does not % include the effect of transmitter precoding estChannelGrid = nrPerfectChannelEstimate(pathGains,pathFilters,gnb.NRB,gnb.SubcarrierSpacing,pdsch.NSlot,offset,sampleTimes,gnb.CyclicPrefix); % Get perfect noise estimate (from the noise realization) noiseGrid = hOFDMDemodulate(gnb,noise(1+offset:end ,:)); noiseEst = var(noiseGrid(:)); % Get precoding matrix for next slot newWtx = getPrecodingMatrix(pdsch.PRBSet,pdsch.NLayers,estChannelGrid); % Apply precoding to estChannelGrid estChannelGrid = precodeChannelEstimate(estChannelGrid,wtx.'); else % Practical channel estimation between the received grid and % each transmission layer, using the PDSCH DM-RS for each % layer. This channel estimate includes the effect of % transmitter precoding [estChannelGrid,noiseEst] = nrChannelEstimate(rxGrid,dmrsIndices,dmrsSymbols,'CyclicPrefix',gnb.CyclicPrefix,'CDMLengths',pdschIndicesInfo.CDMLengths); %#ok<UNRCH> % Remove precoding from estChannelGrid prior to precoding % matrix calculation estChannelGridPorts = precodeChannelEstimate(estChannelGrid,conj(wtx)); % Get precoding matrix for next slot newWtx = getPrecodingMatrix(pdsch.PRBSet,pdsch.NLayers,estChannelGridPorts); end % Get PDSCH resource elements from the received grid [pdschRx,pdschHest] = nrExtractResources(pdschIndices,rxGrid,estChannelGrid); % Equalization [pdschEq,csi] = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst); % Decode PDSCH physical channel [dlschLLRs,rxSymbols] = nrPDSCHDecode(pdschEq,pdsch.Modulation,gnb.NCellID,pdsch.RNTI,noiseEst); % Scale LLRs by CSI csi = nrLayerDemap(csi); % CSI layer demapping for cwIdx = 1:gnb.NumCW Qm = length(dlschLLRs{cwIdx})/length(rxSymbols{cwIdx}); % bits per symbol csi{cwIdx} = repmat(csi{cwIdx}.',Qm,1); % expand by each bit per symbol dlschLLRs{cwIdx} = dlschLLRs{cwIdx} .* csi{cwIdx}(:); % scale end % Decode the DL-SCH transport channel decodeDLSCH.TransportBlockLength = trBlkSizes; [decbits,harqProcesses(harqProcIdx).blkerr] = decodeDLSCH(dlschLLRs,pdsch.Modulation,pdsch.NLayers,harqProcesses(harqProcIdx).RV,harqProcIdx-1); % Store values to calculate throughput (only for active PDSCH instances) if(any(trBlkSizes ~= 0)) bitTput = [bitTput trBlkSizes.*(1-harqProcesses(harqProcIdx).blkerr)]; txedTrBlkSizes = [txedTrBlkSizes trBlkSizes]; end % Update starting symbol number of next PDSCH transmission gnb.NSymbol = gnb.NSymbol + size(pdschGrid,2); % Update count of overall number of PDSCH transmissions pdsch.NSlot = pdsch.NSlot + 1; % Update HARQ process counter harqProcCntr = harqProcCntr + 1; % Display transport block error information per codeword managed by current HARQ process fprintf('\n(%3.2f%%) HARQ Proc %d: ',100*gnb.NSymbol/NSymbols,harqProcIdx); estrings = {'passed','failed'}; rvi = harqProcesses(harqProcIdx).RVIdx; for cw=1:length(rvi) cwrvi = rvi(cw); % Create a report on the RV state given position in RV sequence and decoding error if cwrvi == 1 ts = sprintf('Initial transmission (RV=%d)',rvSeq(cwrvi)); else ts = sprintf('Retransmission #%d (RV=%d)',cwrvi-1,rvSeq(cwrvi)); end fprintf('CW%d:%s %s. ',cw-1,ts,estrings{1+harqProcesses(harqProcIdx).blkerr(cw)}); 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([['\n\nThroughput(Mbps) for ', num2str(gnb.NFrames) ' frame(s) '],... '= %.4f\n'], 1e-6*simThroughput(snrIdx)/(gnb.NFrames*10e-3)); fprintf(['Throughput(%%) for ', num2str(gnb.NFrames) ' frame(s) = %.4f\n'],... simThroughput(snrIdx)*100/maxThroughput(snrIdx)); end
Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at -5dB SNR for 2 10ms frame(s) (2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) failed. (5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) failed. (7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) failed. (10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) failed. (12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) failed. (15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) failed. (17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) failed. (20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) failed. (22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) failed. (25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) failed. (27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) failed. (30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) failed. (32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) failed. (35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) failed. (37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) failed. (40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) failed. (42.50%) HARQ Proc 1: CW0:Retransmission #1 (RV=2) passed. (45.00%) HARQ Proc 2: CW0:Retransmission #1 (RV=2) passed. (47.50%) HARQ Proc 3: CW0:Retransmission #1 (RV=2) passed. (50.00%) HARQ Proc 4: CW0:Retransmission #1 (RV=2) passed. (52.50%) HARQ Proc 5: CW0:Retransmission #1 (RV=2) passed. (55.00%) HARQ Proc 6: CW0:Retransmission #1 (RV=2) passed. (57.50%) HARQ Proc 7: CW0:Retransmission #1 (RV=2) passed. (60.00%) HARQ Proc 8: CW0:Retransmission #1 (RV=2) passed. (62.50%) HARQ Proc 9: CW0:Retransmission #1 (RV=2) passed. (65.00%) HARQ Proc 10: CW0:Retransmission #1 (RV=2) passed. (67.50%) HARQ Proc 11: CW0:Retransmission #1 (RV=2) passed. (70.00%) HARQ Proc 12: CW0:Retransmission #1 (RV=2) passed. (72.50%) HARQ Proc 13: CW0:Retransmission #1 (RV=2) passed. (75.00%) HARQ Proc 14: CW0:Retransmission #1 (RV=2) passed. (77.50%) HARQ Proc 15: CW0:Retransmission #1 (RV=2) passed. (80.00%) HARQ Proc 16: CW0:Retransmission #1 (RV=2) passed. (82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) failed. (85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) failed. (87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) failed. (90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) failed. (92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) failed. (95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) failed. (97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) failed. (100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) failed. Throughput(Mbps) for 2 frame(s) = 24.1728 Throughput(%) for 2 frame(s) = 40.0000 Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at 0dB SNR for 2 10ms frame(s) (2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. (22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. (25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. (27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. (30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. (32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. (35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. (37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. (40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. (42.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (45.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (47.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (50.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (52.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (55.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (57.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (60.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. (62.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. (65.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. (67.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. (70.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. (72.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. (75.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. (77.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. (80.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. (82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. Throughput(Mbps) for 2 frame(s) = 60.4320 Throughput(%) for 2 frame(s) = 100.0000 Simulating transmission scheme 1 (8x2) and SCS=30kHz with CDL channel at 5dB SNR for 2 10ms frame(s) (2.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (5.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (7.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (10.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (12.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (15.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (17.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (20.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. (22.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. (25.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. (27.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. (30.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. (32.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. (35.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. (37.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. (40.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. (42.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (45.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (47.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (50.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (52.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (55.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (57.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (60.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. (62.50%) HARQ Proc 9: CW0:Initial transmission (RV=0) passed. (65.00%) HARQ Proc 10: CW0:Initial transmission (RV=0) passed. (67.50%) HARQ Proc 11: CW0:Initial transmission (RV=0) passed. (70.00%) HARQ Proc 12: CW0:Initial transmission (RV=0) passed. (72.50%) HARQ Proc 13: CW0:Initial transmission (RV=0) passed. (75.00%) HARQ Proc 14: CW0:Initial transmission (RV=0) passed. (77.50%) HARQ Proc 15: CW0:Initial transmission (RV=0) passed. (80.00%) HARQ Proc 16: CW0:Initial transmission (RV=0) passed. (82.50%) HARQ Proc 1: CW0:Initial transmission (RV=0) passed. (85.00%) HARQ Proc 2: CW0:Initial transmission (RV=0) passed. (87.50%) HARQ Proc 3: CW0:Initial transmission (RV=0) passed. (90.00%) HARQ Proc 4: CW0:Initial transmission (RV=0) passed. (92.50%) HARQ Proc 5: CW0:Initial transmission (RV=0) passed. (95.00%) HARQ Proc 6: CW0:Initial transmission (RV=0) passed. (97.50%) HARQ Proc 7: CW0:Initial transmission (RV=0) passed. (100.00%) HARQ Proc 8: CW0:Initial transmission (RV=0) passed. Throughput(Mbps) for 2 frame(s) = 60.4320 Throughput(%) for 2 frame(s) = 100.0000
Отобразите измеренную пропускную способность. Это вычисляется как процент максимальной возможной пропускной способности ссылки, учитывая имеющиеся ресурсы для передачи данных.
figure; plot(snrIn,simThroughput*100./maxThroughput,'o-.') xlabel('SNR (dB)'); ylabel('Throughput (%)'); grid on; title(sprintf('(%dx%d) / NRB=%d / SCS=%dkHz',... nTxAnts,nRxAnts,gnb_init.NRB,gnb_init.SubcarrierSpacing)); % Bundle key parameters and results into a combined structure for recording simResults.simParameters = simParameters; simResults.simThroughput = simThroughput;
Фигура ниже результатов пропускной способности показов, полученных, симулируя 10 000 подкадров (NFrames = 1000
, SNRIn = -18:2:16
).
Этот пример использует следующие функции помощника:
3GPP TS 38.211. "NR; Физические каналы и модуляция (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.212. "NR; Мультиплексирование и кодирование канала (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.213. "NR; процедуры Физического уровня для управления (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.214. "NR; процедуры Физического уровня для данных (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
R1-166999. "Подробная настройка F-OFDM и W-OFDM для оценки LLS", 3GPP ЗАПУСТИЛ № 86 WG1, Spreadtrum Communications, август 2016.
3GPP TR 38.901. "Исследование модели канала для частот от 0,5 до 100 ГГц (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.101-4. "NR; передача радио Оборудования пользователя (UE) и прием. Часть 4: Требования к производительности (Релиз 15)". Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
function validateNLayers(simParameters) % Validate the number of layers if length(simParameters.PDSCH.PortSet)~= simParameters.PDSCH.NLayers error('The number of elements of PortSet (%d) must be the same as the number of layers (%d)',... length(simParameters.PDSCH.PortSet), simParameters.PDSCH.NLayers); end if simParameters.PDSCH.NLayers > min(simParameters.NTxAnts,simParameters.NRxAnts) error('The number of layers (%d) must satisfy NLayers <= min(NTxAnts,NRxAnts) = min(%d,%d) = (%d)',... simParameters.PDSCH.NLayers,simParameters.NTxAnts,simParameters.NRxAnts,min(simParameters.NTxAnts,simParameters.NRxAnts)); end end function estChannelGrid = getInitialChannelEstimate(gnb,nTxAnts,channel) % Obtain channel estimate before first transmission. This can be used to % obtain a precoding matrix for the first slot. ofdmInfo = hOFDMInfo(gnb); chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay; % Temporary waveform (only needed for the sizes) tmpWaveform = zeros((ofdmInfo.SamplesPerSubframe/ofdmInfo.SlotsPerSubframe)+maxChDelay,nTxAnts); % Filter through channel [~,pathGains,sampleTimes] = channel(tmpWaveform); % Perfect timing synch pathFilters = getPathFilters(channel); offset = nrPerfectTimingEstimate(pathGains,pathFilters); nslot = gnb.NSymbol/ofdmInfo.SymbolsPerSlot; % Perfect channel estimate estChannelGrid = nrPerfectChannelEstimate(pathGains,pathFilters,gnb.NRB,gnb.SubcarrierSpacing,nslot,offset,sampleTimes); end function wtx = getPrecodingMatrix(PRBSet,NLayers,hestGrid) % Calculate precoding matrix given an allocation and a channel estimate % Allocated subcarrier indices allocSc = (1:12)' + 12*PRBSet(:).'; allocSc = allocSc(:); % Average channel estimate [~,~,R,P] = size(hestGrid); estAllocGrid = hestGrid(allocSc,:,:,:); Hest = permute(mean(reshape(estAllocGrid,[],R,P)),[2 3 1]); % SVD decomposition [~,~,V] = svd(Hest); wtx = V(:,1:NLayers).'; wtx = wtx / sqrt(NLayers); % Normalize by NLayers end function estChannelGrid = precodeChannelEstimate(estChannelGrid,W) % Apply precoding matrix W to the last dimension of the channel estimate % Linearize 4D matrix and reshape after multiplication K = size(estChannelGrid,1); L = size(estChannelGrid,2); R = size(estChannelGrid,3); estChannelGrid = reshape(estChannelGrid,K*L*R,[]); estChannelGrid = estChannelGrid * W; estChannelGrid = reshape(estChannelGrid,K,L,R,[]); end function [mappedPRB,mappedSymbols] = mapNumerology(subcarriers,symbols,nrbs,nrbt,fs,ft) % Map the SSBurst numerology to PDSCH numerology. The outputs are: % - mappedPRB: 0-based PRB indices for carrier resource grid (arranged in a column) % - mappedSymbols: 0-based OFDM symbol indices in a slot for carrier resource grid (arranged in a row) % carrier resource grid is sized using gnb.NRB, gnb.CyclicPrefix, spanning 1 slot % The input parameters are: % - subcarriers: 1-based row subscripts for SSB resource grid (arranged in a column) % - symbols: 1-based column subscripts for SSB resource grid (arranged in an N-by-4 matrix, 4 symbols for each transmitted burst in a row, N transmitted bursts) % SSB resource grid is sized using ssbInfo.NRB, normal CP, spanning 5 subframes % - nrbs: source (SSB) NRB % - nrbt: target (carrier) NRB % - fs: source (SSB) SCS % - ft: target (carrier) SCS mappedPRB = unique(fix((subcarriers-(nrbs*6) - 1)*fs/(ft*12) + nrbt/2),'stable'); symbols = symbols.'; symbols = symbols(:).' - 1; if (ft < fs) % If ft/fs < 1, reduction mappedSymbols = unique(fix(symbols*ft/fs),'stable'); else % Else, repetition by ft/fs mappedSymbols = reshape((0:(ft/fs-1))' + symbols(:)'*ft/fs,1,[]); end end