exponenta event banner

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

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

Введение

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

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

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

  • Получение DL CSI

  • Измерение помех

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

ZP-CSI-RS используется для обнаружения DL CSI и измерения помех. Он также маскирует определенные элементы ресурсов (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. "НР; Физические каналы и модуляция. "Проект партнерства 3-го поколения; Техническая спецификация на сеть радиодоступа группы.

См. также

Функции

Объекты