Оценка канала NR с использованием CSI-RS

Этот пример показов, как сгенерировать символы и индексы информационного опорного сигнала состояния канала (CSI-RS) для данной несущей и ресурсного строения CSI-RS, как определено в разделе 7.4.1.5 TS 38.211. Пример показывает, как сопоставить сгенерированные символы с ресурсной сеткой несущей, выполняет оценку канала на стороне приемника и сравнивает оцененный канал с фактическим каналом.

Введение

CSI-RS является специфичным для нисходящей линии связи (DL) опорным сигналом. Стандарт NR задает CSI-RS с нулевой мощностью (ZP) и степенью (NZP).

Процессы пользовательского оборудования (UE) используют NZP-CSI-RSs:

  • L1-Reference измерения мощности приемника (RSRP) сигнала для управления мобильностью и лучом

  • Приобретение CSI DL

  • Измерение интерференции

  • Отслеживание времени и частоты

ZP-CSI-RS используется для обнаружения CSI DL и измерения помех. Он также маскирует определенные элементы ресурса (RE), чтобы сделать их недоступными для передачи PDSCH. Как указывает имя ZP, в этих RE ничего не передается.

Этот пример показывает, как использовать 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 для указанной несущей и параметров конфигурации 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.

Инициализация сетки поставщика услуг

Инициализируйте сетку ресурсов поставщика услуг для одного паза.

ports = max(csirs.NumCSIRSPorts);   % Number of antenna ports
txGrid = nrResourceGrid(carrier,ports);

Отобразите символы CSI-RS на сетке поставщика услуг

Выполните отображение ресурсного элемента.

txGrid(csirsInd) = csirsSym;

Постройте график расположения CSI-RS (ZP и NZP) в сетке.

plotGrid(size(txGrid),csirsInd,csirsSym);

Figure contains an axes. The axes with title Carrier Grid Containing CSI-RS contains 3 objects of type image, line. These objects represent NZP CSI-RS, ZP CSI-RS.

Выполните модуляцию OFDM

Выполните OFDM модуляцию, чтобы сгенерировать сигнал во временной области.

[txWaveform,ofdmInfo] = nrOFDMModulate(carrier,txGrid);

Пройдите форму волны временной области через канал и добавьте шум AWGN

Сконфигурируйте количество приемных антенн.

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
    TransmitAndReceiveSwapped: false

На основе сконфигурированного канала добавьте нули к переданной форме волны, чтобы учесть задержку канала.

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);
H_actual = nrPerfectChannelEstimate(carrier,pathGains,pathFilters);

Добавьте шум 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(carrier,rxWaveform,refInd,refSym)
offset = 7
rxWaveform = rxWaveform(1+offset:end,:);

OFDM демодулирует принятую форму волны временной области.

rxGrid = nrOFDMDemodulate(carrier,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(carrier,rxGrid,refInd,refSym,'CDMLengths',cdmLen);
estSNR = -10*log10(nVar);
disp(['estimated SNR = ' num2str(estSNR) ' dB'])
estimated SNR = 27.4577 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');

Figure contains 2 axes. Axes 1 with title Estimated Channel contains an object of type image. Axes 2 with title Actual Channel contains an object of type image.

Вычислите ошибку расчета канала.

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 [4.9184e-06, 0.035047]

Локальные функции

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; Физические каналы и модуляция ". 3rd Генерация Partnership Project; Группа технических спецификаций Радиосеть доступ.

См. также

Функции

Объекты

Для просмотра документации необходимо авторизоваться на сайте