Release 10 PUSCH Multiple Codeword Through Conformance Test

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

Введение

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

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

Область Строения

Пример выполняется для длины симуляции 10 систем координат при ОСШ -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 к eNodeB.

pmiDelay = 8;

Модели канала распространения Строения

Характеристики модели канала распространения устанавливаются с помощью структуры, содержащей поля, указанные ниже. Они устанавливаются в соответствии с ТС 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 Toolbox lteRMCUL и lteRMCULTool используются. lteRMCULTool создает структуру строения для заданных настроек UE; характерный для данного Фиксированного Опорного Канала (FRC). Эта конфигурационная структура построена согласно TS 36.104, Приложение А [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;

Обработка системы

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

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

  • Установите PMI. PMI берётся последовательно из набора PMI, txPMIsкаждый подкадр и используется eNodeB для выбора матрицы предварительного кодирования. Когда PMI используется eNodeB для передачи, он заменяется на 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 выбирается и отправляется обратно в eNodeB для использования в будущих подкадрах. Для идеальной оценки канала 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 для конкретного ОСШ. Каждый столбец содержит результат CRC для транспортного блока, содержащего данные PUSCH в ОСШ. tput является матрицей, где каждая строка содержит пропускную способность по битам на каждый субкадр для конкретного ОСШ. Каждый столбец содержит результат пропускной способности для транспортного блока, содержащего данные PUSCH в ОСШ.

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

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

Приложение

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

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

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