exponenta event banner

Фазовое моделирование и компенсация шума NR

Этот пример демонстрирует влияние фазового шума в 5G системе OFDM и показывает, как использовать опорный сигнал отслеживания фазы (PT-RS) для компенсации общей фазовой ошибки (CPE). В примере измеряется величина вектора ошибок (EVM) и частота битовых ошибок (BER) с компенсацией CPE и без нее.

Введение

В 5G NR 3GPP вводит новый опорный сигнал, называемый опорным сигналом отслеживания фазы (PT-RS), для борьбы с шумом генератора. Шум, производимый генераторами, приводит к фазовой модуляции информационного сигнала, приводя к значительным изменениям частотного спектра и временных свойств информационного сигнала. Это явление, связанное с генераторами, называется фазовым шумом. Фазовый шум, производимый в гетеродинах, вносит значительное ухудшение на частотах миллиметровых волн (ммВв) в зависимости от спектральной плотности мощности фазового шума. Фазовый шум приводит к CPE и интерференции между несущими (ICI). CPE приводит к идентичному повороту принятого символа в каждой поднесущей. ICI приводит к потере ортогональности между поднесущими. Из-за распределенной структуры PT-RS в частотной области в примере в первую очередь используется PT-RS для оценки и минимизации влияния CPE на производительность системы. Пример применяет фазовый шум к форме сигнала, состоящего из физического общего канала нисходящей линии связи (PDSCH), и показывает изменение в EVM и BER без и с компенсацией CPE. На этом рисунке показана цепочка обработки, реализованная в этом примере.

Моделирование фазового шума

Спектральная плотность мощности генератора моделирует фазовый шум. В этом примере используется модель многополюсного нуля для аппроксимации спектральной плотности мощности генератора. Используйте PNModel области simParameters структура для выбора модели фазового шума: «A», «B» или «C». Наборы параметров «A» и «B» получают из практических осцилляторов, работающих на частоте 30 ГГц и 60 ГГц соответственно, как описано в TDoc R1-163984. Набор параметров «C» получают из практического генератора, работающего на частоте 29,55 ГГц, как описано в TR 38.803 Раздел 6.1.10.

В примере используется несущая с интервалом между поднесущими 60 кГц для полосы пропускания передачи 50 МГц.

% Configure carrier
carrier = nrCarrierConfig;
carrier.SubcarrierSpacing = 60;
carrier.CyclicPrefix = 'normal';
carrier.NSizeGrid = 66;

% Set the operating frequency and choose the phase noise model
simParameters = [];
simParameters.Fc = 30e9; % Frequency in Hz
simParameters.PNModel = 'A'; % 'A' (TDoc R1-163984 Set A), 'B' (TDoc R1-163984 Set B), 'C' (TR 38.803)

% Get the sample rate
ofdmInfo = nrOFDMInfo(carrier);
sr = ofdmInfo.SampleRate;

% Phase noise level
foffsetLog = (4:0.1:log10(sr/2)); % Model offset from 1e4 Hz to sr/2 Hz
foffset = 10.^foffsetLog;         % Linear frequency offset
pn_PSD = hPhaseNoisePoleZeroModel(foffset,simParameters.Fc,simParameters.PNModel); % dBc/Hz

% Set phase noise level
pnoise = comm.PhaseNoise('FrequencyOffset',foffset,'Level',pn_PSD,'SampleRate',sr);
pnoise.RandomStream = "mt19937ar with seed";

% Visualize spectrum mask of phase noise
figure 
semilogx(foffset,pn_PSD)
xlabel('Frequency offset (Hz)')
ylabel('dBc/Hz')
title('Phase noise magnitude response')
grid on

Figure contains an axes. The axes with title Phase noise magnitude response contains an object of type line.

Конфигурирование PDSCH

Пример конфигурирует PDSCH, занимающий полную несущую, со схемой модуляции, установленной на '64QAM', и количеством уровней, установленным на 1. В примере по умолчанию используется один уровень и одно кодовое слово случайных некодированных битов.

% Set PDSCH parameters
pdsch = nrPDSCHConfig;
pdsch.PRBSet = 0:carrier.NSizeGrid-1;
pdsch.SymbolAllocation = [0 14];
pdsch.Modulation = '64QAM';
pdsch.NumLayers = 1;
pdsch.MappingType = 'A';
pdsch.NID = 1;
pdsch.RNTI = 2;

% Set DM-RS parameters
pdsch.DMRS.DMRSConfigurationType = 1;
pdsch.DMRS.DMRSTypeAPosition = 2;
pdsch.DMRS.DMRSAdditionalPosition = 0;
pdsch.DMRS.DMRSLength = 1;
pdsch.DMRS.DMRSPortSet = [];
pdsch.DMRS.NumCDMGroupsWithoutData = 1;
pdsch.DMRS.NIDNSCID = 1;
pdsch.DMRS.NSCID = 0;

