Оценка канала NR Используя CSI-RS

В этом примере показано, как сгенерировать канал, утверждают информационный опорный сигнал (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 для заданного поставщика услуг и параметров конфигурации 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);

Выполните модуляцию 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

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

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');

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

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; Физические каналы и модуляция”. Проект Партнерства третьего поколения; Сеть радиодоступа Technical Specification Group.

Смотрите также

Функции

Объекты