Эффект межкамеры на пропускную способность PDSCH с приемником MMSE-IRC

Этот пример демонстрирует эффект межкамеры на пропускную способность PDSCH с минимальной средней квадратной ошибкой (MMSE) и минимальной средней квадратной ошибкой - объединение отклонения помех (MMSE-IRC) приемника. Рассматриваются обслуживающая камера и два интерферирующих eNodeB. Используются условия, указанные в TS 36.101, раздел 8.2.1.4.1B [1].

Введение

Этот пример измеряет достигнутую пропускную способность для пользовательского оборудования (UE) в обслуживающей камере с межкамерой от двух доминирующих интерферирующих камер. Обслуживающая камера использует R.47 RMC в режиме FDD. Параметры для обслуживающей и мешающей камер, включая уровни степени и уровни шума, описаны в TS 36.101, раздел 8.2.1.4.1B [1].

Настройки симуляции

Длина симуляции по умолчанию устанавливается равной четырём системам координат, чтобы сохранить время симуляции низким. Увеличение NFrames увеличение времени симуляции и получение статистически значимых результатов производительности. Используйте переменную eqMethod для установки эквализации приемника, которое может принимать значения 'MMSE' и 'MMSE _ IRC'.

NFrames = 4;               % Number of frames
eqMethod = 'MMSE_IRC';     % MMSE, MMSE_IRC

Сигнал, помехи и уровни шумовой степени заданы в тесте (TS 36.101, Section 8.2.1.4.1B [1]) с использованием следующих параметров: отношение сигнал/помеха плюс шум (SINR), доминирующая доля помех (DIP) и спектральная плотность мощности шума.

SINR = 0.8;        % SINR in dB
DIP2 = -1.73;      % DIP in dB for cell 2
DIP3 = -8.66;      % DIP in dB for cell 3
Noc = -98;         % dBm/15kHz average power spectral density

DIP характеризует каждую из интерферирующих камер и определяется как:

$DIP2 = Ior2/(Ior2 + Ior3 + Noc)$

$DIP3 = Ior3/(Ior2 + Ior3 + Noc)$

где$Ior2$ и$Io3$ являются средней спектральной плотностью мощности приемника от камер 2 и 3, соответственно.$Noc$ - средняя спектральная плотность степени источника белого шума (средняя степень на ресурсный элемент, нормированная относительно интервала между поднесущими).

Обслуживание строения eNodeB

Рассматриваемый тест использует R.47 опорного канала в режиме FDD. Параметры, сопоставленные с этим опорным каналом, указаны в (TS 36.101, таблица A.3.3.2.1-2 [1]). Структура enb1 характеризует обслуживающую камеру.

% Set the random number generator seed
rng('default');

% Set cell 1 eNodeB configuration according to R.47
simulationParameters = struct;
simulationParameters.NDLRB = 50;
simulationParameters.CellRefP = 2;
simulationParameters.NCellID = 0;
simulationParameters.CFI = 2;
simulationParameters.DuplexMode = 'FDD';
simulationParameters.TotSubframes = 1; % This is not the total number of
% subframes used in the simulation, just the number of subframes we
% generate per call to the waveform generator.

% Specify PDSCH configuration substructure
simulationParameters.PDSCH.TxScheme = 'SpatialMux';
simulationParameters.PDSCH.Modulation = {'16QAM'};
simulationParameters.PDSCH.NLayers = 1;
simulationParameters.PDSCH.Rho = -3;
simulationParameters.PDSCH.PRBSet = (0:49)';
% Table A.3.3.2.1-2, TS 36.101
simulationParameters.PDSCH.TrBlkSizes = [8760 8760 8760 8760 8760 0 8760 8760 8760 8760];
% Table A.3.3.2.1-2, TS 36.101
simulationParameters.PDSCH.CodedTrBlkSizes = [24768 26400 26400 26400 26400 0 26400 26400 26400 26400];
simulationParameters.PDSCH.CSIMode = 'PUCCH 1-1';
simulationParameters.PDSCH.PMIMode = 'Wideband';
simulationParameters.PDSCH.CSI = 'On';
simulationParameters.PDSCH.W = [];
simulationParameters.PDSCH.CodebookSubset = '1111';

