В этом примере показано, как использовать звучание опорными сигналами (SRS) для синхронизации, оценки канала и восходящей оценки информации о состоянии канала (CSI).
Звучащие опорные сигналы являются восходящими физическими сигналами, используемыми оборудованием пользователя (UE) для восходящего звучания канала, включая оценку CSI и синхронизацию. CSI включает качественную характеристику канала (CQI), индикатор ранга (RI) и матричный индикатор перед кодером (PMI). Этот пример демонстрирует, как использовать SRS, чтобы выбрать соответствующую PMI под выборочными частотой изменяющимися во времени шумными каналами. Восходящие основанные на книге шифров передачи используют PMIs, как задано в Разделе TS 38.211 6.3.1.5 [1].
Этот пример выполняет симуляцию включая:
Настройка SRS и передача
Совершенная и практическая синхронизация и оценка канала
Оценка отношения сигнал-шум (SNR)
Выбор PMI
Оценка эффективности выбора PMI
Установите продолжительность симуляции в терминах количества систем координат на 10 мс. Установите точки ОСШ симулировать. ОСШ задан на RE и применяется, каждый получает антенну.
numFrames = 1; % 10 ms frames snr = 20; % SNR in dB
Установите основные параметры симуляции. Они включают:
Полоса пропускания в блоках ресурса (12 поднесущих на блок ресурса)
Расстояние между поднесущими: 15, 30, 60, 120, 240 (kHz)
Длина циклического префикса: нормальный или расширенный
Количество передающих и приемных антенн: 1, 2 или 4.
Количество слоев. Это должно быть ниже, чем или равным количеству передающих и приемных антенн.
Заданные параметры SRS включают:
Количество портов антенны SRS: 1,2,4
Количество символов OFDM выделило для SRS на паз: 1,2,4
Запуск символа OFDM передачи SRS в пазе. Это должно быть (8... 13) для нормального CP и (6... 11) для расширенного CP.
Стартовая позиция SRS в частоте задана в RBS
Полоса пропускания и частота, скачкообразно перемещающая настройку CSRS
, BSRS
, и BHop
. Установите BHop >= BSRS
отключить скачкообразное движение частоты.
Расческа передачи, чтобы задать плотность частоты SRS в поднесущих: 2,4
Количество повторных символов SRS в пазе. Это отключает частоту, скачкообразно двигающуюся в блоках Repetition
символы. Установите Repetition = 1
ни для какого повторения.
Периодичность и смещение SRS в пазах.
Тип ресурса может быть 'периодическим', 'полуперсистентным', и 'апериодическим'. Шаблон скачкообразного движения частоты сбрасывается для апериодических типов ресурсов SRS в каждом пазе.
% Create UE/carrier configuration ue = nrCarrierConfig; ue.NSizeGrid = 52; % Bandwidth in number of resource blocks (52RBs at 15kHz SCS for 10MHz BW) ue.SubcarrierSpacing = 15; % 15, 30, 60, 120, 240 (kHz) ue.CyclicPrefix = 'Normal'; % 'Normal' or 'Extended' nTxAnts = 2; % Number of transmit antennas (1,2,4) nRxAnts = 2; % Number of receive antennas nLayers = min(nTxAnts,nRxAnts); % Configure a periodic multi-port SRS and enable frequency hopping srs = nrSRSConfig; srs.NumSRSSymbols = 4; % Number of OFDM symbols allocated per slot (1,2,4) srs.SymbolStart = 8; % Starting OFDM symbol within a slot srs.NumSRSPorts = nTxAnts; % Number of SRS antenna ports (1,2,4). srs.FrequencyStart = 0; % Frequency position of the SRS in BWP in RBs srs.NRRC = 0; % Additional offset from FreqStart specified in blocks of 4 PRBs (0...67) srs.CSRS = 14; % Bandwidth configuration C_SRS (0...63). It controls the allocated bandwidth to the SRS srs.BSRS = 0; % Bandwidth configuration B_SRS (0...3). It controls the allocated bandwidth to the SRS srs.BHop = 0; % Frequency hopping configuration (0...3). Set BHop < BSRS to enable frequency hopping srs.KTC = 2; % Comb number (2,4). Frequency density in subcarriers srs.Repetition = 2; % Repetition (1,2,4). It disables frequency hopping in blocks of |Repetition| symbols srs.SRSPeriod = [2 0]; % Periodicity and offset in slots. SRSPeriod(2) must be < SRSPeriod(1) srs.ResourceType = 'periodic'; % Resource type ('periodic', 'semi-persistent','aperiodic'). Use 'aperiodic' to disable inter-slot frequency hopping
Этот пример выполняет синхронизацию и оценку канала кандидата SRS пазы. Синхронизация и оценки канала обновляется только в пазах, содержащих передачи SRS. В скачкообразно перемещающих частоту настройках SRS оценки канала только обновляются в тех блоках ресурса, содержащих символы SRS. Когда нет никакой передачи SRS, синхронизируя, и оценки канала от предыдущих пазов сохранены и используются для захвата CSI. Точно так же оценки шумовой мощности обновляются только в кандидате SRS пазы.
Логическая переменная practicalSynchronization
средства управления образовывают канал поведение синхронизации. Когда установлено в true
, пример выполняет практическую синхронизацию на основе значений полученного SRS. Когда установлено в false
, пример выполняет идеальную синхронизацию. Синхронизация выполняется только в пазах, куда SRS передается, чтобы сохранить совершенные и практические оценки канала синхронизируемыми.
practicalSynchronization = true;
Этот пример оценивает CSI путем разделения полосы пропускания несущей во многие поддиапазоны. Задайте размер поддиапазонов частоты в RB
csiSubbandSize = 4; % Number of RBs per subband
Создайте объект модели канала TDL и задайте его характеристики распространения. Выберите распространение задержки канала и максимальный эффект Доплера, чтобы создать изменяющийся во времени и выборочный частотой канал в длительности симуляции и полосе пропускания несущей.
channel = nrTDLChannel; channel.DelayProfile = 'TDL-C'; channel.DelaySpread = 40e-9; channel.MaximumDopplerShift = 30; channel.NumTransmitAntennas = nTxAnts; channel.NumReceiveAntennas = nRxAnts; channel.Seed = 5; % Set channel sample rate ofdmInfo = nrOFDMInfo(ue); channel.SampleRate = ofdmInfo.SampleRate;
Получите максимальное количество задержанных выборок каналом многопутевой компонент. Это вычисляется от пути к каналу с самой большой задержкой и задержкой реализации фильтра канала. Это требуется позже сбросить фильтр канала, чтобы получить полученный сигнал.
chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)); maxChDelay = maxChDelay + chInfo.ChannelFilterDelay; % Reset random generator for reproducibility rng('default');
Измерьте CSI на паз. CSI получен с помощью следующих шагов:
Сгенерируйте сетку ресурса. Используйте символы SRS и индексы, чтобы создать сетку элемента ресурса (RE).
Сгенерируйте форму волны. Сгенерированной сеткой является затем модулируемый OFDM.
Шумный канал модели. Форма волны передается через TDL, исчезающий канал. AWGN добавляется. ОСШ для каждого слоя задан на RE, и на получают антенну.
Выполните синхронизацию и демодуляцию OFDM. Для идеальной синхронизации импульсная характеристика канала восстанавливается и используется, чтобы синхронизировать принятую форму волны. Для практической синхронизации принятая форма волны коррелируется с SRS. Синхронизируемым сигналом является затем демодулируемый OFDM.
Выполните оценку канала. Для совершенной оценки канала восстановлена импульсная характеристика канала, и OFDM демодулируется, чтобы обеспечить оценку канала. Для практической оценки канала используется переданный SRS.
Выбор PMI. Основанная на SRS оценка канала используется, чтобы выбрать лучшую PMI в каждом поддиапазоне оценки CSI. Критерий выбора PMI максимизирует средний сигнал к интерференции плюс шумовое отношение (SINR) после предварительного кодирования.
Выбор PMI потеря SINR. Потеря SINR вычисляется путем сравнения SINR после предварительного кодирования с предполагаемым и идеальным PMIs. Идеальные PMIs выбраны с помощью совершенных оценок канала.
% Number of slots to simulate numSlots = numFrames*ue.SlotsPerFrame; % Total number of subcarriers and symbols per slot K = ue.NSizeGrid * 12; L = ue.SymbolsPerSlot; % Initialize arrays storing channel estimates allTxGrid = zeros([K L*numSlots nTxAnts]); slotGridSize = [K L nRxAnts nTxAnts]; hEst = zeros(slotGridSize); hestInterp = zeros(slotGridSize); hEstUpdate = zeros(slotGridSize); totalGridSize = [K L*numSlots nRxAnts nTxAnts]; allHest = zeros(totalGridSize); allHestPerfect = zeros(totalGridSize); allHestInterp = zeros(totalGridSize); % Initialize noise power estimate nvar = 0; % Calculate the number of CSI subbands for the carrier numCSISubbands = ceil(ue.NSizeGrid/csiSubbandSize); % Initialize SINR per subband, slot, and PMI maxPMI = hMaxPUSCHPrecodingMatrixIndicator(nLayers,nTxAnts); sinrSubband = zeros([numCSISubbands numSlots maxPMI+1]); % Initialize PMI matrix and SINR loss pmi = NaN(numCSISubbands,numSlots); pmiPerfect = pmi; loss = zeros(size(pmi)); % Initialize timing estimation offset offset = chInfo.ChannelFilterDelay; % Calculate SRS CDM lengths cdmLengths = hSRSCDMLengths(srs); % OFDM symbols used for CSI acquisition csiSelectSymbols = srs.SymbolStart + (1:srs.NumSRSSymbols); for nSlot = 0:numSlots-1 % Update slot counter ue.NSlot = nSlot; % Generate SRS and map to slot grid [srsIndices,srsIndInfo] = nrSRSIndices(ue,srs); srsSymbols = nrSRS(ue,srs); % Create a slot-wise resource grid empty grid and map SRS symbols txGrid = nrResourceGrid(ue,nTxAnts); txGrid(srsIndices) = srsSymbols; % Determine if the slot contains SRS isSRSSlot= ~isempty(srsSymbols); % OFDM Modulation [txWaveform,waveformInfo] = nrOFDMModulate(ue,txGrid); txWaveform = [txWaveform; zeros(maxChDelay, size(txWaveform,2))]; % required later to flush the channel filter to obtain the received signal % Transmission through channel [rxWaveform,pathGains] = 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^(snr/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; % Perform timing offset estimation pathFilters = getPathFilters(channel); % Timing estimation is only performed in the slots where the SRS is % transmitted to keep the perfect and practical channel estimation % synchronized. if isSRSSlot if practicalSynchronization % Practical synchronization. Correlate the received waveform % with the SRS to give timing offset estimate offset = nrTimingEstimate(ue,rxWaveform,srsIndices,srsSymbols); else offset = nrPerfectTimingEstimate(pathGains,pathFilters); end end % Perform OFDM demodulation rxGrid = nrOFDMDemodulate(ue,rxWaveform(1+offset:end,:)); % Perform practical channel estimation % Update channel estimates only in the symbols and RBs containing SRS % in this slot and hold the estimates from the previous slot in other % locations. nvar is not updated when there is no SRS transmission. Use % a time-averaging window that covers all the SRS symbols transmitted. if isSRSSlot % this slot contains an SRS transmission [hEst,nvar] = nrChannelEstimate(ue,rxGrid,srsIndices,srsSymbols,'AveragingWindow',[0 7],'CDMLengths',cdmLengths); % Use channel estimate from previous slot for OFDM symbols before the first SRS symbol hestInterp = repmat(hestInterp(:,end,:,:),1,ue.SymbolsPerSlot); % Update channel estimate in OFDM symbols and RB where the SRS is % present and hold all channel estimates until the end of the slot firstSymbol = srs.SymbolStart+1; lastSymbol = srs.SymbolStart + srs.NumSRSSymbols; hEstUpdate(:,firstSymbol:lastSymbol,:,:) = hEst(:,firstSymbol:lastSymbol,:,:); hEstUpdate(:,lastSymbol:L,:,:) = repmat(hEst(:,lastSymbol,:,:),1,ue.SymbolsPerSlot-lastSymbol+1); idxHEstUpdate = hEstUpdate ~= 0; % Indices of updated channel estimates hestInterp(idxHEstUpdate) = hEstUpdate(idxHEstUpdate); else % Hold previous channel estimates if this slot does not contain SRS hestInterp = repmat(hestInterp(:,end,:,:),1,ue.SymbolsPerSlot); end % PMI Selection % Select the precoder matrix indicators for a number of layers using % the interpolated channel estimates in the OFDM symbols specified by % csiSelectSymbols. The PMIs are estimated per CSI subband [pmi(:,nSlot+1),sinrSubband(:,nSlot+1,:),subbandIndices] = hPMISelect(nLayers, hestInterp(:,csiSelectSymbols,:,:), nvar, csiSubbandSize); % PMI selection SINR loss % Calculate the performance loss as a ratio of the SINR after precoding % with PMIs selected using a practical channel estimate and the SINR % after precoding with PMIs selected using a perfect channel estimate. % Calculate perfect channel estimate for perfect PMI selection hEstPerfect = nrPerfectChannelEstimate(ue,pathGains,pathFilters,offset); % Perfect noise estimate from noise realization noiseGrid = nrOFDMDemodulate(ue,noise(1+offset:end,:)); nvarPerfect = var(noiseGrid(:)); [loss(:,nSlot+1),pmiPerfect(:,nSlot+1)] = hPMISelectionSINRLoss(pmi(:,nSlot+1), nLayers, hEstPerfect(:,csiSelectSymbols,:,:), nvarPerfect); % Save a copy of all transmitted OFDM grids and channel estimates for % display purposes thisSlot = nSlot*L + (1:L); % Symbols of the current slot allTxGrid(:,thisSlot,:) = txGrid; allHest(:,thisSlot,:,:) = hEst; allHestInterp(:,thisSlot,:,:) = hestInterp; allHestPerfect(:,thisSlot,:,:) = hEstPerfect; end
Этот раздел отображает эти результаты для всех сконфигурированных систем координат:
Переданная сетка OFDM, содержащая SRS
Совершенные и практические оценки канала и ошибка расчета канала. Ошибка вычисляется как абсолютное значение различия между совершенными и практическими оценками канала.
Выбрал PMI с помощью совершенных и практических оценок канала и абсолютной погрешности PMI.
Средний SINR на поддиапазон после предварительного кодирования с лучшей предполагаемой PMI
Потеря эффективности SINR
% Create x-axis and y-axis vectors
symbols = 0:(ue.NSlot+1)*ue.SymbolsPerSlot-1;
slots = 0:ue.NSlot;
subcarriers = 1:ue.NSizeGrid*12;
resourceBlocks = 1:ue.NSizeGrid;
Отобразите переданную сетку OFDM, содержащую SRS
figure imagesc(symbols,subcarriers,abs(allTxGrid(:,:,1,1))); xlabel('OFDM symbol'); ylabel('Subcarrier'); axis xy; title('Transmitted SRS (port 1)');
Отобразите совершенные и практические оценки канала и ошибку расчета канала на паз и RB. Ошибка расчета канала задана как абсолютное значение различия между совершенными и практическими оценками канала.
% Remove first OFDM symbols not containing SRS to improve visualization of % channel estimation error hEstInterp = allHestInterp; idx = 1:(srs.SRSPeriod(2)*ue.SymbolsPerSlot + srs.SymbolStart); hEstInterp(:,idx,:,:) = NaN; hEstInterp((srs.NRB*12+1):end,:,:,:) = NaN; hChannelEstimationPlot(symbols,subcarriers,allHestPerfect,hEstInterp);
Отобразите выбранную PMI с помощью совершенных и практических оценок канала и выбора PMI потеря SINR на паз и RB. Потеря SINR задана как отношение SINR после предварительного кодирования с предполагаемым и совершенным PMIs. Оцененные PMIs получены с помощью практической оценки канала, и совершенные PMIs выбраны с помощью совершенной оценки канала.
% First expand loss from subbands into RBs for display purposes
pmiRB = hExpandSubbandToRB(pmi, csiSubbandSize, ue.NSizeGrid);
pmiPerfectRB = hExpandSubbandToRB(pmiPerfect, csiSubbandSize, ue.NSizeGrid);
lossRB = hExpandSubbandToRB(loss, csiSubbandSize, ue.NSizeGrid);
hPMIPlot(slots,resourceBlocks,pmiRB,pmiPerfectRB,lossRB);
Затем сравните PMIs, полученный с помощью и совершенных и практических оценок канала. Это указывает на отношение правильных к общему PMIs и местоположению в сетке ресурса, где ошибки произошли.
numLayers = min(size(allHestInterp,[3 4])); if numLayers ~= 1 pmiErr = sum( abs(pmi - pmiPerfect) > 0, [1 2])./ sum( ~isnan(pmi), [1 2]); TotPMIEst = sum(~isnan(pmi),[1 2]); fprintf('Number of estimated PMI: %d \n', TotPMIEst); fprintf(' Number of wrong PMI: %d \n', ceil(pmiErr*TotPMIEst)); fprintf(' Relative error: %.1f (%%) \n', pmiErr*100); else fprintf('For a single layer, PMI is always 0.\n'); end
Number of estimated PMI: 130 Number of wrong PMI: 3 Relative error: 2.3 (%)
Отобразите SINR на паз и RB, полученный после предварительного кодирования с PMI, которая максимизирует SINR на поддиапазон.
hBestSINRPlot(slots,resourceBlocks,sinrSubband,pmi,csiSubbandSize);
В этом примере показано, как использовать SRS для синхронизации, оценки канала и выбора PMI, обычно используемого в основанных на книге шифров восходящих режимах передачи. Пример также оценивает оценку канала и потерю эффективности выбора PMI с помощью SINR после предварительного кодирования.
Можно исследовать эффективность оценки канала и выбора PMI в более комплексных настройках. Увеличьте периодичность SRS и наблюдайте, как оценочное старение канала вводит задержку и ухудшает SINR после предварительного кодирования. Кроме того, можно исследовать эффективность при условиях скачкообразного движения частоты путем установки параметров SRS BHop <BSRS. В этой настройке оценочное старение канала не универсально в частоте.
Этот пример использует следующие функции помощника:
3GPP TS 38.211. "NR; Физические каналы и модуляция" Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
3GPP TS 38.101-4. "NR; передача радио Оборудования пользователя (UE) и прием. Часть 4: Требования к производительности" Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.
% Displays perfect and practical channel estimates and the channel % estimation error for the first transmit and receive ports. The channel % estimation error is defined as the absolute value of the difference % between the perfect and practical channel estimates. function hChannelEstimationPlot(symbols,subcarriers,allHestPerfect,allHestInterp) figure subplot(311) imagesc(symbols, subcarriers, abs(allHestPerfect(:,:,1,1))); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('Perfect Channel Estimate (TxAnt=1, RxAnt=1)'); subplot(312) imagesc(symbols, subcarriers, abs(allHestInterp(:,:,1,1)), ... 'AlphaData',~isnan(allHestInterp(:,:,1,1))) axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('SRS-based Practical Channel Estimate (TxAnt=1, RxAnt=1) '); % Display channel estimation error, defined as the difference between the % SRS-based and perfect channel estimates subplot(313) hestErr = abs(allHestInterp - allHestPerfect); imagesc(symbols, subcarriers, hestErr(:,:,1,1),... 'AlphaData',~isnan(hestErr(:,:,1,1))); axis xy; xlabel('OFDM symbol'); ylabel('Subcarrier'); colorbar; title('Channel Estimation Error (TxAnt=1, RxAnt=1)'); end % Displays the PMI evolution and PMI estimation SINR loss over time and % frequency. The SINR loss is defined as a ratio of the SINR after % precoding with estimated and perfect PMIs. Estimated PMIs are % obtained using a practical channel estimate and perfect PMIs are % selected using a perfect channel estimate. function hPMIPlot(slots,resourceBlocks,pmiRB,pmiPerfectRB,lossRB) figure subplot(311) imagesc(slots,resourceBlocks,pmiPerfectRB,'AlphaData',~isnan(pmiPerfectRB)); axis xy; c = caxis; cm = colormap; colormap( cm(1:floor(size(cm,1)/(c(2)-c(1)) -1):end,:) ); % Adjust colormap to PMI discrete values colorbar xlabel('Slot'); ylabel('Resource block'), title('PMI Selected using Perfect Channel Estimates') subplot(312) imagesc(slots,resourceBlocks,pmiRB,'AlphaData',~isnan(pmiRB)); axis xy; colorbar, xlabel('Slot'); ylabel('Resource block'), title('PMI Selected using SRS') subplot(313) imagesc(slots,resourceBlocks,lossRB,'AlphaData',~isnan(lossRB)); colormap(gca,cm) xlabel('Slot'); ylabel('Resource block'); axis xy; colorbar; title('PMI Estimation SINR Loss (dB)') end % Displays the SINR per resource block obtained after precoding with the % PMI that maximizes the SINR per subband. function hBestSINRPlot(slots,resourceBlocks,sinrSubband,pmi,csiBandSize) % Display SINR after precoding with best PMI bestSINRPerSubband = nan(size(sinrSubband,[1 2])); % Get SINR per subband and slot using best PMI [sb,nslot] = find(~isnan(pmi)); for i = 1:length(sb) bestSINRPerSubband(sb(i),nslot(i)) = sinrSubband(sb(i),nslot(i),pmi(sb(i),nslot(i))+1); end % First expand SINR from subbands into RBs for display purposes bestSINRPerRB = hExpandSubbandToRB(bestSINRPerSubband, csiBandSize, length(resourceBlocks)); figure sinrdb = 10*log10(abs(bestSINRPerRB)); imagesc(slots,resourceBlocks,sinrdb,'AlphaData',~isnan(sinrdb)); axis xy; colorbar; xlabel('Slot'); ylabel('Resource block') title('Average SINR Per Subband and Slot After Precoding with Best PMI (dB)') end % Expands a 2D matrix of values per subband in the first dimension into a % matrix of values per resource block. function rbValues = hExpandSubbandToRB(subbandValues, bandSize, NRB) lastBandSize = mod(NRB,bandSize); lastBandSize = lastBandSize + bandSize*(lastBandSize==0); rbValues = [kron(subbandValues(1:end-1,:),ones(bandSize,1));... subbandValues(end,:).*ones(lastBandSize,1)]; end