% Set PT-RS parameters
pdsch.EnablePTRS = 1;
pdsch.PTRS.TimeDensity = 1;
pdsch.PTRS.FrequencyDensity = 2;
pdsch.PTRS.REOffset = '00';
pdsch.PTRS.PTRSPortSet = [];

Генерировать форму сигнала

Форма сигнала генерируется для 2 кадров и поля NumFrames из simParameters структура управляет количеством кадров формы сигнала. К числу соответствующих шагов относятся:

  • Генерировать случайное кодовое слово с битовой емкостью PDSCH

  • Получение символов PDSCH для случайного кодового слова и отображение их в сетку

  • Создание и отображение символов DM-RS в сетку

  • Создание и отображение символов PT-RS в сетку

  • Выполнение модуляции OFDM для полной сетки всех кадров

% Number of frames to generate the waveform
simParameters.NumFrames = 2;

% Get the number of slots in the waveform and number of symbols in a slot
numSlots = carrier.SlotsPerFrame*simParameters.NumFrames;
nSlotSymb = carrier.SymbolsPerSlot;

% Initialize the grid for specified number of frames
txGrid = zeros(carrier.NSizeGrid*12,nSlotSymb*numSlots,pdsch.NumLayers);

% Processing loop
txbits = [];
rng('default')
for slotIdx = 0:numSlots - 1
    % Set slot number
    carrier.NSlot = slotIdx;

    % Get PDSCH indices and structural information
    [pdschInd,pdschIndicesInfo] = nrPDSCHIndices(carrier,pdsch);

    % Generate random codeword(s)
    numCW = pdsch.NumCodewords; % Number of codewords
    data = cell(1,numCW);
    for i = 1:numCW
        data{i} = randi([0 1],pdschIndicesInfo.G(i),1);
        txbits = [txbits; data{i}]; %#ok<AGROW>
    end

    % Get modulated symbols
    pdschSym = nrPDSCH(carrier,pdsch,data);

    % Get DM-RS symbols and indices
    dmrsSym = nrPDSCHDMRS(carrier,pdsch);
    dmrsInd = nrPDSCHDMRSIndices(carrier,pdsch);

    % Get PT-RS symbols and indices
    ptrsSym = nrPDSCHPTRS(carrier,pdsch);
    ptrsInd = nrPDSCHPTRSIndices(carrier,pdsch);

    % Resource element mapping to slot grid
    slotGrid = nrResourceGrid(carrier,pdsch.NumLayers);
    slotGrid(pdschInd) = pdschSym;
    slotGrid(dmrsInd) = dmrsSym;
    slotGrid(ptrsInd) = ptrsSym;

    % Generate txGrid for all frames by mapping slotGrid at respective
    % locations
    txGrid(:,slotIdx*nSlotSymb+1:(slotIdx+1)*(nSlotSymb),:) = slotGrid;
end

% Perform OFDM modulation
carrier.NSlot = 0; % Reset the slot number to 0 for OFDM modulation
txWaveform = nrOFDMModulate(carrier,txGrid);

Применить фазовый шум

Примените фазовый шум к передаваемому сигналу. Чтобы четко наблюдать воздействие фазового шума, в примере не применяется никаких тепловых шумов или модели канала в дополнение к фазовому шуму. Пример применяет один и тот же фазовый шум ко всем слоям.

rxWaveform = zeros(size(txWaveform),'like',txWaveform);
for i = 1:size(txWaveform,2)
    rxWaveform(:,i) = pnoise(txWaveform(:,i));
    release(pnoise)
end

Приемник

Перед возвратом выровненных символов PDSCH и декодированных битов приемник выполняет следующие шаги:

  • Синхронизация по времени

  • Демодуляция OFDM

  • Оценка канала

  • Уравнивание

  • Оценка и коррекция СРЕ

  • Декодирование PDSCH

Для этапа оценки и коррекции CPE приемник использует логическое поле. CompensateCPE из simParameters структура. Поскольку в примере не используется канал распространения, этапы временной синхронизации, оценки канала и выравнивания не являются строго необходимыми. Однако эти шаги помогают исследовать эффекты фазового шума при введении канала.

В примере показаны выровненные символы совокупности, EVM и частота битовых ошибок с компенсацией CPE и без нее.

Случай 1: Без компенсации CPE

Чтобы отключить компенсацию CPE, установите поле CompensateCPE из simParameters структура до 0.