% Specify PDSCH OCNG configuration
simulationParameters.OCNGPDSCHEnable = 'On';             % Enable OCNG fill
simulationParameters.OCNGPDSCHPower = -3;                % OCNG power same as PDSCH Rho
simulationParameters.OCNGPDSCH.RNTI = 0;                 % Virtual UE RNTI
simulationParameters.OCNGPDSCH.Modulation = 'QPSK';      % OCNG symbol modulation
simulationParameters.OCNGPDSCH.TxScheme = 'TxDiversity'; % OCNG transmission mode 2

Функции lteRMCDLTool чтобы сгенерировать параметры eNodeB по умолчанию, не указанные в simulationParameters.

enb1 = lteRMCDL(simulationParameters);

Помехи строениям eNodeBs

Две интерферирующие камеры характеризуются структурами enb2 и enb3. Они имеют те же значения полей, что и обслуживающая камера (enb1) за следующими исключениями:

  • Идентификатор камеры принимает значения 1 и 2 для enb2 и enb3, соответственно.

  • Схема модуляции PDSCH задается моделью помех режима 4 (TM4) передачи (TS 36.101, B.5.3 [1]). Это значение изменяется на основе субкадров по субкадрам и изменяется в основном цикле обработки.

% Cell 2
enb2 = enb1;
enb2.NCellID = 1;
enb2.OCNGPDSCHEnable = 'Off';

% Cell 3
enb3 = enb1;
enb3.NCellID = 2;
enb3.OCNGPDSCHEnable = 'Off';

Оценка канала распространения и Строений

Этот раздел настраивает параметры для трех каналов распространения

  • Обслуживание камеры в UE

  • Первая интерферирующая камера к UE

  • Вторая интерферирующая камера в UE

Как указано в (TS 36.101, таблица 8.2.1.4.1B-2 [1]) EVA5 используются условия канала.

% eNodeB1 to UE propagation channel
channel1 = struct;                    % Channel config structure
channel1.Seed = 20;                   % Channel seed
channel1.NRxAnts = 2;                 % 2 receive antennas
channel1.DelayProfile ='EVA';         % Delay profile
channel1.DopplerFreq = 5;             % Doppler frequency
channel1.MIMOCorrelation = 'Low';     % Multi-antenna correlation
channel1.NTerms = 16;                 % Oscillators used in fading model
channel1.ModelType = 'GMEDS';         % Rayleigh fading model type
channel1.InitPhase = 'Random';        % Random initial phases
channel1.NormalizePathGains = 'On';   % Normalize delay profile power
channel1.NormalizeTxAnts = 'On';      % Normalize for transmit antennas

Частота дискретизации канала зависит от размера БПФ, используемого в модуляторе OFDM. Это можно получить с помощью функции lteOFDMInfo.

ofdmInfo = lteOFDMInfo(enb1);
channel1.SamplingRate = ofdmInfo.SamplingRate;

% eNodeB2 (interference) to UE propagation channel
channel2 = channel1;
channel2.Seed = 122;                  % Channel seed

% eNodeB3 (interference) to UE propagation channel
channel3 = channel1;
channel3.Seed = 36;                   % Channel seed

Переменная perfectChanEstimator управляет поведением оценщика канала. Допустимые значения true или false. Когда установлено значение true в противном случае используется совершенная оценка канала, основанная на значениях принятых пилот-сигналов.

% Channel estimator behavior
perfectChanEstimator = true;

% The channel estimator configuration structure is defined below. The
% frequency and time averaging window sizes are chosen to span a relatively
% large number of resource elements. The large window sizes are chosen to
% average as much as possible noise and interference in the resource
% elements. Note that too large an averaging window in time and/or frequency
% will cause loss of information due to averaging out the channel variations.
% This produces an increasingly imperfect channel estimate which can affect
% the performance of the equalizer.

cec = struct;                        % Channel estimation config structure
cec.PilotAverage = 'UserDefined';    % Type of pilot symbol averaging
cec.FreqWindow = 31;                 % Frequency window size
cec.TimeWindow = 23;                 % Time window size
cec.InterpType = 'Cubic';            % 2D interpolation type
cec.InterpWindow = 'Centered';       % Interpolation window type
cec.InterpWinSize = 1;               % Interpolation window size

Уровни сигнала, помехи и Степени шума

