Этот пример показывает, как использовать зондирующие опорные сигналы (SRS) для синхронизации, оценки канала и оценки информации о состоянии канала восходящей линии связи (CSI).
Зондирующие опорные сигналы - это физические сигналы восходящей линии связи, используемые пользовательским оборудованием (UE) для зондирования восходящего канала, включая синхронизацию и оценку CSI. CSI содержит индикатор качества канала (CQI), индикатор ранга (RI) и индикатор матрицы предварительного кодера (PMI). В этом примере показано, как использовать SRS для выбора соответствующего PMI в частотно-селективных шумовых каналах. Передачи, основанные на кодовой книге восходящей линии связи, используют PMI, как определено в TS 38.211, раздел 6.3.1.5 [1].
В этом примере выполняется моделирование, включающее:
Конфигурирование и передача SRS
Идеальная и практичная синхронизация и оценка канала
Оценка отношения сигнал/шум (SNR)
Выбор PMI
Оценка эффективности выбора PMI
Задайте длину моделирования в терминах количества кадров 10 мс. Установите точки SNR для моделирования. SNR определяется для каждого RE и применяется к каждой приемной антенне.
numFrames = 1; % 10 ms frames snr = 20; % SNR in dB
Задайте ключевые параметры моделирования. К ним относятся:
Полоса пропускания в блоках ресурсов (12 поднесущих на блок ресурсов)
Интервал между поднесущими: 15, 30, 60, 120, 240 (кГц)
Длина циклического префикса: обычный или расширенный
Количество передающих и приемных антенн: 1, 2 или 4.
Количество слоев. Она должна быть меньше или равна количеству передающих и приемных антенн.
Указанные параметры SRS включают в себя:
Количество антенных портов SRS: 1,2,4
Количество символов OFDM, выделенных для SRS на слот: 1,2,4
Запуск символа OFDM передачи SRS в пределах слота. Он должен быть (8... 13) для нормальных ПУ и (6... 11) для расширенных ПУ.
Исходное положение ПСУ по частоте, указанной в БР
Конфигурация полосы пропускания и скачкообразной перестройки частоты 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. SNR для каждого уровня определяется для RE и приемной антенны.
Выполните синхронизацию и демодуляцию OFDM. Для идеальной синхронизации импульсная характеристика канала восстанавливается и используется для синхронизации принятого сигнала. Для практической синхронизации принятый сигнал коррелируется с SRS. Синхронизированный сигнал затем демодулируется OFDM.
Выполните оценку канала. Для совершенной оценки канала импульсная характеристика канала восстанавливается и OFDM демодулируется для обеспечения оценки канала. Для практической оценки канала используется передаваемая SRS.
Выбор PMI. Оценка канала на основе SRS используется для выбора наилучшего PMI в каждом поддиапазоне оценки CSI. Критерий выбора PMI максимизирует среднее отношение сигнал-помеха-плюс-шум (SINR) после предварительного кодирования.
Потеря SINR при выборе PMI. Потери SINR вычисляются путем сравнения SINR после предварительного кодирования с оцененными и идеальными PMI. Идеальные PMI выбираются с использованием идеальных оценок канала.
% 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 с использованием идеальных и практичных оценок канала и потерь SINR выбора PMI на слот и RB. Потери SINR определяются как отношение SINR после предварительного кодирования с оцененными и совершенными PMI. Оцененные PMI получают, используя практическую оценку канала, и идеальные PMI выбирают, используя совершенную оценку канала.
% 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);

Затем сравните PMI, полученные с использованием как идеальных, так и практических оценок канала. Это указывает соотношение корректных и суммарных PMI и местоположение в сетке ресурсов, где произошли ошибки.
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 ТС 38.211. "НР; Физические каналы и модуляция (выпуск 15). "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.
3GPP ТС 38.101-4. "НР; Радиопередача и прием пользовательского оборудования (UE). Часть 4: Требования к производительности (выпуск 15). "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.
% 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