simParameters.CompensateCPE = 0;
[eqSymbols,rxbits] = practicalReceiver(carrier,pdsch,simParameters,rxWaveform);
refSymbols = getConstellationPoints(pdsch);
% Display the constellation diagram
figure
plot(eqSymbols,'.')
hold on
plot(refSymbols,'+')
title('Equalized Symbols Constellation Without CPE Compensation')
grid on
xlabel('In-Phase')
ylabel('Quadrature')

Figure contains an axes. The axes with title Equalized Symbols Constellation Without CPE Compensation contains 2 objects of type line.

% Display RMS EVM
evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation','ReferenceConstellation',refSymbols);
fprintf('RMS EVM (in percent) for equalized symbols without CPE compensation: %f%% \n',evm(eqSymbols))
RMS EVM (in percent) for equalized symbols without CPE compensation: 5.926056% 
% Display bit error rate
errorRate = nnz(rxbits-txbits)/numel(txbits);
fprintf('Bit error rate without CPE compensation: %f \n',errorRate)
Bit error rate without CPE compensation: 0.000495 

Случай 2: с компенсацией CPE

Для активизации компенсации CPE установите поле CompensateCPE из simParameters структура до 0. Используйте PT-RS для оценки CPE во всех местоположениях символов OFDM в слоте. Исправьте CPE в местоположениях символов OFDM в диапазоне символов OFDM PT-RS.

simParameters.CompensateCPE = 1;
[eqSymbolsCPE,rxbitsCPE] = practicalReceiver(carrier,pdsch,simParameters,rxWaveform);
% Display the constellation diagram
figure
plot(eqSymbolsCPE,'.')
hold on
plot(refSymbols,'+')
title('Equalized Symbols Constellation With CPE Compensation')
grid on
xlabel('In-Phase')
ylabel('Quadrature')

Figure contains an axes. The axes with title Equalized Symbols Constellation With CPE Compensation contains 2 objects of type line.

% Display RMS EVM
fprintf('RMS EVM (in percent) for equalized symbols with CPE compensation: %f%% \n',evm(eqSymbolsCPE))
RMS EVM (in percent) for equalized symbols with CPE compensation: 4.794181% 
% Display bit error rate
errorRateCPE = nnz(rxbitsCPE-txbits)/numel(txbits);
fprintf('Bit error rate with CPE compensation: %f \n',errorRateCPE)
Bit error rate with CPE compensation: 0.000066 

Дальнейшие исследования

  • Для визуализации влияния фазового шума измените частоту несущей, интервал между поднесущими, количество блоков ресурсов, схему модуляции и количество кадров.

  • Чтобы увидеть влияние фазового шума на совокупность, измените модель фазового шума.

  • Для анализа эффекта компенсации CPE с различными конфигурациями измените время и плотность частот PT-RS.

  • Визуализация воздействия фазового шума путем включения тепловых шумов и моделей каналов.

Резюме

Этот пример демонстрирует влияние фазового шума и показывает, как оценивать и корректировать CPE с помощью PT-RS. Пример также показывает, что компенсация CPE уменьшает EVM и улучшает частоту битовых ошибок. Отображаемый график совокупности показывает огромные ICI в частотах mmWave, указывая, что компенсация ICI должна выполняться в дополнение к компенсации CPE.

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