Из SINR, DIP и Noc значения мы можем вычислить коэффициенты масштабирования для применения к сигналам от обслуживающей и интерферирующей камер, а также уровень шума.

Функция hENBscalingFactors.m вычисляет коэффициенты масштабирования K1, K2 и K3 применить к каналу отфильтрованные формы волны из трёх рассматриваемых камер. Коэффициент масштабирования No для применения к белому Гауссову шуму также вычисляется. Эти значения гарантируют, что степень сигнала, степень помех и степень шума соответствуют заданным значениям SINR и DIP.

% Channel noise setup
nocLin = 10.^(Noc/10)*(1e-3); % linear  in Watts
% Take into account FFT (OFDM) scaling
No = sqrt(nocLin/(2*double(ofdmInfo.Nfft)));

% Signal and interference amplitude scaling factors calculation
[K1, K2, K3] = hENBscalingFactors(DIP2, DIP3, Noc, SINR, enb1, enb2, enb3);

Инициализация основного цикла

Перед основным циклом обработки нам нужно настроить гибридные процессы автоматического запроса повторения (HARQ) и инициализировать промежуточные переменные. Последовательность идентификаторов процесса HARQ, соответствующая строению, выводится lteRMCDLTool функция. Процесс HARQ (с идентификаторами 1-8) сопоставлен с каждым подкадром, который имеет запланированные данные. Значение 0 в последовательности указывает, что данные не передаются в соответствующем подкадре. Это может быть из-за того, что это подкадр восходящей линии связи или из-за того, что данные не запланированы в подкадре нисходящей линии связи (подобно подкадру 5 в этом примере).

% Initialize state of all HARQ processes
harqProcesses = hNewHARQProcess(enb1);
% Initialize HARQ process IDs to 1 as the first non-zero transport
% block will always be transmitted using the first HARQ process. This
% will be updated with the full sequence output by lteRMCDLTool after
% the first call to the function
harqProcessSequence = 1;

% Set up variables for the main loop
lastOffset = 0;       % Initialize frame timing offset from previous frame
frameOffset = 0;      % Initialize frame timing offset
nPMI = 0;             % Initialize the number of precoder matrix indication
                      % (PMI) set calculated
blkCRC = [];          % Block CRC for all considered subframes
bitTput = [];         % Number of successfully received bits per subframe
txedTrBlkSizes = [];  % Number of transmitted bits per subframes
% Vector of total number of bits transmitted, calculated for each subframe.
runningMaxThPut = [];
% Vector storing the number of successfully received bits, calculated for
% each subframe.
runningSimThPut = [];

% Obtain the number of transmit antennas.
dims = lteDLResourceGridSize(enb1);
P = dims(3);

% Assign the redundancy version sequence for each codeword and transport
% block sizes for each subframe
rvSequence = enb1.PDSCH.RVSeq;
trBlkSizes = enb1.PDSCH.TrBlkSizes;

% Set the PMI delay for the closed-loop spatial multiplexing
pmiDelay = 8; % As specified in TS 36.101, Table 8.2.1.4.1B-1

% Initialize PMIs for the first 'pmiDelay' subframes
pmiDims = ltePMIInfo(enb1,enb1.PDSCH);
txPMIs = zeros(pmiDims.NSubbands, pmiDelay);

% Flag to indicate if a valid PMI feedback is available from the UE
pmiReady = false;

Основной цикл

Основной цикл повторяет указанное количество подкадров. Для каждого нисходящего субкадра с данными выполняются следующие операции:

  • Проверьте процессы HARQ и определите, отправлять ли новый пакет или требуется повторная передача

  • Сгенерируйте нисходящие формы волны из обслуживающей камеры и интерферирующих камер

  • Фильтруйте формы волны с каналами распространения и добавляйте белый Гауссов шум

  • Синхронизируйте и OFDM демодулируйте сигнал от обслуживающей камеры

  • Оцените канал распространения для обслуживающей камеры

  • Выравнивание и декодирование PDSCH

  • Декодируйте DL-SCH

  • Определите пропускную способность эффективности используя полученный CRC блока

fprintf('\nSimulating %d frame(s)\n',NFrames);

