exponenta event banner

Тест соответствия пропускной способности нескольких кодовых слов PUSCH версии 10

В этом примере измеряется пропускная способность физического общего канала восходящей линии связи (PUSCH) с пространственным мультиплексированием с замкнутым контуром с использованием Toolbox™ LTE в сценарии UL-MIMO с 2-кодовым словом Release 10 на основе условий проверки соответствия, определенных в таблице 8.2.1.1-7 TS 36.104.

Введение

TS 36.104, таблица 8.2.1.1-7 [1] определяет минимальную долю 70% пропускной способности для передачи по физическому совместно используемому каналу восходящей линии связи (PUSCH) для данного отношения сигнал/шум (SNR), предполагая повторные передачи гибридного автоматического запроса повторения (HARQ). Обычный циклический префикс, расширенный канал распространения пешехода A (EPA5) и фиксированный опорный канал (FRC) A3-2 используются, но дополняются для передачи двух идентично сконфигурированных кодовых слов параллельно. Чтобы помочь выбору индикатора матрицы предварительного кодирования (PMI) для пространственного мультиплексирования с замкнутым контуром, передается зондирующий опорный сигнал (SRS), который позволяет оценить канал с полным рангом, даже когда PUSCH передается с меньшим количеством уровней передачи, чем передающие антенны.

Если используется SRS, пропускная способность PUSCH коротка как последний символ подкадра, где передается SRS, не используется для PUSCH в любом пользовательском оборудовании (UE) в соте.

Конфигурация моделирования

Пример выполняется для длины моделирования 10 кадров при SNR -0,1 дБ согласно TS 36.104, таблица 8.2.1.1-7 [1]. Большое количество NFrames следует использовать для получения значимых результатов по производительности. SNRIn может быть массивом значений или скаляром.

NFrames = 10; % Number of frames
SNRIn = -0.1; % SNR range in dB

Конфигурация UE

Настройки пользовательского оборудования (UE) задаются в структуре.

frc.RC = 'A3-2';                 % FRC number
frc.DuplexMode = 'FDD';          % Duplex mode
frc.TotSubframes = 1;            % Total number of subframes to generate
frc.NCellID = 10;                % Cell identity
frc.CyclicPrefixUL = 'Normal';   % Uplink cyclic prefix length
frc.CyclicPrefix = 'Normal';     % Downlink cyclic prefix length
frc.NTxAnts = 4;                 % Number of transmit antennas

Сконфигурируйте SRS в конфигурации UE для обеспечения возможности оценки канала.

frc.SRS.SubframeConfig = 1;    % Cell-specific schedule: 2 ms periodicity
frc.SRS.NTxAnts = frc.NTxAnts; % Configure SORTD same as no of UE antennas
frc.SRS.BWConfig = 7;          % Cell-specific SRS bandwidth
frc.SRS.BW = 0;                % UE-specific SRS bandwidth
frc.SRS.ConfigIdx = 0;         % UE-specific schedule:  2ms periodicity
frc.SRS.CyclicShift = 0;       % Cyclic shift 0
frc.SRS.SeqGroup = 0;          % Sequence group 0
frc.SRS.SeqIdx = 0;            % Base sequence 0
frc.SRS.TxComb = 0;            % Transmission comb 0
frc.SRS.FreqPosition = 0;      % Frequency-domain position 0
frc.SRS.HoppingBW = 0;         % Disable hopping (as HoppingBW >=0 BW)

Установка задержки PMI для пространственного мультиплексирования с замкнутым контуром. Это задержка передачи PMI от UE к eNireB.

pmiDelay = 8;

Конфигурация модели канала распространения

Характеристики модели канала распространения задаются с использованием структуры, содержащей поля, указанные ниже. Они установлены в соответствии с TS 36.104, таблица 8.2.1.1-7 [1].

chcfg.NRxAnts = 4;               % Number of receive antennas
chcfg.DelayProfile = 'EPA';      % Delay profile
chcfg.DopplerFreq = 5.0;         % Doppler frequency
chcfg.MIMOCorrelation = 'Low';   % MIMO correlation
chcfg.Seed = 9;                  % Channel seed
chcfg.NTerms = 16;               % Oscillators used in fading model
chcfg.ModelType = 'GMEDS';       % Rayleigh fading model type
chcfg.InitPhase = 'Random';      % Random initial phases
chcfg.NormalizePathGains = 'On'; % Normalize delay profile power
chcfg.NormalizeTxAnts = 'On';    % Normalize for transmit antennas

