Этот пример измеряет уровень пропускной способности Физического Восходящего Разделяемого Канала (PUSCH) с пространственным мультиплексированием с обратной связью с помощью LTE Toolbox™ согласно сценарию Релиза 10 UL-MIMO с 2 кодовыми комбинациями, на основе условий испытания соответствия, как задано в Таблице 8.2.1.1-7 TS 36.104.
TS 36.104, Таблица 8.2.1.1-7 [1] задает минимальную часть 70%-й пропускной способности для физического восходящего канала совместно использованный канал (PUSCH) передача для данного гибрида принятия отношения сигнал-шум (SNR) автоматический повторный запрос (HARQ) повторные передачи. Нормальный циклический префикс, Расширенный Пешеход канал распространения (EPA5) и Фиксированный ссылочный канал (FRC) A3-2 используется, но исправляется, чтобы передать две тождественно сконфигурированных кодовых комбинации параллельно. Для того, чтобы помочь выбору Предварительного кодирования матричного индикатора (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;
Характеристики модели канала распространения установлены с помощью структуры, содержащей поля, заданные ниже. Они установлены согласно 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 reference = 'Antennas'; % Channel reference
Несовершенная оценка канала сконфигурирована с помощью структуры cec
. Здесь кубичная интерполяция будет использоваться с окном усреднения 12 1 Элементов Ресурса (REs). Это конфигурирует средство оценки канала, чтобы использовать специальный режим, который гарантирует способность к despread, и ортогонализируйте различное наложение передачи 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
Чтобы сгенерировать восходящий Канал образца модели (RMC), LTE Toolbox функционирует 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
- Каждая строка содержит Версии Сокращения (RVs) для кодовой комбинации.
% 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 Взята последовательно из набора PMIs, txPMIs
, каждый подкадр и используемый eNodeB, чтобы выбрать матрицу перед кодированием. Когда PMI используется eNodeB для передачи, это заменяется PMI, выбранной UE. Эта PMI затем используется, чтобы выбрать матрицу перед кодированием после pmiDelay
подкадры. Первоначально набор pmiDelay
случайный PMIs используется.
Создайте Форму волны Передачи. Данные, сгенерированные процессом HARQ, передаются lteRMCULTool
, то, которое производит OFDM, модулировало форму волны, содержа физические каналы и сигналы.
Шумное Моделирование Канала. Форма волны передается через исчезающий канал и добавленный шум Аддитивного белого Гауссова шума (AWGN). Шумовая мощность нормирована, чтобы принять во внимание частоту дискретизации.
Синхронизация и Демодуляция SC-FDMA. Полученные символы возмещены с учетом комбинации задержки реализации и распространения задержки канала. Символами является затем демодулируемый SC-FDMA.
Оценка канала. Ответ канала и шум оцениваются с помощью или совершенного или несовершенного средства оценки канала. Эти оценки используются, чтобы помочь мягкому декодированию PUSCH. Если несовершенная оценка канала используется, SRS используется, чтобы улучшить оценку. Эта информация передается в переменной refGrid
то, которое содержит известный, передало символы SRS в их правильных местоположениях. Все другие местоположения представлены NaN
.
Эквализация, Объединение и Декодирование PUSCH. Эквализация выполняется с помощью 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 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'); rxSymbols = lteEqualizeMMSE(puschRx, puschEstCh, noiseEst); rxEncodedBits = ltePUSCHDecode(frc, ulschDims, rxSymbols); % 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) и прием"