% Main for loop: for all subframes
for subframeNo = 0:(NFrames*10-1)

    % Reinitialize channel seed for each subframe to increase variability
    channel1.Seed = 1+subframeNo;
    channel2.Seed = 1+subframeNo+(NFrames*10);
    channel3.Seed = 1+subframeNo+2*(NFrames*10);

    % Update subframe number
    enb1.NSubframe = subframeNo;
    enb2.NSubframe = subframeNo;
    enb3.NSubframe = subframeNo;

    duplexInfo = lteDuplexingInfo(enb1);

    if  duplexInfo.NSymbolsDL ~= 0 % target only downlink subframes

        % Get HARQ process ID for the subframe from HARQ process sequence
        harqID = harqProcessSequence(mod(subframeNo, length(harqProcessSequence))+1);
        % If there is a transport block scheduled in the current subframe
        % (indicated by non-zero 'harqID'), perform transmission and
        % reception. Otherwise, continue to the next subframe.
        if harqID == 0
            continue;
        end

        % Update current HARQ process
        harqProcesses(harqID) = hHARQScheduling( ...
            harqProcesses(harqID), subframeNo, rvSequence);

        % Extract the current subframe transport block size(s)
        trBlk = trBlkSizes(:, mod(subframeNo, 10)+1).';

        % Update the PDSCH transmission config with HARQ process state
        enb1.PDSCH.RVSeq = harqProcesses(harqID).txConfig.RVSeq;
        enb1.PDSCH.RV = harqProcesses(harqID).txConfig.RV;
        dlschTransportBlk = harqProcesses(harqID).data;

        % Set the PMI to the appropriate value in the delay queue
        if strcmpi(enb1.PDSCH.TxScheme,'SpatialMux')
            pmiIdx = mod(subframeNo, pmiDelay);      % PMI index in delay queue
            enb1.PDSCH.PMISet = txPMIs(:, pmiIdx+1); % Set PMI
        end

        % Create transmit waveform
        [tx,~,enbOut] = lteRMCDLTool(enb1, dlschTransportBlk);

        % Pad 25 samples to cover the range of delays expected from channel
        % modeling (a combination of implementation delay and channel delay
        % spread)
        txWaveform1 = [tx; zeros(25, P)];

        % Get the HARQ ID sequence from 'enbOut' for HARQ processing
        harqProcessSequence = enbOut.PDSCH.HARQProcessSequence;

        % Generate interferer model as per as per TS 36.101, B.5.3. The
        % function hTM4InterfModel generates the interferer transmit signal.
        txWaveform2 = [hTM4InterfModel(enb2); zeros(25,P)];
        txWaveform3 = [hTM4InterfModel(enb3); zeros(25,P)];

        % Specify channel time for the present subframe
        channel1.InitTime = subframeNo/1000;
        channel2.InitTime = channel1.InitTime;
        channel3.InitTime = channel1.InitTime;

        % Pass data through the channel
        rxWaveform1 = lteFadingChannel(channel1,txWaveform1);
        rxWaveform2 = lteFadingChannel(channel2,txWaveform2);
        rxWaveform3 = lteFadingChannel(channel3,txWaveform3);

        % Generate noise
        noise = No*complex(randn(size(rxWaveform1)), ...
            randn(size(rxWaveform1)));

        % Add AWGN to the received time domain waveform
        rxWaveform = K1*rxWaveform1 + K2*rxWaveform2 + K3*rxWaveform3 + noise;

        % Receiver
        % Once every frame, on subframe 0, calculate a new synchronization
        % offset
        if (mod(subframeNo,10) == 0)
            frameOffset = lteDLFrameOffset(enb1, rxWaveform);
            if (frameOffset > 25)
                frameOffset = lastOffset;
            end
            lastOffset = frameOffset;
        end

        % Synchronize the received waveform
        rxWaveform = rxWaveform(1+frameOffset:end, :);

        % Scale rxWaveform by 1/K1 to avoid numerical issues with
        % channel decoding stages
        rxWaveform = rxWaveform/K1;

        % Perform OFDM demodulation on the received data to obtain the
        % resource grid
        rxSubframe = lteOFDMDemodulate(enb1, rxWaveform);

        % Perform channel estimation
        if(perfectChanEstimator)
            estChannelGrid = lteDLPerfectChannelEstimate(enb1, channel1, frameOffset);
            noiseInterf = K2*rxWaveform2 + K3*rxWaveform3 + noise;
            noiseInterf = noiseInterf/K1;
            noiseGrid = lteOFDMDemodulate(enb1, noiseInterf(1+frameOffset:end ,:));
            noiseEst = var(noiseGrid(:));
        else
            [estChannelGrid, noiseEst] = lteDLChannelEstimate( ...
                enb1, enb1.PDSCH, cec, rxSubframe);
        end

        % Get PDSCH indices
        pdschIndices = ltePDSCHIndices(enb1,enb1.PDSCH,enb1.PDSCH.PRBSet);
        % Get PDSCH resource elements. Scale the received subframe by
        % the PDSCH power factor Rho.
        [pdschRx, pdschHest] = lteExtractResources(pdschIndices, ...
            rxSubframe*(10^(-enb1.PDSCH.Rho/20)), estChannelGrid);

        % Perform equalization and deprecoding
        if strcmp(eqMethod,'MMSE')
            % MIMO equalization and deprecoding (MMSE based)
            [rxDeprecoded,csi] = lteEqualizeMIMO(enb1,enb1.PDSCH,...
                pdschRx,pdschHest,noiseEst);
        else
            % MIMO equalization and deprecoding (MMSE-IRC based)
            [rxDeprecoded,csi] = hEqualizeMMSEIRC(enb1,enb1.PDSCH,...
                rxSubframe,estChannelGrid,noiseEst);
        end

        % Perform layer demapping, demodulation and descrambling
        cws = ltePDSCHDecode(enb1,setfield(enb1.PDSCH,'TxScheme',...
            'Port7-14'),rxDeprecoded); % The PDSCH transmission scheme is
        % modified into port7-14, in order to skip the deprecoding operation

        % Scaling LLRs by CSI
        cws = hCSIscaling(enb1.PDSCH,cws,csi);

        % Decode DL-SCH
        [decbits, harqProcesses(harqID).blkerr,harqProcesses(harqID).decState] = ...
            lteDLSCHDecode(enb1, enb1.PDSCH, trBlk, cws, ...
            harqProcesses(harqID).decState);

        % Store values to calculate throughput
        % Only for subframes with data and valid PMI feedback
        if any(trBlk) && pmiReady
            blkCRC = [blkCRC harqProcesses(harqID).blkerr];
            txedTrBlkSizes =  [txedTrBlkSizes trBlk];
            bitTput = [bitTput trBlk.*(1-harqProcesses(harqID).blkerr)];
        end
        runningSimThPut = [runningSimThPut sum(bitTput,2)];
        runningMaxThPut = [runningMaxThPut sum(txedTrBlkSizes,2)];

        % Provide PMI feedback to the eNodeB
        if strcmpi(enb1.PDSCH.TxScheme,'SpatialMux')
            PMI = ltePMISelect(enb1, enb1.PDSCH, estChannelGrid, noiseEst);
            txPMIs(:, pmiIdx+1) = PMI;
            nPMI = nPMI+1;
            if nPMI>=pmiDelay
                pmiReady = true;
            end
        end
    end
end
Simulating 4 frame(s)

Результаты

В этом разделе вычисляется достигнутая пропускная способность. Также приводится рисунок с выполняемой измеренной пропускной способностью для всех моделируемых субкадров.

maxThroughput = sum(txedTrBlkSizes); % Maximum possible throughput
simThroughput = sum(bitTput,2);      % Simulated throughput

% Display achieved throughput percentage
disp(['Achieved throughput ' num2str(simThroughput*100/maxThroughput) '%'])

% Plot running throughput
figure;plot(runningSimThPut*100./runningMaxThPut)
ylabel('Throughput (%)');
xlabel('Simulated subframe');
title('Throughput');
Achieved throughput 78.5714%

Для статистически допустимых результатов симуляция должно выполняться для большего количества систем координат. Рисунок ниже показывает результаты пропускной способности при симуляции 1000 систем координат.

Приложение

В этом примере используются следующие вспомогательные функции:

Избранная библиография

  1. 3GPP TS 36.101 «Радиопередача и прием пользовательского оборудования (UE)»

  2. 3GPP TR 36.829 «Повышенные требования к эффективности для пользовательского оборудования LTE (UE)»