В этом примере показано, как сгенерировать канал, утверждают информационный сигнал ссылки (CSI-RS) символы и индексы для данного поставщика услуг и настройки ресурса CSI-RS, как задано в Разделе TS 38.211 7.4.1.5. Пример показывает, как сопоставить сгенерированные символы с сеткой ресурса поставщика услуг, выполняет оценку канала в стороне получателя и сравнивает предполагаемый канал с фактическим каналом.
CSI-RS является нисходящим специфичным ссылочным сигналом (DL). Стандарт NR задает нулевую степень (ZP) и "не обнуляют степень" (NZP) CSI-RSs.
Процессы оборудования пользователя (UE) используют NZP-CSI-RSs:
Мощность приемника сигнала L1-ссылки (RSRP) измерения для мобильности и управления лучом
Приобретение CSI DL
Интерференционное измерение
Время и отслеживание частоты
ZP-CSI-RS используется в приобретении CSI DL и интерференционном измерении. Это также маски определенные элементы ресурса (REs), чтобы сделать их недоступными передаче PDSCH. Как имя, на которое указывает ZP, ничто не передается в тех REs.
В этом примере показано, как использовать CSI-RS, чтобы выполнить оценку канала, которая формирует основание из приобретения CSI.
Создайте объект настройки поставщика услуг представление поставщика услуг на 5 МГц с интервалом поднесущей 15 кГц.
carrier = nrCarrierConfig; carrier.NSizeGrid = 25; carrier.SubcarrierSpacing = 15; carrier.NSlot = 1; carrier.NFrame = 0
carrier = nrCarrierConfig with properties: NCellID: 1 SubcarrierSpacing: 15 CyclicPrefix: 'normal' NSizeGrid: 25 NStartGrid: 0 NSlot: 1 NFrame: 0 Read-only properties: SymbolsPerSlot: 14 SlotsPerSubframe: 1 SlotsPerFrame: 10
Создайте объект настройки CSI-RS представление двух ресурсов CSI-RS, NZP с номером строки 3 и ZP с номером строки 5.
csirs = nrCSIRSConfig; csirs.CSIRSType = {'nzp','zp'}; csirs.CSIRSPeriod = {[5 1],[5 1]}; csirs.Density = {'one','one'}; csirs.RowNumber = [3 5]; csirs.SymbolLocations = {1,6}; csirs.SubcarrierLocations = {6,4}; csirs.NumRB = 25
csirs = nrCSIRSConfig with properties: CSIRSType: {'nzp' 'zp'} CSIRSPeriod: {[5 1] [5 1]} RowNumber: [3 5] Density: {'one' 'one'} SymbolLocations: {[1] [6]} SubcarrierLocations: {[6] [4]} NumRB: 25 RBOffset: 0 NID: 0 Read-only properties: NumCSIRSPorts: [2 4] CDMType: {'FD-CDM2' 'FD-CDM2'}
Рассмотрите масштабирование степени CSI-RS в дБ.
powerCSIRS = 0; disp(['CSI-RS power scaling: ' num2str(powerCSIRS) ' dB']);
CSI-RS power scaling: 0 dB
Сгенерируйте символы CSI-RS для заданного поставщика услуг и параметров конфигурации CSI-RS. Примените масштабирование степени.
sym = nrCSIRS(carrier,csirs); csirsSym = sym*db2mag(powerCSIRS);
Переменная csirsSym
вектор-столбец, содержащий символы CSI-RS.
Сгенерируйте индексы CSI-RS для заданного поставщика услуг и параметров конфигурации CSI-RS.
csirsInd = nrCSIRSIndices(carrier,csirs);
Переменная csirsInd
также вектор-столбец того же размера как тот из csirsSym
.
Когда вы конфигурируете и ZP и ресурсы NZP, генерация сигналов ZP берет приоритет над генерацией сигналов NZP.
Вычислите размерности сетки поставщика услуг и создайте пустую сетку для одного паза.
NumRB = carrier.NSizeGrid; K = NumRB*12; % Number of subcarriers L = carrier.SymbolsPerSlot; % Number of OFDM symbols per slot ports = max(csirs.NumCSIRSPorts); % Number of antenna ports gridSize = [K L ports]; % Initialize the carrier grid for one slot txGrid = complex(zeros(gridSize));
Выполните отображение элемента ресурса.
txGrid(csirsInd) = csirsSym;
Постройте местоположения CSI-RS (и ZP и NZP) в сетке.
plotGrid(gridSize,csirsInd,csirsSym);
Получите сопутствующую информацию модуляции OFDM и выполните модуляцию OFDM, чтобы сгенерировать форму волны временного интервала.
% Get OFDM modulation related information gnb.NRB = NumRB; gnb.SubcarrierSpacing = carrier.SubcarrierSpacing; gnb.CyclicPrefix = carrier.CyclicPrefix; OFDMInfo = hOFDMInfo(gnb); % Perform OFDM modulation txWaveform = hOFDMModulate(gnb,txGrid);
Сконфигурируйте количество получения антенн.
R = 4;
Сконфигурируйте канал.
channel = nrTDLChannel;
channel.NumTransmitAntennas = ports;
channel.NumReceiveAntennas = R;
channel.DelayProfile = 'TDL-C';
channel.MaximumDopplerShift = 10;
channel.DelaySpread = 1e-8
channel = nrTDLChannel with properties: DelayProfile: 'TDL-C' DelaySpread: 1.0000e-08 MaximumDopplerShift: 10 SampleRate: 30720000 MIMOCorrelation: 'Low' Polarization: 'Co-Polar' TransmissionDirection: 'Downlink' NumTransmitAntennas: 4 NumReceiveAntennas: 4 NormalizePathGains: true InitialTime: 0 NumSinusoids: 48 RandomStream: 'mt19937ar with seed' Seed: 73 NormalizeChannelOutputs: true
На основе сконфигурированного канала добавьте нули к переданной форме волны, чтобы составлять задержку канала.
chInfo = info(channel); maxChDelay = ceil(max(chInfo.PathDelays*channel.SampleRate)) + chInfo.ChannelFilterDelay; txWaveform = [txWaveform; zeros(maxChDelay,size(txWaveform,2))];
Передайте форму волны через канал.
[rxWaveform,pathGains] = channel(txWaveform);
Чтобы произвести фактическое распространение образовывают канал H_actual
, выполните совершенную оценку канала.
pathFilters = getPathFilters(channel); initialNSlot = carrier.NSlot; SCS = carrier.SubcarrierSpacing; H_actual = nrPerfectChannelEstimate(pathGains,pathFilters,NumRB,SCS,initialNSlot);
Добавьте шум AWGN в форму волны.
SNRdB = 50; % in dB SNR = 10^(SNRdB/20); % Linear value N0 = 1/(sqrt(2.0*R*double(OFDMInfo.Nfft))*SNR); % Noise variance rng(0); noise = N0*complex(randn(size(rxWaveform)),randn(size(rxWaveform))); rxWaveform = rxWaveform + noise
rxWaveform = 7690×4 complex
0.0000 - 0.0001i -0.0001 + 0.0000i -0.0001 - 0.0000i -0.0001 + 0.0000i
0.0001 - 0.0001i -0.0000 + 0.0000i 0.0001 - 0.0000i -0.0000 - 0.0000i
-0.0001 + 0.0000i 0.0001 + 0.0000i -0.0001 - 0.0000i -0.0001 + 0.0000i
0.0000 - 0.0000i 0.0000 - 0.0000i -0.0001 + 0.0001i -0.0000 - 0.0000i
0.0000 + 0.0001i 0.0001 - 0.0000i 0.0000 - 0.0000i 0.0001 - 0.0000i
-0.0001 + 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i 0.0001 + 0.0000i
-0.0000 - 0.0001i -0.0000 - 0.0001i -0.0001 - 0.0000i -0.0000 - 0.0000i
0.0000 + 0.0001i -0.0001 - 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i
0.0002 - 0.0001i 0.0001 + 0.0001i 0.0001 + 0.0000i 0.0001 + 0.0000i
0.0001 + 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0001i 0.0000 - 0.0001i
⋮
Выполните синхронизацию синхронизации с помощью NZP-CSI-RS. Чтобы оценить смещение синхронизации, используйте nrTimingEstimate
и рассмотрите NZP-CSI-RS как ссылку.
% Disable ZP-CSI-RS resource, not going to be used for timing and channel % estimation csirs.CSIRSPeriod = {[5 1],'off'}; % Generate reference symbols and apply power scaling refSym = db2mag(powerCSIRS)*nrCSIRS(carrier,csirs); % Generate reference indices refInd = nrCSIRSIndices(carrier,csirs); offset = nrTimingEstimate(rxWaveform,NumRB,SCS,initialNSlot,refInd,refSym)
offset = 7
rxWaveform = rxWaveform(1+offset:end,:);
OFDM демодулируют полученную форму волны временного интервала.
rxGrid = hOFDMDemodulate(gnb,rxWaveform); % Of size K-by-L-by-R
Выполните практическую оценку канала с помощью NZP-CSI-RS. Убедитесь символы CSI-RS csirsSym
имеют тот же тип CDM.
cdmLen = [2 1]; % Corresponds to CDMType = 'FD-CDM2' [H_est,nVar] = nrChannelEstimate(rxGrid,refInd,refSym,'CDMLengths',cdmLen); estSNR = -10*log10(nVar); disp(['estimated SNR = ' num2str(estSNR) ' dB'])
estimated SNR = 27.4579 dB
Постройте предполагаемый канал и фактический канал между первой антенной передачи и сначала получением антенны.
figure; % Plot the estimated channel subplot(1,2,1) imagesc(abs(H_est(:,:,1,1))); colorbar; title('Estimated Channel') axis xy; xlabel('OFDM Symbols'); ylabel('Subcarriers'); % Plot the actual channel subplot(1,2,2) imagesc(abs(H_actual(:,:,1,1))); colorbar; title('Actual Channel') axis xy; xlabel('OFDM Symbols'); ylabel('Subcarriers');
Вычислите ошибку оценки канала.
H_err = (H_est - H_actual(:,:,:,1:size(H_est,4))); [minErr,maxErr] = bounds(abs(H_err),'all'); disp(['Absolute value of the channel estimation error is in the range of [' num2str(minErr) ', ' num2str(maxErr) ']'])
Absolute value of the channel estimation error is in the range of [1.4479e-05, 0.035061]
function plotGrid(gridSize,csirsInd,csirsSym) % plotGrid(GRIDSIZE,CSIRSIND,CSIRSSYM) plots the carrier grid of size GRIDSIZE % by populating the grid with CSI-RS symbols using CSIRSIND and CSIRSSYM. figure() cmap = colormap(gcf); chpval = {20,2}; chpscale = 0.25*length(cmap); % Scaling factor tempSym = csirsSym; tempSym(tempSym ~= 0) = chpval{1}; % Replacing non-zero-power symbols tempSym(tempSym == 0) = chpval{2}; % Replacing zero-power symbols tempGrid = complex(zeros(gridSize)); tempGrid(csirsInd) = tempSym; image(chpscale*tempGrid(:,:,1)); % Multiplied with scaling factor for better visualization axis xy; names = {'NZP CSI-RS','ZP CSI-RS'}; clevels = chpscale*[chpval{:}]; N = length(clevels); L = line(ones(N),ones(N),'LineWidth',8); % Generate lines % Index the color map and associate the selected colors with the lines set(L,{'color'},mat2cell(cmap( min(1+clevels,length(cmap) ),:),ones(1,N),3)); % Set the colors according to cmap % Create legend legend(names{:}); title('Carrier Grid Containing CSI-RS') xlabel('OFDM Symbols'); ylabel('Subcarriers'); end
[1] 3GPP TS 38.211. “NR; Физические каналы и модуляция”. Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.