function [eqSymbols,rxbits] = practicalReceiver(carrier,pdsch,params,rxWaveform)
% Returns equalized modulated symbols after performing the timing
% estimation, OFDM demodulation, channel estimation, MMSE equalization,
% CPE estimation and correction, and PDSCH decoding.

    % Get the current slot number, number of slots, number of symbols
    % per slot, and total number of symbols
    nSlot = carrier.NSlot;
    numSlots = carrier.SlotsPerFrame*params.NumFrames;
    nSlotSymb = carrier.SymbolsPerSlot;
    numTotalSymbols = numSlots*nSlotSymb;

    % Get reference grid with DM-RS symbols
    dmrsSymCell = cell(1,numSlots);
    dmrsIndCell = cell(1,numSlots);
    refGrid = zeros(carrier.NSizeGrid*12,numTotalSymbols,pdsch.NumLayers);
    for NSlot = 0:numSlots-1
        carrier.NSlot = NSlot;
        slotGrid = nrResourceGrid(carrier,pdsch.NumLayers);
        dmrsSymCell{NSlot+1} = nrPDSCHDMRS(carrier,pdsch);
        dmrsIndCell{NSlot+1} = nrPDSCHDMRSIndices(carrier,pdsch);
        slotGrid(dmrsIndCell{NSlot+1}) = dmrsSymCell{NSlot+1};
        refGrid(:,NSlot*nSlotSymb+1:(NSlot+1)*(nSlotSymb),:) = slotGrid;
    end

    % Perform timing estimation and correction
    carrier.NSlot = nSlot;
    offset = nrTimingEstimate(carrier,rxWaveform,refGrid);
    waveformSync = rxWaveform(1+offset:end,:);

    % Perform OFDM demodulation on the received data to recreate the
    % resource grid, including padding in the event that practical
    % synchronization results in an incomplete slots being demodulated
    rxGrid = nrOFDMDemodulate(carrier,waveformSync);
    [K,L,R] = size(rxGrid);
    if (L < numTotalSymbols)
        rxGrid = cat(2,rxGrid,zeros(K,numTotalSymbols-L,R));
    end

    % Declare storage variables
    eqSymbols = [];  % equalized symbols for constellation plot
    rxbits = [];

    for NSlot = 0:numSlots-1
        % Extract grid for current slot
        currentGrid = rxGrid(:,NSlot*nSlotSymb+(1:nSlotSymb),:);

        % Get the PDSCH resources
        carrier.NSlot = NSlot;
        dmrsSymbols = dmrsSymCell{NSlot+1};
        dmrsIndices = dmrsIndCell{NSlot+1};
        ptrsSymbols = nrPDSCHPTRS(carrier,pdsch);
        ptrsIndices = nrPDSCHPTRSIndices(carrier,pdsch);
        [pdschIndices,pdschIndicesInfo] = nrPDSCHIndices(carrier,pdsch);

        % Channel estimation
        [estChannelGrid,noiseEst] = nrChannelEstimate(currentGrid,dmrsIndices,dmrsSymbols,"CDMLengths",pdsch.DMRS.CDMLengths);

        % Get PDSCH resource elements from the received grid
        [pdschRx,pdschHest] = nrExtractResources(pdschIndices,currentGrid,estChannelGrid);

        % Equalization
        pdschEq = nrEqualizeMMSE(pdschRx,pdschHest,noiseEst);

        % Common phase error (CPE) estimation and correction
        if params.CompensateCPE
            % Initialize temporary grid to store equalized symbols
            tempGrid = nrResourceGrid(carrier,pdsch.NumLayers);

            % Extract PT-RS symbols from received grid and estimated
            % channel grid
            [ptrsRx,ptrsHest,~,~,~,ptrsLayerIndices] = nrExtractResources(ptrsIndices,currentGrid,estChannelGrid,tempGrid);

            % Equalize PT-RS symbols and map them to tempGrid
            ptrsEq = nrEqualizeMMSE(ptrsRx,ptrsHest,noiseEst);
            tempGrid(ptrsLayerIndices) = ptrsEq;

            % Estimate the residual channel at the PT-RS locations in
            % tempGrid
            cpe = nrChannelEstimate(tempGrid,ptrsIndices,ptrsSymbols);

            % Sum estimates across subcarriers, receive antennas, and
            % layers. Then, get the CPE by taking the angle of the
            % resultant sum
            cpe = angle(sum(cpe,[1 3 4]));

            % Map the equalized PDSCH symbols to tempGrid
            tempGrid(pdschIndices) = pdschEq;

            % Correct CPE in each OFDM symbol within the range of reference
            % PT-RS OFDM symbols
            if numel(pdschIndicesInfo.PTRSSymbolSet) > 0
                symLoc = pdschIndicesInfo.PTRSSymbolSet(1)+1:pdschIndicesInfo.PTRSSymbolSet(end)+1;
                tempGrid(:,symLoc,:) = tempGrid(:,symLoc,:).*exp(-1i*cpe(symLoc));
            end

            % Extract PDSCH symbols
            pdschEq = tempGrid(pdschIndices);
        end

        % Store the equalized symbols and output them for all the slots
        eqSymbols = [eqSymbols; pdschEq]; %#ok<AGROW>

        % Decode the PDSCH symbols and get the hard bits
        eqbits = nrPDSCHDecode(carrier,pdsch,pdschEq);
        for i = 1:numel(eqbits)
            rxbits = [rxbits; double(eqbits{i}<0)]; %#ok<AGROW>
        end

    end

end

function sym = getConstellationPoints(pdsch)
%getConstellationPoints Constellation points
%   SYM = getConstellationPoints(PDSCH) returns the constellation points
%   SYM based on modulation schemes provided in PDSCH configuration object.

    sym = [];
    modulation = string(pdsch.Modulation);  % Convert modulation scheme to string type
    ncw = pdsch.NumCodewords;               % Number of codewords
    if ncw == 2 && (numel(modulation) == 1)
        modulation(end+1) = modulation(1);
    end
    % Get the constellation points
    for cwIndex = 1:ncw
        qm = strcmpi(modulation(cwIndex),{'QPSK','16QAM','64QAM','256QAM'})*[2 4 6 8]';
        sym = [sym; nrSymbolModulate(reshape(de2bi(0:2^qm-1,qm,'left-msb')',[],1),modulation(cwIndex))]; %#ok<AGROW>
    end

end

Связанные темы