Этот пример демонстрирует эффект интерференции межъячейки на пропускной способности PDSCH с минимальной среднеквадратичной погрешностью (MMSE) и минимальной среднеквадратичной погрешностью - интерференционное отклонение, комбинирующее (MMSE-IRC) получатель. Служащая ячейка и два вмешательства eNodeBs рассматриваются. Условия, заданные в TS 36.101, Раздел 8.2.1.4.1B [1], используются.
Этот пример измеряет достигнутую пропускную способность для оборудования пользователя (UE) в служащей ячейке с интерференцией межъячейки от двух доминирующих вмешивающихся ячеек. Служащая ячейка использует RMC R.47 в режиме FDD. Параметры для обслуживания и вмешивающихся ячеек включая уровни мощности и уровень шума описаны в TS 36.101, Раздел 8.2.1.4.1B [1].
Продолжительность симуляции по умолчанию собирается в четыре кадра поддержать время симуляции на низком уровне. Увеличьте NFrames
, чтобы увеличить время симуляции и привести к статистически значительным результатам пропускной способности. Используйте переменную eqMethod
, чтобы установить коррекцию получателя, которая может принять значения 'MMSE' и 'MMSE_IRC'.
NFrames = 4; % Number of frames eqMethod = 'MMSE_IRC'; % MMSE, MMSE_IRC
Сигнал, interferers, и шумовые уровни мощности заданы в тесте (TS 36.101, Раздел 8.2.1.4.1B [1]) использование следующих параметров: предупредите к интерференции плюс шумовое отношение (SINR), доминирующая interferer пропорция (DIP) и шумовая степень о спектральной плотности.
SINR = 0.8; % SINR in dB DIP2 = -1.73; % DIP in dB for cell 2 DIP3 = -8.66; % DIP in dB for cell 3 Noc = -98; % dBm/15kHz average power spectral density
DIP характеризует каждую из вмешивающихся ячеек и задан как:
где и средняя полученная степень спектральная плотность от ячеек 2 и 3, соответственно. средняя степень спектральная плотность белого источника шума (средняя степень на элемент ресурса, нормированный относительно интервала поднесущей).
Тест считал канал ссылки использования R.47 в режиме FDD. Параметры, сопоставленные с этим ссылочным каналом, заданы в (TS 36.101, Таблица A.3.3.2.1-2 [1]). Структура enb1
характеризует служащую ячейку.
% Set the random number generator seed rng('default'); % Set cell 1 eNodeB configuration according to R.47 simulationParameters = struct; simulationParameters.NDLRB = 50; simulationParameters.CellRefP = 2; simulationParameters.NCellID = 0; simulationParameters.CFI = 2; simulationParameters.DuplexMode = 'FDD'; simulationParameters.TotSubframes = 1; % This is not the total number of % subframes used in the simulation, just the number of subframes we % generate per call to the waveform generator. % Specify PDSCH configuration substructure simulationParameters.PDSCH.TxScheme = 'SpatialMux'; simulationParameters.PDSCH.Modulation = {'16QAM'}; simulationParameters.PDSCH.NLayers = 1; simulationParameters.PDSCH.Rho = -3; simulationParameters.PDSCH.PRBSet = (0:49)'; % Table A.3.3.2.1-2, TS 36.101 simulationParameters.PDSCH.TrBlkSizes = [8760 8760 8760 8760 8760 0 8760 8760 8760 8760]; % Table A.3.3.2.1-2, TS 36.101 simulationParameters.PDSCH.CodedTrBlkSizes = [24768 26400 26400 26400 26400 0 26400 26400 26400 26400]; simulationParameters.PDSCH.CSIMode = 'PUCCH 1-1'; simulationParameters.PDSCH.PMIMode = 'Wideband'; simulationParameters.PDSCH.CSI = 'On'; simulationParameters.PDSCH.W = []; simulationParameters.PDSCH.CodebookSubset = '1111'; % Specify PDSCH OCNG configuration simulationParameters.OCNGPDSCHEnable = 'On'; % Enable OCNG fill simulationParameters.OCNGPDSCHPower = -3; % OCNG power same as PDSCH Rho simulationParameters.OCNGPDSCH.RNTI = 0; % Virtual UE RNTI simulationParameters.OCNGPDSCH.Modulation = 'QPSK'; % OCNG symbol modulation simulationParameters.OCNGPDSCH.TxScheme = 'TxDiversity'; % OCNG transmission mode 2
Вызовите lteRMCDLTool
, чтобы сгенерировать значение по умолчанию eNodeB параметры, не заданные в simulationParameters
.
enb1 = lteRMCDL(simulationParameters);
Две вмешивающихся ячейки характеризуются структурами enb2
и enb3
. Они имеют те же значения полей как служащая ячейка (enb1
) за следующими исключениями:
ID ячейки принимает значения 1 и 2 для enb2
и enb3
, соответственно.
Схема модуляции PDSCH задана моделью интерференции режима передачи 4 (TM4) (TS 36.101, B.5.3 [1]). Это значение изменяется на основе подкадра подкадром и изменяется в основном цикле обработки.
% Cell 2 enb2 = enb1; enb2.NCellID = 1; enb2.OCNGPDSCHEnable = 'Off'; % Cell 3 enb3 = enb1; enb3.NCellID = 2; enb3.OCNGPDSCHEnable = 'Off';
Этот раздел настраивает параметры для трех каналов распространения
Ячейка Serving к UE
Сначала вмешивающаяся ячейка к UE
Вторая вмешивающаяся ячейка к UE
Как задано в (TS 36.101, Таблица 8.2.1.4.1B-2 [1]) условия канала EVA5 используются.
% eNodeB1 to UE propagation channel channel1 = struct; % Channel config structure channel1.Seed = 20; % Channel seed channel1.NRxAnts = 2; % 2 receive antennas channel1.DelayProfile ='EVA'; % Delay profile channel1.DopplerFreq = 5; % Doppler frequency channel1.MIMOCorrelation = 'Low'; % Multi-antenna correlation channel1.NTerms = 16; % Oscillators used in fading model channel1.ModelType = 'GMEDS'; % Rayleigh fading model type channel1.InitPhase = 'Random'; % Random initial phases channel1.NormalizePathGains = 'On'; % Normalize delay profile power channel1.NormalizeTxAnts = 'On'; % Normalize for transmit antennas
Уровень выборки канала зависит от размера БПФ, используемого в модуляторе OFDM. Это может быть получено с помощью функционального lteOFDMInfo
.
ofdmInfo = lteOFDMInfo(enb1); channel1.SamplingRate = ofdmInfo.SamplingRate; % eNodeB2 (interference) to UE propagation channel channel2 = channel1; channel2.Seed = 122; % Channel seed % eNodeB3 (interference) to UE propagation channel channel3 = channel1; channel3.Seed = 36; % Channel seed
Переменная perfectChanEstimator
управляет поведением средства оценки канала. Допустимыми значениями является true
или false
. Когда установлено в true
совершенная оценка канала используется в противном случае, несовершенная оценка используется, на основе значений полученных экспериментальных сигналов.
% Channel estimator behavior perfectChanEstimator = true; % The channel estimator configuration structure is defined below. The % frequency and time averaging window sizes are chosen to span a relatively % large number of resource elements. The large window sizes are chosen to % average as much as possible noise and interference in the resource % elements. Note that too large an averaging window in time and/or frequency % will cause loss of information due to averaging out the channel variations. % This produces an increasingly imperfect channel estimate which can affect % the performance of the equalizer. cec = struct; % Channel estimation config structure cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 31; % Frequency window size cec.TimeWindow = 23; % Time window size cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size
От SINR DIP и значений Noc
мы можем вычислить масштабные коэффициенты, чтобы примениться к сигналам от обслуживания и вмешивающихся ячеек, а также уровня шума.
Функция hENBscalingFactors.m вычисляет масштабные коэффициенты, K1
, K2
и K3
, чтобы примениться к каналу отфильтровали формы волны от этих трех рассмотренных ячеек. Масштабный коэффициент No
, чтобы примениться к белому Гауссову шуму также вычисляется. Эти значения гарантируют, что степень сигнала, интерференционная степень и шумовая степень согласно заданному SINR и значениям DIP.
% Channel noise setup nocLin = 10.^(Noc/10)*(1e-3); % linear in Watts % Take into account FFT (OFDM) scaling No = sqrt(nocLin/(2*double(ofdmInfo.Nfft))); % Signal and interference amplitude scaling factors calculation [K1, K2, K3] = hENBscalingFactors(DIP2, DIP3, Noc, SINR, enb1, enb2, enb3);
Перед основным циклом обработки мы должны настроить гибридный автоматический повторный запрос (HARQ) процессы и инициализировать промежуточные переменные. Последовательность ID процесса HARQ, соответствующая настройке, выводится функцией lteRMCDLTool
. Процесс HARQ (с идентификаторами 1 - 8) сопоставлен к каждому подкадру, которому запланировали данные. Значение 0 в последовательности указывает, что данные не передаются в соответствующем подкадре. Это может быть то, потому что это - восходящий подкадр или потому что никакие данные не планируются в нисходящем подкадре (подобный подкадру 5 в этом примере).
% Initialize state of all HARQ processes harqProcesses = hNewHARQProcess(enb1); % 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 lteRMCDLTool after % the first call to the function harqProcessSequence = 1; % Set up variables for the main loop lastOffset = 0; % Initialize frame timing offset from previous frame frameOffset = 0; % Initialize frame timing offset nPMI = 0; % Initialize the number of precoder matrix indication % (PMI) set calculated blkCRC = []; % Block CRC for all considered subframes bitTput = []; % Number of successfully received bits per subframe txedTrBlkSizes = []; % Number of transmitted bits per subframes % Vector of total number of bits transmitted, calculated for each subframe. runningMaxThPut = []; % Vector storing the number of successfully received bits, calculated for % each subframe. runningSimThPut = []; % Obtain the number of transmit antennas. dims = lteDLResourceGridSize(enb1); P = dims(3); % Assign the redundancy version sequence for each codeword and transport % block sizes for each subframe rvSequence = enb1.PDSCH.RVSeq; trBlkSizes = enb1.PDSCH.TrBlkSizes; % Set the PMI delay for the closed-loop spatial multiplexing pmiDelay = 8; % As specified in TS 36.101, Table 8.2.1.4.1B-1 % Initialize PMIs for the first 'pmiDelay' subframes pmiDims = ltePMIInfo(enb1,enb1.PDSCH); txPMIs = zeros(pmiDims.NSubbands, pmiDelay); % Flag to indicate if a valid PMI feedback is available from the UE pmiReady = false;
Основной цикл выполняет итерации по конкретному количеству подкадров. Для каждого нисходящего подкадра с данными выполняются следующие операции:
Проверяйте процессы HARQ и определите, отправить ли новый пакет или если повторная передача требуется
Сгенерируйте нисходящие формы волны от служащей ячейки и вмешивающихся ячеек
Отфильтруйте формы волны с каналами распространения и добавьте белый Гауссов шум
Синхронизируйтесь и OFDM демодулируют сигнал от служащей ячейки
Оцените канал распространения для служащей ячейки
Компенсируйте и декодируйте PDSCH
Декодируйте DL-SCH
Определите производительность пропускной способности с помощью полученного блока CRC
fprintf('\nSimulating %d frame(s)\n',NFrames); % Main for loop: for all subframes for subframeNo = 0:(NFrames*10-1) % Reinitialize channel seed for each subframe to increase variability channel1.Seed = 1+subframeNo; channel2.Seed = 1+subframeNo+(NFrames*10); channel3.Seed = 1+subframeNo+2*(NFrames*10); % Update subframe number enb1.NSubframe = subframeNo; enb2.NSubframe = subframeNo; enb3.NSubframe = subframeNo; duplexInfo = lteDuplexingInfo(enb1); if duplexInfo.NSymbolsDL ~= 0 % target only downlink subframes % 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); % Extract the current subframe transport block size(s) trBlk = trBlkSizes(:, mod(subframeNo, 10)+1).'; % Update the PDSCH transmission config with HARQ process state enb1.PDSCH.RVSeq = harqProcesses(harqID).txConfig.RVSeq; enb1.PDSCH.RV = harqProcesses(harqID).txConfig.RV; dlschTransportBlk = harqProcesses(harqID).data; % Set the PMI to the appropriate value in the delay queue if strcmpi(enb1.PDSCH.TxScheme,'SpatialMux') pmiIdx = mod(subframeNo, pmiDelay); % PMI index in delay queue enb1.PDSCH.PMISet = txPMIs(:, pmiIdx+1); % Set PMI end % Create transmit waveform [tx,~,enbOut] = lteRMCDLTool(enb1, dlschTransportBlk); % Pad 25 samples to cover the range of delays expected from channel % modeling (a combination of implementation delay and channel delay % spread) txWaveform1 = [tx; zeros(25, P)]; % Get the HARQ ID sequence from 'enbOut' for HARQ processing harqProcessSequence = enbOut.PDSCH.HARQProcessSequence; % Generate interferer model as per as per TS 36.101, B.5.3. The % function hTM4InterfModel generates the interferer transmit signal. txWaveform2 = [hTM4InterfModel(enb2); zeros(25,P)]; txWaveform3 = [hTM4InterfModel(enb3); zeros(25,P)]; % Specify channel time for the present subframe channel1.InitTime = subframeNo/1000; channel2.InitTime = channel1.InitTime; channel3.InitTime = channel1.InitTime; % Pass data through the channel rxWaveform1 = lteFadingChannel(channel1,txWaveform1); rxWaveform2 = lteFadingChannel(channel2,txWaveform2); rxWaveform3 = lteFadingChannel(channel3,txWaveform3); % Generate noise noise = No*complex(randn(size(rxWaveform1)), ... randn(size(rxWaveform1))); % Add AWGN to the received time domain waveform rxWaveform = K1*rxWaveform1 + K2*rxWaveform2 + K3*rxWaveform3 + noise; % Receiver % Once every frame, on subframe 0, calculate a new synchronization % offset if (mod(subframeNo,10) == 0) frameOffset = lteDLFrameOffset(enb1, rxWaveform); if (frameOffset > 25) frameOffset = lastOffset; end lastOffset = frameOffset; end % Synchronize the received waveform rxWaveform = rxWaveform(1+frameOffset:end, :); % Scale rxWaveform by 1/K1 to avoid numerical issues with % channel decoding stages rxWaveform = rxWaveform/K1; % Perform OFDM demodulation on the received data to obtain the % resource grid rxSubframe = lteOFDMDemodulate(enb1, rxWaveform); % Perform channel estimation if(perfectChanEstimator) estChannelGrid = lteDLPerfectChannelEstimate(enb1, channel1, frameOffset); noiseInterf = K2*rxWaveform2 + K3*rxWaveform3 + noise; noiseInterf = noiseInterf/K1; noiseGrid = lteOFDMDemodulate(enb1, noiseInterf(1+frameOffset:end ,:)); noiseEst = var(noiseGrid(:)); else [estChannelGrid, noiseEst] = lteDLChannelEstimate( ... enb1, enb1.PDSCH, cec, rxSubframe); end % Get PDSCH indices pdschIndices = ltePDSCHIndices(enb1,enb1.PDSCH,enb1.PDSCH.PRBSet); % Get PDSCH resource elements. Scale the received subframe by % the PDSCH power factor Rho. [pdschRx, pdschHest] = lteExtractResources(pdschIndices, ... rxSubframe*(10^(-enb1.PDSCH.Rho/20)), estChannelGrid); % Perform equalization and deprecoding if strcmp(eqMethod,'MMSE') % MIMO equalization and deprecoding (MMSE based) [rxDeprecoded,csi] = lteEqualizeMIMO(enb1,enb1.PDSCH,... pdschRx,pdschHest,noiseEst); else % MIMO equalization and deprecoding (MMSE-IRC based) [rxDeprecoded,csi] = hEqualizeMMSEIRC(enb1,enb1.PDSCH,... rxSubframe,estChannelGrid,noiseEst); end % Perform layer demapping, demodulation and descrambling cws = ltePDSCHDecode(enb1,setfield(enb1.PDSCH,'TxScheme',... 'Port7-14'),rxDeprecoded); % The PDSCH transmission scheme is % modified into port7-14, inorder to skip the deprecoding operation % Scaling LLRs by CSI cws = hCSIscaling(enb1.PDSCH,cws,csi); % Decode DL-SCH [decbits, harqProcesses(harqID).blkerr,harqProcesses(harqID).decState] = ... lteDLSCHDecode(enb1, enb1.PDSCH, trBlk, cws, ... harqProcesses(harqID).decState); % Store values to calculate throughput % Only for subframes with data and valid PMI feedback if any(trBlk) && pmiReady blkCRC = [blkCRC harqProcesses(harqID).blkerr]; txedTrBlkSizes = [txedTrBlkSizes trBlk]; bitTput = [bitTput trBlk.*(1-harqProcesses(harqID).blkerr)]; end runningSimThPut = [runningSimThPut sum(bitTput,2)]; runningMaxThPut = [runningMaxThPut sum(txedTrBlkSizes,2)]; % Provide PMI feedback to the eNodeB if strcmpi(enb1.PDSCH.TxScheme,'SpatialMux') PMI = ltePMISelect(enb1, enb1.PDSCH, estChannelGrid, noiseEst); txPMIs(:, pmiIdx+1) = PMI; nPMI = nPMI+1; if nPMI>=pmiDelay pmiReady = true; end end end end
Simulating 4 frame(s)
Этот раздел вычисляет достигнутую пропускную способность. Фигура с выполнением измерилась, пропускная способность для всех моделируемых подкадров также обеспечивается.
maxThroughput = sum(txedTrBlkSizes); % Maximum possible throughput simThroughput = sum(bitTput,2); % Simulated throughput % Display achieved throughput percentage disp(['Achieved throughput ' num2str(simThroughput*100/maxThroughput) '%']) % Plot running throughput figure;plot(runningSimThPut*100./runningMaxThPut) ylabel('Throughput (%)'); xlabel('Simulated subframe'); title('Throughput');
Achieved throughput 78.5714%
Для статистически допустимых результатов симуляция должна быть запущена для большего числа кадров. Фигура ниже показов пропускная способность заканчивается при симуляции 1 000 кадров.
Этот пример использует следующие функции помощника:
3GPP TS 36.101 "Передача радио оборудования пользователя (UE) и прием"
3GPP TR 36.829 "Улучшил требование к производительности для Оборудования пользователя (UE) LTE"