Этот пример демонстрирует, как измерить Индикатор ранга (RI), сообщив о производительности с помощью LTE Toolbox™ под условиями испытания соответствия, как задано в Разделе TS36.101 9.5.1.1 [1].
Этот пример подсвечивает использование функции lteRISelect, которая обеспечивает оценку RI. Производительность оценки RI также проверена. Требование к производительности, заданное в Разделе TS36.101 9.5.1.1 [1], следующие:
отношение пропускной способности, полученной при передаче на основе UE, сообщило о RI, и полученный при передаче с фиксированным рангом 2 должен быть> = 1 (Тест 1)
отношение пропускной способности, полученной при передаче на основе UE, сообщило о RI, и полученный при передаче с фиксированным рангом 1 должен быть> = 1.05 (Тест 2)
Эти тесты в качестве примера, что эти требования удовлетворяются.
Пример выполняется в течение продолжительности симуляции 10 кадров в ОСШ 0.0 дБ. Фиксированное значение RI сконфигурировано, чтобы быть 2, поэтому моделировав Раздел TS36.101 9.5.1.1 Теста 1 [1]. Большое количество NFrames
должно использоваться, чтобы привести к значимым результатам. Средства управления переменной FixedRI
, которые из требований к производительности, описанных во введении, тестируются: FixedRI=2
соответствует Тесту 1, и FixedRI=1
соответствует Тесту 2. Обратите внимание на то, что целевой ОСШ 20.0 дБ, а не 0.0 дБ запрашивает Тест 2.
NFrames = 10; SNRdB = 0.0; FixedRI = 2;
Структура, channel
, содержит параметры конфигурации модели канала. Обратите внимание на то, что Раздел TS36.101, 9.5.1.1 Теста 3 [1] могут также быть реализованы установкой channel.MIMOCorrelation = 'High'
(целевой ОСШ 20.0 дБ применяется к Тесту 3, и цель отношения пропускной способности, отличается).
channel.Seed = 1; % Channel seed channel.NRxAnts = 2; % 2 receive antennas channel.DelayProfile = 'EPA'; % Delay profile channel.DopplerFreq = 5.0; % Doppler frequency channel.MIMOCorrelation = 'Low'; % Multi-antenna correlation channel.ModelType = 'GMEDS'; % Rayleigh fading model type channel.NormalizeTxAnts = 'On'; % Normalize for transmit antennas channel.NormalizePathGains = 'On'; % Normalize delay profile power channel.InitPhase = 'Random'; % Random initial phases channel.NTerms = 16; % Oscillators used in fading model
Средство оценки канала сконфигурировано со структурой cec
. Переменная perfectChanEstimator
управляет поведением средства оценки канала. Допустимыми значениями является true
или false
. Когда установлено в true
совершенное средство оценки канала используется в противном случае, несовершенная оценка канала используется, на основе значений полученных экспериментальных сигналов. В этом примере мы включаем совершенное средство оценки канала.
% Configure channel estimator cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 9; % Frequency window size in REs cec.TimeWindow = 9; % Time window size in REs cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size % Channel estimator behavior perfectChanEstimator = true;
Инициализируйте RI и CQI/PMI сообщающие задержки подкадров; задержка RI является 9 подкадрами, а не 8 подкадрами в соответствии с Примечанием 5 к Таблице 9.5.1.1-1 [1] TS36.101. Обратите внимание на то, что обратная связь RI, CQI и PMI принята, чтобы быть совершенной со значениями, возвращаемыми в буферах вместо того, чтобы быть возвращенной в восходящие передачи.
riDelay = 9; % subframes cqipmiDelay = 8; % subframes
В порядке управлять выбором PMI, который лежит в основе выбора ранга, битовые массивы ограничения подмножества книги шифров используются, как описано в Разделе TS36.213 7.2 [2]. codebookSubsetRI1
конфигурирует ограничение подмножества книги шифров на эти два предварительных кодера для ранга 1, используемый для FixedRI=1
. codebookSubsetRI2
конфигурирует ограничение подмножества книги шифров на один предварительный кодер ранга 2, используемый для FixedRI=2
. codebookSubsetUEReported
является объединением этих ограничений подмножества книги шифров и позволяет рангу быть выбранным динамически в случае UE, сообщил RI.
codebookSubsetRI1 = '000011'; codebookSubsetRI2 = '010000'; codebookSubsetUEReported = '010011';
Основная обработка разделена в две фазы, сконфигурированные через переменную цикла riConfig
. Эти фазы реализуют эти два измерения, требуемые в тесте производительности, заданном в Разделе TS36.101 9.5.1.1 [1]:
Фиксированный RI. Первая фаза (riConfig=1
) выполняет передачу PDSCH и прием, где ранг установлен в фиксированное значение (или 1 или 2, выбран переменной FixedRI
выше). Итоговая пропускная способность зарегистрирована.
UE сообщил о RI. Во второй фазе (riConfig=2
) количество слоев передачи выбрано на основе UE, сообщил RI с RI, обновляемым каждые 5 подкадров. Итоговая пропускная способность зарегистрирована. Отношение пропускной способности (measuredGamma
) между фиксированной фазой RI и UE сообщило, что фаза вычисляется и проверяется по заданному требованию к производительности.
Обратите внимание на то, что CQI и PMI также обновляются каждые 5 подкадров во время обеих фаз симуляции.
Обработка выполняется на подкадре основанием подкадра с помощью следующих шагов:
Выберите RI. Текущий RI читается из самого старого значения в буфере RI riBuffer
. Текущий RI используется, чтобы сконфигурировать количество слоев передачи и кодовых комбинаций для PDSCH.
Выберите CQI/PMI. Текущий CQI и PMI читаются из самых старых значений в CQI, и PMI буферизует cqiBuffer
и pmiBuffer
. Текущая PMI используется, чтобы сконфигурировать предварительное кодирование для PDSCH. Обратите внимание на то, что для RI=2, существует два значения CQI, один для каждой кодовой комбинации; для RI=1 существует одно значение CQI для одной кодовой комбинации.
Выберите MCS according to CQI. Схема Модуляции и Кодирования (MCS) индекс, соответствующий CQI, выбрана для каждой кодовой комбинации посредством интерполяционной таблицы, заданной в Табличном A.4-1 [1] CSI TS36.101 Дистанционное управление 2 FDD RMC (МГц 2).
Определите Транспортный Размер блока и порядок модуляции. Индекс MCS для каждой кодовой комбинации передается функции lteMCS, которая вычисляет соответствующий индекс Транспортного размера блока (TBS) и порядок модуляции; функция lteTBS затем используется, чтобы вычислить TBS для каждой кодовой комбинации от индекса TBS и количества блоков ресурса, выделенных PDSCH.
Передайте и получите форму волны. Транспортные данные о блоке сгенерированы для одной или двух кодовых комбинаций как соответствующие и переданные lteRMCDLTool, чтобы создать переданную нисходящую форму волны. Эта форма волны затем передается через исчезающий канал, и шум AWGN добавляется. Полученный сигнал синхронизируется, и OFDM демодулируется, и оценка канала выполняется.
Измерьте пропускную способность PDSCH. PDSCH и DL-SCH декодируются, и передача/сбой CRC для каждой кодовой комбинации зарегистрирована, чтобы определить пропускную способность.
Обновите RI. Если обновление RI планируется в этом подкадре, используйте оценку канала, чтобы обновить RI с функцией lteRISelect. Обновленное значение RI зарегистрировано в буфере RI. Битовый массив ограничения подмножества книги шифров гарантирует, что RI, о котором сообщают, останется фиксированным для фиксированной фазы RI, но будет динамически выбран для UE, сообщила фаза RI. Если обновление RI не планируется в этом подкадре, предыдущее значение RI снова используется.
Обновите CQI/PMI. Если обновление CQI/PMI планируется в этом подкадре, используйте оценку канала, чтобы обновить CQI и PMI с функциями ltePMISelect и lteCQISelect. Обновленный CQI и значения PMI зарегистрированы в буферах PMI и CQI. Если обновление CQI/PMI не планируется в этом подкадре, предыдущий CQI и значения PMI снова используются.
% Check that fixed RI valid is either 1 or 2 if (~any(FixedRI==[1 2])) error('Fixed RI value specified must be 1 or 2.'); end % For each RI configuration (fixed RI and UE reported): for riConfig = 1:2 if (riConfig==1) riConfigStr = sprintf('fixed RI=%d',FixedRI); else riConfigStr = 'UE reported RI'; end fprintf('\nSimulating with %s at %gdB SNR for %d Frame(s)\n', ... riConfigStr,SNRdB,NFrames); % Set up eNodeB settings for 2 codewords enb = struct('RC','R.3'); enb.CellRefP = 2; enb.CFI = 3; enb.OCNGPDSCHEnable = 'On'; enb.TotSubframes = 1; enb.PDSCH.RVSeq = 0; enb.PDSCH.CSIMode = 'PUCCH 1-1'; enb.PDSCH.TxScheme = 'SpatialMux'; enb.PDSCH.NLayers = 2; enb.PDSCH.Rho = -3.0; enb.PDSCH.CSI = 'On'; ncw = 2; enb = lteRMCDL(enb,ncw); % Set channel model sampling rate ofdmInfo = lteOFDMInfo(enb); channel.SamplingRate = ofdmInfo.SamplingRate; % Configure appropriate codebook subset restriction and target % throughput ratio if (riConfig==1) if (FixedRI==1) enb.PDSCH.CodebookSubset = codebookSubsetRI1; targetGamma = 1.05; else enb.PDSCH.CodebookSubset = codebookSubsetRI2; targetGamma = 1.0; end else enb.PDSCH.CodebookSubset = codebookSubsetUEReported; end % Initialize variables totalCRC = []; % CRC values, used for throughput calculation totalTBS = []; % TBS values, used for throughput calculation RIReport = []; % reported RI values riXaxis = []; % corresponding subframe numbers PMIReport = []; % reported PMI values CQIReport = []; % reported CQI values SINRReport = []; % corresponding SINR values cqipmiXaxis = []; % corresponding subframe numbers offsets = 0; % Initialize frame offset value rng('default'); % Default random number generator seed % Initialize RI/PMI/CQI buffers; note that the PDSCH throughput % resulting from these initial values is ignored, as the throughput % recording waits until the buffers have been filled with meaningful % reports riBuffer = ones(1,riDelay); pmiBuffer = ones(1,cqipmiDelay); cqiBuffer = ones(ncw,cqipmiDelay); % For each subframe: for subframeNo = 0:(NFrames*10-1) % Update subframe number enb.NSubframe = mod(subframeNo,10); % Update PMI, reading the oldest value from the PMI buffer cqipmiPtr = mod(subframeNo,cqipmiDelay); enb.PDSCH.PMISet = pmiBuffer(cqipmiPtr+1); % Update number of transmission layers based on RI, reading the % oldest value from the RI buffer riPtr = mod(subframeNo,riDelay); enb.PDSCH.NLayers = riBuffer(riPtr+1); % Update MCS according to CQI, reading the oldest value from the % CQI buffer CQI = cqiBuffer(:,cqipmiPtr+1); % Select MCS according to CQI using TS36.101 Table A.4-1 CSI RMC % RC.2 FDD (MCS.2), which defines the relationship between CQI % indices and MCS indices IMCSTable = [-1 0 0 2 4 6 8 11 13 15 18 20 22 24 26 27]; IMCS = IMCSTable(CQI+1); % Determine TBS and modulation order [ITBS,modulation] = lteMCS(IMCS); if (mod(enb.NSubframe,5)==0) TBS = [0; 0]; else TBS = double(lteTBS(size(enb.PDSCH.PRBSet,1),ITBS)); end enb.PDSCH.TrBlkSizes(:,enb.NSubframe+1) = TBS; % Determine if an RI or PMI/CQI update is required in this % subframe, according to reporting periodicity N_pd = 5ms and % configuration indices cqi-pmi-ConfigurationIndex = 6 and % ri-ConfigurationInd = 1 from TS36.101 Table 9.5.1.1-1 riPeriod = 5; % periodicity N_pd riOffset = 3; % offset deriving from configuration indices riUpdate = (mod(subframeNo,riPeriod)==riOffset); cqipmiPeriod = 5; % periodicity N_pd cqipmiOffset = 4; % offset deriving from cqi-pmi-ConfigurationIndex cqipmiUpdate = (mod(subframeNo,cqipmiPeriod)==cqipmiOffset); % Establish if this subframe actually needs executed for PDSCH % reception, RI/PMI/CQI estimation or initial timing offset % estimation: firstRxSubframe = max(cqipmiDelay+cqipmiOffset,riDelay+riOffset); if((any(TBS) && subframeNo>=firstRxSubframe) || ... (riUpdate || cqipmiUpdate) || subframeNo==0) % Configure data for transmission % (1 codeword on 1 layer, 2 codewords on 2 layers) data = {randi([0 1],TBS(1),1)}; if (enb.PDSCH.NLayers==2) data = {data{1} randi([0 1],TBS(2),1)}; end enb.PDSCH.Modulation = modulation(1:numel(data)); % Create OFDM resource grid containing RMC transmission and % perform OFDM modulation txWaveform = lteRMCDLTool(enb,data); % The initialization time for channel modeling is set each % subframe to simulate a continuously varying channel channel.InitTime = subframeNo/1000; % Pass data through the fading channel model. % An additional 25 samples are added to the end of the % waveform. These are to cover the range of delays expected % from the channel modeling (a combination of implementation % delay and channel delay spread) rxWaveform = lteFadingChannel(channel, ... [txWaveform ; zeros(25,size(txWaveform,2))]); % Calculate noise gain including compensation for downlink % power allocation SNR = 10^((SNRdB-enb.PDSCH.Rho)/20); % Normalize noise power to take account of sampling rate, which % is a function of the IFFT size used in OFDM modulation, and % the number of antennas N0 = 1/(sqrt(2.0*enb.CellRefP*double(ofdmInfo.Nfft))*SNR); % Create additive white Gaussian noise noise = N0*complex(randn(size(rxWaveform)), ... randn(size(rxWaveform))); % Add AWGN to the received time domain waveform rxWaveform = rxWaveform + noise; % Perform synchronization % An offset within the range of delays expected from the % channel modeling (a combination of implementation delay and % channel delay spread) indicates success if (mod(subframeNo,10)==0) offset = lteDLFrameOffset(enb,rxWaveform); if (offset > 25) offset = offsets(end); end offsets = [offsets offset]; %#ok<AGROW> end rxWaveform = rxWaveform(1+offset:end,:); % Perform OFDM demodulation on the received data to create the % received resource grid rxGrid = lteOFDMDemodulate(enb,rxWaveform); % Channel estimation if (perfectChanEstimator) chEstGrid = ... lteDLPerfectChannelEstimate(enb,channel,offset); n = lteOFDMDemodulate(enb,noise(1+offset:end,:)); noiseEst = var(reshape(n,numel(n),1)); else [chEstGrid,noiseEst] = ... lteDLChannelEstimate(enb,enb.PDSCH, ... cec,rxGrid); %#ok<UNRCH> end % If this subframe requires PDSCH reception: if(any(TBS) && subframeNo>=firstRxSubframe) % Decode the PDSCH ind = ltePDSCHIndices(enb,enb.PDSCH,enb.PDSCH.PRBSet); pdschRx = lteExtractResources(ind,rxGrid) * ... (10^(-enb.PDSCH.Rho/20)); pdschChEst = lteExtractResources(ind,chEstGrid); [rxBits,rxSymbols] = ltePDSCHDecode(enb,enb.PDSCH, ... pdschRx,pdschChEst,noiseEst); % Decode the DL-SCH [decbits,crc] = lteDLSCHDecode(enb,enb.PDSCH, ... enb.PDSCH.TrBlkSizes(1:numel(rxBits),enb.NSubframe+1),rxBits); % Record the CRC and TBS values for final throughput % calculation totalCRC = [totalCRC crc]; %#ok<AGROW> totalTBS = [totalTBS TBS(1:numel(crc)).']; %#ok<AGROW> end % Update RI: if (riUpdate) % Update RI thisRI = lteRISelect(enb,enb.PDSCH,chEstGrid,noiseEst); % Feed the value back to UE (in a buffer) riBuffer(riPtr+1) = thisRI; % Record values for plotting if (riConfig==2) RIReport = [RIReport thisRI]; %#ok<AGROW> riXaxis = [riXaxis subframeNo]; %#ok<AGROW> end end % Update CQI and PMI: if (cqipmiUpdate) % Update PMI conditioned on the most recently reported RI, % or the fixed RI if RI reporting is not configured if (isempty(RIReport)) enb.PDSCH.NLayers = FixedRI; else enb.PDSCH.NLayers = RIReport(end); end thisPMI = ltePMISelect(enb,enb.PDSCH,chEstGrid,noiseEst); % Update CQI conditioned on the most recently reported PMI % and RI; this includes configuring the number of codewords % for CQI selection based on the RI enb.PDSCH.PMISet = thisPMI; enb.PDSCH.NCodewords = enb.PDSCH.NLayers; [thisCQI,thisSINR] = ... lteCQISelect(enb,enb.PDSCH,chEstGrid,noiseEst); % Feed the values back to UE (in buffers) pmiBuffer(:,cqipmiPtr+1) = thisPMI; % For CSIMode='PUCCH 1-1', the CQI for the second codeword % is reported as a differential from the first codeword; % here we convert to absolute CQI indices for both % codewords. if (numel(thisCQI)==2) thisCQI(2) = thisCQI(1) - thisCQI(2); end % Transmit with lowest CQI=1 when CQI selection reports % CQI=0 (out of range) thisCQI(thisCQI==0) = 1; cqiBuffer(:,cqipmiPtr+1) = thisCQI; % Record values for plotting if (riConfig==2) PMIReport = [PMIReport thisPMI]; %#ok<AGROW> CQIReport = [CQIReport thisCQI(1)]; %#ok<AGROW> SINRReport = [SINRReport thisSINR(1)]; %#ok<AGROW> cqipmiXaxis = [cqipmiXaxis subframeNo]; %#ok<AGROW> end end end % For subframes where RI was not updated, re-use the previous value % in the buffer if (~riUpdate) riBuffer(riPtr+1) = riBuffer(mod(riPtr-1,riDelay)+1); end % For subframes where PMI/CQI were not updated, re-use the previous % values in the buffers if (~cqipmiUpdate) pmiBuffer(:,cqipmiPtr+1) = ... pmiBuffer(:,mod(cqipmiPtr-1,cqipmiDelay)+1); cqiBuffer(:,cqipmiPtr+1) = ... cqiBuffer(:,mod(cqipmiPtr-1,cqipmiDelay)+1); end end % Display results for the current RI configuration fprintf('\nResults with %s:\n',riConfigStr); tputTotal = sum(totalTBS); if (riConfig==1) % Compute and display throughput tputFixedRI = sum(totalTBS.*(1-totalCRC)); fprintf('Throughput: %d bits (%0.2f%%)\n', ... tputFixedRI,tputFixedRI/tputTotal*100); else % Compute and display throughput tputUEReported = sum(totalTBS.*(1-totalCRC)); fprintf('Throughput: %d bits (%0.2f%%)\n', ... tputUEReported,tputUEReported/tputTotal*100); % Compute and display throughput ratio measuredGamma = tputUEReported/tputFixedRI; fprintf(['Throughput ratio (gamma): %0.3f' ... ' (requirement is >= %0.2f)'],measuredGamma,targetGamma); end end
Simulating with fixed RI=2 at 0dB SNR for 10 Frame(s) Results with fixed RI=2: Throughput: 203184 bits (100.00%) Simulating with UE reported RI at 0dB SNR for 10 Frame(s) Results with UE reported RI: Throughput: 235352 bits (100.00%) Throughput ratio (gamma): 1.158 (requirement is >= 1.00)
Производятся две фигуры. У первой фигуры есть два подграфика: первый подграфик показывает RI, о котором сообщают, для каждого подкадра; второй подграфик показывает PMI, о которой сообщают, для каждого подкадра. У второй фигуры также есть два подграфика: первый подграфик показывает предполагаемый SINR для каждого подкадра; второй подграфик показывает CQI, о котором сообщают, для каждого подкадра. Эти графики иллюстрируют, как RI, PMI и CQI отличаются в зависимости от времени из-за исчезающего канала.
figure; subplot(2,1,1); plot(riXaxis,RIReport,'bo-'); xlabel('Subframe number'); ylabel('Selected RI'); title('Selected RI versus subframe number'); hold on; subplot(2,1,2); plot(cqipmiXaxis,PMIReport,'ks-'); xlabel('Subframe number'); ylabel('Selected PMI'); title('Selected PMI versus subframe number'); figure; subplot(2,1,1); plot(cqipmiXaxis,SINRReport,'rx-'); xlabel('Subframe number'); ylabel('Estimated SINR (dB)'); title('Estimated SINR (1st codeword) versus subframe number'); hold on; subplot(2,1,2); plot(cqipmiXaxis,CQIReport,'bo-'); xlabel('Subframe number'); ylabel('Selected CQI Index'); title('Selected CQI Index (1st codeword) versus subframe number');
3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"
3GPP TS 36.213 "Процедуры физического уровня"