Конфигурация оценщика канала

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

% Controls channel estimator behavior
perfectChanEstimator = false;      % Valid values are true or false

Несовершенная оценка канала конфигурируется с использованием структуры cec. Здесь будет использоваться кубическая интерполяция с окном усреднения элементов ресурсов (RE) 12 на 1. Это конфигурирует блок оценки канала для использования специального режима, который обеспечивает возможность сжатия и ортогонализации различных перекрывающихся передач PUSCH.

% Channel estimator configuration
cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging
cec.FreqWindow = 12;              % Frequency averaging window in REs (special mode)
cec.TimeWindow = 1;               % Time averaging window in REs (special mode)
cec.InterpType = 'Cubic';         % 2D interpolation type

Когда используется несовершенная оценка канала, требуется ссылка. Управление осуществляется с помощью переменной reference. Допустимые значения:

  • Antennas - Использовать антенны опорного сигнала демодуляции PUSCH (DMRS) после предварительного кодирования в качестве опорного сигнала.

  • Layers - Использовать уровни PUSCH DMRS в качестве ссылки.

% Point of reference for the imperfect channel estimator
reference = 'Antennas';

% Validate reference is present when imperfect channel estimation used
if (~perfectChanEstimator)
    if (~any(strcmpi(reference,{'Antennas' 'Layers'})))
        error(['Channel estimator reference must be either ''Antennas'...
        ' or ''Layers''.']);
    end
else
    reference = 'Antennas';
end

Конфигурация RMC-UL

Для генерации восходящего канала опорной модели (RMC) функции панели инструментов LTE lteRMCUL и lteRMCULTool используются. lteRMCULTool создает структуру конфигурации для заданных настроек UE; для данного фиксированного опорного канала (FRC). Данная структура конфигурации построена в соответствии с TS 36.104, Приложение A [1] и используется lteRMCULTool для генерации модулированного сигнала SC-FDMA. Подструктура PUSCH определяет параметры, связанные с PUSCH, и содержит вектор, определяющий пропускную способность транспортных данных для каждого подкадра. Эти длины используются при декодировании общего канала восходящей линии связи (UL-SCH).

В этом примере для PUSCH используются два кодовых слова. Размер четырех параметров зависит от количества используемых кодовых слов:

  • frc.PUSCH.Modulation - Каждая ячейка содержит схему модуляции для кодового слова.

  • frc.PUSCH.TrBlkSizes - Каждая строка содержит размеры транспортного блока для кодового слова.

  • frc.PUSCH.CodedTrBlkSizes - Каждая строка содержит размеры кодированных транспортных блоков для кодового слова.

  • frc.PUSCH.RVSeq - Каждая строка содержит версии избыточности (RV) для кодового слова.

% Generate parameter structure for single codeword A3-2 FRC
frc = lteRMCUL(frc);

% Then update Physical Uplink Shared Channel (PUSCH) parameters to define
% two identically configured single layer codewords
frc.PUSCH.NLayers = 2;  % the layers are shared across the 2 codewords
frc.PUSCH.Modulation = repmat({frc.PUSCH.Modulation}, 1, 2);
frc.PUSCH.TrBlkSizes = repmat(frc.PUSCH.TrBlkSizes, 2, 1);
frc.PUSCH.RVSeq = repmat(frc.PUSCH.RVSeq, 2, 1);

% Record transport block sizes for each subframe in a frame
trBlkSizes = frc.PUSCH.TrBlkSizes;

% The number of codewords is the number of transport block sizes
ncw = size(trBlkSizes,1);

% Record RV sequence
rvSequence = frc.PUSCH.RVSeq;

Установка частоты дискретизации модели канала распространения

Частота дискретизации для модели канала устанавливается с использованием значения, возвращаемого из lteSCFDMAInfo.

dims = lteSCFDMAInfo(frc);
chcfg.SamplingRate = dims.SamplingRate;

Системная обработка

