В этом примере показано, как измерить пропускную способность физического общего канала восходящей линии связи (PUSCH) с использованием Toolbox™ LTE в условиях проверки соответствия, определенных в TS36.104.
TS 36.104 [1] определяет требования к производительности для физического общего канала восходящей линии связи (PUSCH) как минимальную пропускную способность для данного SNR, предполагая повторные передачи гибридного автоматического запроса повторения (HARQ). В этом примере показано, как можно создать тест соответствия с помощью инструментария LTE.
Передача моделируется с использованием модели канала распространения расширенного пешехода A (EPA) с использованием 8 процессов HARQ. Шум канала добавляется к принятому сигналу, который затем демодулируется SC-FDMA, в результате чего получается сетка принятых ресурсов для каждой приемной антенны. Оценка канала выполняется для определения канала между каждой парой передающих/приемных антенн. Выравнивание минимальной среднеквадратической ошибки (MMSE) выполняется на принятой сетке ресурсов с использованием оцененного канала для восстановления сетки ресурсов. Затем данные PUSCH извлекаются и декодируются из этой восстановленной сетки ресурсов. Используя результат блочного CRC, определяют пропускную способность цепочки передачи/приема.
Пример выполняется для длины моделирования 1 кадра при SNR -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
Характеристики модели канала распространения задаются с использованием структуры, содержащей поля, указанные ниже. Они установлены в соответствии с TS 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 lteRMCUL и lteRMCULTool используются. lteRMCUL создает структуру конфигурации для заданных настроек UE; для данного фиксированного опорного канала (FRC). Эта структура конфигурации построена согласно приложению A [1] TS36.104 и используется 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;
Проверка пропускной способности выполняется в ряде точек SNR. Для определения пропускной способности в точке SNR данные PUSCH анализируются на основе подкадра за подкадром, используя следующие шаги:
Обновить текущий процесс HARQ. После каждых 8 подкадров данный процесс HARQ либо несет новые транспортные данные, либо повторно передает ранее отправленные транспортные данные в зависимости от подтверждения (ACK) или отрицательного подтверждения (NACK) на основании результатов CRC. Все это обрабатывается планировщиком HARQ, hHARQScheduling.m.
Создание формы сигнала передачи. Использование входных данных, сгенерированных планировщиком HARQ, и frc структура, lteRMCULTool формирует модулированный сигнал SC-FDMA и заполненную сетку ресурсов, содержащую физические каналы и сигналы.
Шумное моделирование каналов. Сигнал пропускают через канал замирания и добавляют аддитивный белый гауссовый шум (AWGN).
Выполните синхронизацию и демодуляцию SC-FDMA. Принятые символы синхронизируются для учета комбинации задержки реализации и расширения задержки канала. Затем символы демодулируются SC-FDMA.
Выполнение оценки спектральной плотности канала и мощности шума. Спектральная плотность канала и мощности шума, по оценкам, способствует выравниванию и декодированию.
Выполните выравнивание MMSE. Оценки канала и шума используются для выравнивания принятых символов 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)
Результаты пропускной способности строятся как процент от общей пропускной способности и фактической битовой пропускной способности для диапазона значений SNR, вводимых с помощью hPUSCHResults.m.
% Throughput calculation as a percentage
throughput = 100*(1-mean(totalBLKCRC, 2)).';
hPUSCHResults(SNRIn, NFrames, trBlkSizes, throughput, bitThroughput);


В этом примере используются эти вспомогательные функции.
3GPP TS 36.104 «Радиопередача и прием базовой станции (BS)»