Этот пример измеряет пропускную способность эффективности Общего канала физического восходящего канала (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) заданы в структуре.
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), функции 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);
Этот пример использует эти вспомогательные функции.
3GPP TS 36.104 «Радиопередача и прием базовой станции (BS)»