Тест на соответствие может быть проведен в нескольких точках SNR. Для определения пропускной способности в каждой точке SNR данные PUSCH анализируются на основе подкадра за подкадром, используя следующие шаги:

  • Обновить текущий процесс HARQ. Процесс HARQ либо несет новые транспортные данные, либо повторно передает ранее отправленные транспортные данные в зависимости от подтверждения (ACK) или отрицательного подтверждения (NACK) на основании результатов CRC. Все это обрабатывается планировщиком HARQ, hHARQScheduling.m. Данные PUSCH обновляются на основе состояния HARQ.

  • Установка PMI. PMI берется последовательно из набора PMI, txPMIsкаждый подкадр и используется eNeyB для выбора матрицы предварительного кодирования. Когда PMI используется eNireB для передачи, он заменяется PMI, выбранным UE. Этот PMI затем используется для выбора матрицы предварительного кодирования после pmiDelay подкадры. Первоначально набор pmiDelay используются случайные PMI.

  • Создание формы сигнала передачи. Данные, генерируемые процессом HARQ, передаются в lteRMCULTool, которая формирует модулированный сигнал OFDM, содержащий физические каналы и сигналы.

  • Шумное моделирование каналов. Сигнал пропускают через канал замирания и добавляют аддитивный белый гауссовый шум (AWGN). Мощность шума нормализуется с учетом частоты дискретизации.

  • Синхронизация и демодуляция SC-FDMA. Принятые символы смещаются для учета комбинации задержки реализации и расширения задержки канала. Затем символы демодулируются SC-FDMA.

  • Оценка канала. Отклик канала и шум оцениваются с использованием либо совершенного, либо несовершенного устройства оценки канала. Эти оценки используются для облегчения мягкого декодирования PUSCH. Если используется несовершенная оценка канала, SRS может использоваться только для улучшения оценки, если опорным сигналом оценки канала являются антенны DMRS (не уровни), или количество передающих антенн и уровней равно. Эта информация передается в переменной refGrid который содержит известные переданные символы SRS в их правильных местоположениях. Все остальные расположения представлены NaN.

  • Выравнивание, объединение и декодирование PUSCH. Выравнивание принятой сетки зависит от того, что используется для несовершенного опорного сигнала оценки канала. reference: Когда Antennas используется, выравнивание выполняется внутри ltePUSCHDecodeумножают оценку входного канала на используемую матрицу предварительного кодирования. Если Layers используется, выравнивание выполняется с помощью lteEqualizeMMSE а затем ltePUSCHDecode завершает обработку приема при условии, что вход уже выровнен.

  • Декодирование UL-SCH. Вектор декодированных мягких битов передается в lteULSCHDecode; это декодирует кодовые слова и возвращает ошибку CRC блока, используемую для определения пропускной способности системы. Содержимое нового мягкого буфера, harqProc(harqID).decState, доступно на выходе этой функции для использования в следующем подкадре.

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

% Store results for each SNR point and each subframe containing data for
% the whole simulation
nDataTBS = sum(trBlkSizes(:)~=0)*NFrames;
crc = zeros(numel(SNRIn), nDataTBS);  % Total block CRC error vector
tput = zeros(numel(SNRIn), nDataTBS); % Total throughput vector
ResultIndex = 1; % SNR point result index

