Этот пример демонстрирует, как измерить пропускную способность физического восходящего общего канала ( PUSCH) эффективности используя LTE Toolbox™ при условиях проверки на соответствие, как определено в TS36.104.
TS 36.104 [1] определяет требования к эффективности для физического общего канала восходящей линии связи (PUSCH) как минимальную пропускную способность для данного ОСШ, принимая повторные передачи гибридного автоматического запроса повторения (HARQ). Этот пример демонстрирует, как тест соответствия может быть построен с помощью LTE Toolbox.
Передача моделируется с помощью модели канала распространения Extended Pedestrian A (EPA) с использованием 8 процессов HARQ. Шум канала добавляется к принятой форме волны, которая затем демодулируется SC-FDMA, в результате чего принимается ресурсная сетка для каждой приемной антенны. Оценка канала выполняется, чтобы определить канал между каждой парой передающая/приемная антенна. Эквализация минимальной квадратной ошибки (MMSE) выполняется на полученной ресурсной сетке с помощью предполагаемого канала для восстановления ресурсной сетки. Затем данные PUSCH извлекают и декодируют из этой восстановленной ресурсной сетки. Используя результат блока CRC, определяют пропускную эффективность цепи передачи/приема.
Пример выполняется для длины симуляции 1 система координат при ОСШ -4,1 дБ, -2,0 дБ и 0,1 дБ согласно TS 36.104, таблица 8.2.1.1-1 [1]. Большое количество NFrames
должны использоваться для получения значимых результатов производительности. SNRIn
может быть массивом значений или скаляром.
NFrames = 1; % Number of frames to simulate at each SNR SNRIn = [-4.1, -2.0, 0.1]; % SNR points to simulate
Настройки пользовательского оборудования (UE) заданы в форме структуры.
ue.TotSubframes = 1; % Total number of subframes to generate a waveform for ue.NCellID = 10; % Cell identity ue.RC = 'A3-2'; % FRC number ue.PUSCH.NLayers = 1; % Number of layers ue.NTxAnts = 1; % Number of transmit antennas
Характеристики модели канала распространения устанавливаются с помощью структуры, содержащей поля, указанные ниже. Они устанавливаются в соответствии с ТС 36.104, таблица 8.2.1.1-1 [1].
chcfg.NRxAnts = 2; % Number of receive antennas chcfg.DelayProfile = 'EPA'; % Delay profile chcfg.DopplerFreq = 5.0; % Doppler frequency chcfg.MIMOCorrelation = 'Low'; % MIMO correlation chcfg.Seed = 100; % 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
Настройки оценки канала заданы с помощью структуры cec
. Профиль задержки EPA заставляет реакцию канала изменяться медленно по частоте. Поэтому используется большое окно усреднения частоты 13 ресурсных элементов (RE). Опорный сигнал демодуляции (DRS) содержится только в одном символе на паз, поэтому используется окно усреднения по времени 1 RE. Это не будет включать пилот-сигналы из соседнего паза при усреднении.
if ue.PUSCH.NLayers == 1 freqWindow = 13; else freqWindow = 12; % Averaging to take advantage of orthogonal DMRS for multilayer end cec.FreqWindow = freqWindow; % Frequency averaging windows in REs cec.PilotAverage = 'UserDefined'; % Type of pilot averaging cec.TimeWindow = 1; % Time averaging windows in REs cec.InterpType = 'cubic'; % Interpolation type cec.Reference = 'Antennas'; % Reference for channel estimation
Чтобы сгенерировать канал Образца модели восходящей линии связи (RMC), функции LTE Toolbox lteRMCUL
и lteRMCULTool
используются. lteRMCUL
создает структуру строения для заданных настроек UE; характерный для данного Фиксированного Опорного Канала (FRC). Эта конфигурационная структура построена согласно TS36.104 A [1] и используется lteRMCULTool
для генерации модулированной формы волны SC-FDMA. Подструктура PUSCH
определяет параметры, связанные с PUSCH; содержит вектор, определяющий пропускную способность транспортных данных по подкадрам. Эти длины используются при декодировании общего канала восходящей линии связи (UL-SCH).
% Generate FRC configuration structure for A3-2 frc = lteRMCUL(ue); % Transport block sizes for each subframe within a frame trBlkSizes = frc.PUSCH.TrBlkSizes; codedTrBlkSizes = frc.PUSCH.CodedTrBlkSizes; % Redundancy version sequence rvSequence = frc.PUSCH.RVSeq;
Частота дискретизации для модели канала устанавливается с использованием значения, возвращенного от lteSCFDMAInfo
.
info = lteSCFDMAInfo(frc); chcfg.SamplingRate = info.SamplingRate;
Пропускной тест проводится по ряду точек ОСШ. Чтобы определить пропускную способность в точке ОСШ, данные PUSCH анализируются на субкадре по базису субкадров с помощью следующих шагов:
Обновление текущего процесса HARQ. После каждого 8 субкадров данный процесс HARQ либо несет новые транспортные данные, либо повторную передачу ранее отправленных транспортных данных в зависимости от подтверждения (ACK) или отрицательного подтверждения (NACK) на основе результатов CRC. Все это обрабатывается планировщиком HARQ, hHARQScheduling.m
Создайте сигнал передачи. Использование входных данных, сгенерированных планировщиком HARQ и frc
структура, lteRMCULTool
формирует модулированную форму волны SC-FDMA и заполненную ресурсную сетку, содержащую физические каналы и сигналы.
Моделирование шумного канала. Сигнал передается через канал с замираниями и добавляется аддитивный белый Гауссов шум (AWGN).
Выполните синхронизацию и демодуляцию SC-FDMA. Принятые символы синхронизируются с учетом комбинации задержки реализации и расширения задержки канала. Символы затем демодулируются SC-FDMA.
Выполните оценку спектральной плотности Степени и шума. Спектральную плотность канала и степени шума оценивают, чтобы помочь в эквализации и декодировании.
Выполните Эквализация. Оценки канала и шума используются для выравнивания принятых символов PUSCH.
Декодируйте PUSCH. Восстановленные символы PUSCH для всех пар передающей и приемной антенны, наряду с оценкой шума, демодулируются и дескремблируются ltePUSCHDecode
для получения оценки принятого кодового слова.
Канал UL-SCH Decoding._ Вектор декодированных мягких бит передается в lteULSCHDecode
; это декодирует кодовое слово и возвращает ошибку CRC блока, и это используется для определения пропускной способности системы. Содержимое нового мягкого буфера, harqProc(harqID).decState
, доступно в выходах этой функции, которая будет использоваться для следующего подкадра. Размер транспортного блока получают из интерполяционной таблицы размеров для каждого подкадра.
% Initialize variables used in the simulation and analysis totalBLKCRC = zeros(numel(SNRIn), NFrames*10); % Total block CRC vector bitThroughput = zeros(numel(SNRIn), NFrames*10); % Total throughput vector resultIndex = 1; % Initialize frame counter index for SNRdB = SNRIn fprintf('\nSimulating at %g dB SNR for a total %d Frame(s)', ... SNRdB, NFrames); % Calculate required AWGN channel noise SNR = 10^(SNRdB/20); N = 1/(SNR*sqrt(double(info.Nfft)))/sqrt(2.0); rng('default'); % Store results for every subframe at SNR point bitTp = zeros(1, NFrames*10); % Intermediate bit throughput vector blkCRC = zeros(1, NFrames*10); % Intermediate block CRC vector % 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; offsetused = 0; for subframeNo = 0:(NFrames*10-1) % Update subframe number frc.NSubframe = subframeNo; % 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; % 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; % The initialization time for channel modeling is set each subframe % to simulate a continuously varying channel chcfg.InitTime = subframeNo/1000; % Pass data through channel model rxWaveform = lteFadingChannel(chcfg, txWaveform); % Add noise at the receiver v = N*complex(randn(size(rxWaveform)), randn(size(rxWaveform))); rxWaveform = rxWaveform+v; % 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, :)); % Channel and noise power spectral density estimation [estChannelGrid, noiseEst] = lteULChannelEstimate(frc, ... frc.PUSCH, cec, rxSubframe); % 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); % MMSE equalization and symbol scaling rxSymbols = lteEqualizeMMSE(puschRx, puschEstCh, noiseEst); rxSymbols = rxSymbols*(double(frc.NTxAnts/frc.PUSCH.NLayers)); % Update frc.PUSCH to carry complete information of the UL-SCH % coding configuration trBlkSize = trBlkSizes(mod(subframeNo, 10)+1); frc.PUSCH = lteULSCHInfo(frc, frc.PUSCH, trBlkSize, 'chsconcat'); % Decode the PUSCH rxEncodedBits = ltePUSCHDecode(frc, frc.PUSCH, rxSymbols); % Decode the UL-SCH channel and store the block CRC error for given % HARQ process [rxDecodedBits, harqProcesses(harqID).blkerr, ... harqProcesses(harqID).decState] = lteULSCHDecode(... frc, frc.PUSCH, trBlkSize, ... rxEncodedBits, harqProcesses(harqID).decState); % Store the CRC calculation and total number of bits per subframe % successfully decoded blkCRC(subframeNo+1) = harqProcesses(harqID).blkerr; bitTp(subframeNo+1) = trBlkSize.*(1-harqProcesses(harqID).blkerr); end % Record the block CRC error and bit throughput for the total number of % frames simulated at a particular SNR totalBLKCRC(resultIndex, :) = blkCRC; bitThroughput(resultIndex, :) = bitTp; resultIndex = resultIndex + 1; end
Simulating at -4.1 dB SNR for a total 1 Frame(s) Simulating at -2 dB SNR for a total 1 Frame(s) Simulating at 0.1 dB SNR for a total 1 Frame(s)
Результаты пропускной способности строятся как процент от общей емкости и фактической битовой производительности для области значений ОСШ, вводимых с помощью hPUSCHResults.m.
% Throughput calculation as a percentage
throughput = 100*(1-mean(totalBLKCRC, 2)).';
hPUSCHResults(SNRIn, NFrames, trBlkSizes, throughput, bitThroughput);
Этот пример использует эти вспомогательные функции.
3GPP TS 36.104 «Радиопередача и прием базовой станции (BS)»