Этот пример демонстрирует, как измерить Rank Indicator (RI), сообщив о работе, используя LTE Toolbox™ под условиями испытания соответствия, как определено в Разделе 9.5.1.1 [1] TS36.101.
В этом примере показано использование lteRISelect функция, обеспечивающая оценку RI. Также проверяется эффективность оценки ВКУ. Требования к производительности, определенные в TS36.101 разделе 9.5.1.1 [1], следующие:
отношение пропускной способности, получаемой при передаче на основе UE, сообщаемого RI, и пропускной способности, получаемой при передаче с фиксированным рангом 2, должно быть > = 1 (Тест 1)
отношение пропускной способности, получаемой при передаче на основе UE, сообщаемого RI, и пропускной способности, получаемой при передаче с фиксированным рангом 1, должно быть > = 1,05 (Тест 2)
В этом примере проверяется выполнение этих требований.
Пример выполняется для длины моделирования 10 кадров при SNR 0.0dB. Фиксированное значение RI устанавливается равным 2, что имитирует TS36.101 разделе 9.5.1.1 Испытание 1 [1]. Большое количество NFrames следует использовать для получения значимых результатов. Переменная FixedRI управляет проверкой требований к производительности, описанных во введении: FixedRI=2 соответствует испытанию 1 и FixedRI=1 соответствует испытанию 2. Следует отметить, что для теста 2 применяется целевой SNR 20.0dB, а не 0.0dB.
NFrames = 10; SNRdB = 0.0; FixedRI = 2;
Структура, channel, содержит параметры конфигурации модели канала. Обратите внимание, что TS36.101 раздел 9.5.1.1 Тест 3 [1] также может быть реализован путем установки channel.MIMOCorrelation = 'High' (целевой SNR 20.0dB применяется к тесту 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 TS36.101 таблицы 9.5.1.1-1 [1]. Следует отметить, что предполагается, что обратная связь RI, CQI и PMI является совершенной, причем значения подаются обратно в буферах, а не обратно в передачах восходящей линии связи.
riDelay = 9; % subframes cqipmiDelay = 8; % subframes
Чтобы управлять выбором PMI, который лежит в основе выбора разряда, битовые массивы ограничения подмножества шифровальной книги используются, как описано в Разделе 7.2 [2] TS36.213. 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 в соответствии с CQI. Схема Модуляции и Кодирования (МГЦ) индекс, соответствующий CQI, отобрана для каждого ключевого слова посредством справочной таблицы, определенной в Таблице A.4-1 [1] TS36.101 Дистанционное управление 2 FDD CSI 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, но будет динамически выбран для сообщенной фазы RI UE. Если обновление RI не запланировано в этом подкадре, предыдущее значение RI используется повторно.
Обновление CQI/PMI. Если обновление CQI/PMI запланировано в этом подкадре, используйте оценку канала для обновления CQI и PMI с помощью lteCQISelect и ltePMISelect функции. Обновленные значения CQI и PMI записываются в буферы CQI и PMI. Если обновление 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 ТС 36.101 «Радиопередача и прием пользовательского оборудования (UE)»
3GPP ТС 36.213 «Процедуры физического уровня»