for SNRdB = SNRIn

    % Configure random number generators
    rng('default');

    % Noise configuration
    fprintf('\nSimulating at %gdB SNR for a total %d Frame(s)', ...
            SNRdB, NFrames);
    SNR = 10^(SNRdB/20);
    N = 1/(SNR*sqrt(double(dims.Nfft)))/sqrt(2.0*frc.NTxAnts);

    % Initialize state of all HARQ processes
    harqProcesses = hNewHARQProcess(frc);
    % 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 lteRMCULTool after
    % the first call to the function
    harqProcessSequence = 1;

    % Use random PMIs for the first 'pmiDelay' subframes until feedback is
    % available from the UE if multiple transmit antennas are used
    if (frc.NTxAnts>1)
        pmidims = lteULPMIInfo(frc, frc.PUSCH);
        txPMIs = randi([0 pmidims.MaxPMI], pmidims.NSubbands, pmiDelay);
    end

    % Initialize result store for SNR point tested
    crcSNR = zeros(nDataTBS/ncw, ncw);  % Intermediate block CRC
    tputSNR = zeros(nDataTBS/ncw, ncw); % Intermediate throughput
    dataSubframeIndex = 1;

    % Loop for all subframes at this SNR
    offsetused = 0;
    for subframeNo = 0:(NFrames*10-1)

        % Update subframe number
        frc.NSubframe = mod(subframeNo, 10);

        % If this is an uplink subframe
        duplexDims = lteDuplexingInfo(frc);
        if(strcmp(duplexDims.SubframeType,'Uplink')==1)

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

            % Update the PUSCH transmission config with HARQ process state
            frc.PUSCH = harqProcesses(harqID).txConfig;
            data = harqProcesses(harqID).data;

            % Set the PMI to the appropriate value in the delay queue (if
            % multiple antennas are being used)
            if (frc.NTxAnts>1)
                pmiIdx = mod(subframeNo, pmiDelay);
                frc.PUSCH.PMI = txPMIs(:, pmiIdx+1);
            end

            % Create transmit waveform and get the HARQ scheduling ID
            % sequence from 'frcOut' structure output which also contains
            % the waveform configuration and OFDM modulation parameters
            [txWaveform,~,frcOut] = lteRMCULTool(frc, data);

            % Add 25 sample padding. This is to cover the range of delays
            % expected from channel modeling (a combination of
            % implementation delay and channel delay spread)
            txWaveform =  [txWaveform; zeros(25, frc.NTxAnts)]; %#ok<AGROW>

            % Get the HARQ ID sequence from 'frcOut' for HARQ processing
            harqProcessSequence = frcOut.PUSCH.HARQProcessSequence;

            % Pass data through the fading channel model. The
            % initialization time for channel modeling is set each subframe
            % to simulate a continuously varying channel.
            chcfg.InitTime = subframeNo/1000;
            rxWaveform = lteFadingChannel(chcfg, txWaveform);

            % Add noise at the receiver
            noise = N*complex(randn(size(rxWaveform)), ...
                randn(size(rxWaveform)));
            rxWaveform = rxWaveform + noise;

            % Calculate synchronization offset
            offset = lteULFrameOffset(frc, frc.PUSCH, rxWaveform);
            if (offset < 25)
                offsetused = offset;
            end

            % SC-FDMA demodulation
            rxSubframe = lteSCFDMADemodulate(frc, rxWaveform...
                        (1+offsetused:end, :));

            % Mark this subframe as not being involved in PMI update
            updatePMI = false;

            % Channel and noise estimation
            if (perfectChanEstimator)
                % Create reference grid - not required for perfect channel
                % estimator, but needed as an input to lteULPMISelect to
                % match call with imperfect channel estimator.
                refGrid = NaN(lteULResourceGridSize(frc)); %#ok

                % Perfect channel estimation, perfect knowledge of all REs
                % and perfect knowledge of channel noise
                estChannelGrid = lteULPerfectChannelEstimate( ...
                    frc, chcfg, offsetused);
                n = lteSCFDMADemodulate(frc, noise(1+offsetused:end, :));
                noiseEst = var(reshape(n, numel(n), 1));
                updatePMI = true;
            else
                % Use imperfect channel estimator with support from the SRS
                % if available
                if (strcmpi(reference, 'Antennas')==1 || ...
                        (frc.NTxAnts == frc.PUSCH.NLayers))
                    refGrid = NaN(lteULResourceGridSize(frc));

                    if (isfield(frc, 'SRS'))
                        [srsIndices, srsIndicesDims] = lteSRSIndices( ...
                            frc, frc.SRS);
                        if (~isempty(srsIndices))
                            srsSymbols = lteSRS(frc, frc.SRS);
                            refGrid(srsIndices) = srsSymbols;
                            updatePMI = true;
                        end
                    end
                elseif (strcmpi(reference, 'Layers')==1)
                    refGrid = NaN(lteULResourceGridSize ...
                              (frc, frc.PUSCH.NLayers));
                end
                cec.Reference = reference;
                [estChannelGrid, noiseEst] = lteULChannelEstimate( ...
                    frc, frc.PUSCH, cec, rxSubframe, refGrid);
            end

            % Shorten PUSCH capacity shortening as appropriate
            if (isfield(frc, 'SRS'))
                srsDims = lteSRSInfo(frc, frc.SRS);
                frc.Shortened = srsDims.IsSRSSubframe;
            else
                frc.Shortened = 0;
            end

            % Set up variable indicating the current transport block sizes
            TBSs = trBlkSizes(:, mod(subframeNo, 10)+1).';

            % Extract REs corresponding to the PUSCH from the given
            % subframe across all receive antennas and channel estimates.
            puschIndices = ltePUSCHIndices(frc, frc.PUSCH);
            [puschRx, puschEstCh] = lteExtractResources( ...
                puschIndices, rxSubframe, estChannelGrid);

            % Equalization and combining, layer demapping, transform
            % deprecoding, demodulation and descrambling of the received
            % data
            ulschDims = lteULSCHInfo(frc, frc.PUSCH, TBSs, 'chsconcat');
            if (strcmpi(reference, 'Antennas')==1)
                % MMSE equalization and symbol scaling
                rxSymbols = lteEqualizeMMSE(puschRx, puschEstCh, noiseEst);
                rxSymbols = rxSymbols*(frc.NTxAnts/frc.PUSCH.NLayers);
                % Decode PUSCH
                rxEncodedBits = ltePUSCHDecode(frc, ulschDims, rxSymbols);
            elseif (strcmpi(reference, 'Layers')==1)
                rxSymbols = lteEqualizeMMSE(puschRx, puschEstCh, noiseEst);
                rxEncodedBits = ltePUSCHDecode(frc, ulschDims, rxSymbols);
            end

            % UL-SCH transport decoding
            [rxdata, harqProcesses(harqID).blkerr, ...
                harqProcesses(harqID).decState] = lteULSCHDecode( ...
                frc, ulschDims, TBSs, rxEncodedBits, ...
                harqProcesses(harqID).decState);

            % Store block CRC and throughput results for subframes
            % containing transport data
            crcSNR(dataSubframeIndex, :) = harqProcesses(harqID).blkerr;
            tputSNR(dataSubframeIndex, :) = TBSs.* ...
                (1-harqProcesses(harqID).blkerr);
            dataSubframeIndex = dataSubframeIndex + 1;

            % Provide PMI feedback (if multiple antennas are being used)
            if (frc.NTxAnts>1)
                if (~any(TBSs) || ~updatePMI)
                    % Use previous PMI value if in a subframe not used for
                    % uplink in TDD, or if PMI update is not configured for
                    % this subframe.
                    PMI = txPMIs(:, mod(pmiIdx-1, pmiDelay)+1);
                else
                    % Update PMI estimate. If not using the perfect channel
                    % estimator, redo channel estimation using only the SRS
                    % for PMI selection purposes.
                    if (~perfectChanEstimator)
                        cec.Reference = 'None';
                        [estChannelGrid, noiseEst] = ...
                            lteULChannelEstimate(frc, frc.PUSCH, cec, ...
                            rxSubframe, refGrid);
                    end
                    PMI = lteULPMISelect(frc, frc.PUSCH, ...
                        estChannelGrid, noiseEst, refGrid, cec);
                end
                txPMIs(:, pmiIdx+1) = PMI;
            end
        end
    end

    % Record the block CRC error and bit throughput for the total number of
    % frames simulated at an SNR point
    crc(ResultIndex, :) = crcSNR(:);
    tput(ResultIndex, :) = tputSNR(:);
    ResultIndex = ResultIndex + 1;
    disp(' ');

end
Simulating at -0.1dB SNR for a total 10 Frame(s) 

Результаты

Результаты по пропускной способности для моделирования содержатся в crc и tput. crc - матрица, где каждая строка содержит результаты декодирования CRC для конкретного SNR. Каждый столбец содержит результат CRC для транспортного блока, содержащего данные PUSCH в SNR. tput - матрица, где каждая строка содержит битовую пропускную способность на подкадр для конкретного SNR. Каждый столбец содержит результат пропускной способности для транспортного блока, содержащего данные PUSCH в SNR.

Результаты пропускной способности строятся как процент от общей пропускной способности и фактической битовой пропускной способности для диапазона значений SNR, вводимых с помощью hMultiCodewordPUSCHResults.m.

hMultiCodewordPUSCHResults(SNRIn, NFrames, trBlkSizes, crc, tput);

Приложение

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

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

  1. 3GPP TS 36.104 «Радиопередача и прием базовой станции (BS)»