В этом примере показано, как выполнить симуляцию системного уровня для 802.11ax™ IEEE ®. Часть (A) проверяет сценарий симуляции, характеристики радио и крупномасштабную модель замирания путем сравнения с опубликованными результатами калибровки. Часть (B) оценивает частоту ошибок пакета сети 802.11ax путем симуляции отдельных ссылок связи между активными узлами в рамках базовой схемы оценки четкого канала.
В этом примере эффективность сети 802.11ax [1] в жилом квартирном блоке оценивается с помощью симуляции уровня системы, ориентированного на PHY.
Сценарий симуляции жилого квартирного блока задан в [2]. Это состоит из создания с пятью этажами и двадцатью 10 м x 10 м x 3 м квартир на этаж. Каждая квартира имеет точку доступа (AP) и одну или несколько станций (STA), помещенных в случайные местоположения xy, процесс, называемый узлами 'droping'. Это создает базовый набор услуг (BSS) на квартиру, которому случайным образом назначается один из трех каналов. Сценарий симуляции задает крупномасштабную модель потерь пути, основанную на расстоянии между узлами и количестве пройденных стенок и перекрытий.
Для этого примера применяется методология оценки TGax [3] для 'PHY System Simulation':
AP и STA случайным образом 'отбрасываются' в рамках сценария.
Для каждой пары узлов вычисляются крупномасштабные потери пути.
Выполняется одно или несколько «событий передачи». Каждое событие передачи состоит из выбора активных AP и STA на основе правил доступа к каналу и определения эффективности каждой ссылки.
Этот пример состоит из двух частей:
В части (A), стадии 'calibration', отношение сигнал/помеха плюс шум (SINR) вычисляется для нескольких 'drops', принимая нисходящие интерферирующие передачи. SINR захватывает долгосрочные характеристики радио. Кумулятивная функция распределения (CDF) SINR сравнивается с опубликованными результатами целевой группы TGax [4].
В части (B), стадии 'PHY- симуляции', для каждого события передачи слой PHY моделируется для отдельных ссылок. Базовая схема оценки четкого канала (CCA) используется, чтобы контролировать, какие AP активны. Формы волны для интересующего сигнала и помехи, нарушенные затухающими моделями канала, генерируются и объединяются. Получившиеся пакеты обрабатываются приемником для восстановления интересующего пакета. Вычисляется средняя вероятность пакетной ошибки для сети.
Две части этого примера могут быть отключены с помощью параметров calibrate
и systemLevelSimulation
. Рисунок, отображающий сценарии симуляции, узлы, активные ссылки и интерференцию, отображается при showScenarioPlot
является true.
calibrate = true; % To execute Part A calibration test systemLevelSimulation = true; % To execute Part B system-level simulation showScenarioPlot = true; % To show dynamic simulation plotting updates
Основные параметры симуляции определяются как принадлежащие Физическому слою (PHY), слою управления доступом к среде (MAC), сценарию или симуляции. В этом примере параметры PHY и MAC приняты одинаковыми для всех узлов.
PHYParameters = struct; PHYParameters.TxPower = 20; % Transmitter power in dBm PHYParameters.TxGain = 0; % Transmitter antenna gain in dBi PHYParameters.RxGain = -2; % Receiver antenna gain in dBi PHYParameters.NoiseFigure = 7; % Receiver noise figure in dB PHYParameters.NumTxAntennas = 1; % Number of transmitter antennas PHYParameters.NumRxAntennas = 1; % Number of receiver antennas PHYParameters.ChannelBandwidth = 'CBW80'; % Bandwidth of system PHYParameters.TransmitterFrequency = 5e9; % Transmitter frequency in Hz MACParameters = struct; MACParameters.NumChannels = 3; % Number of non-overlapping channels MACParameters.CCALevel = -70; % Transmission threshold in CCA algorithm (dBm)
Параметры сценария определяют размер и размещение жилого создания по [3].
% Number of Rooms in [x,y,z] directions ScenarioParameters = struct; ScenarioParameters.BuildingLayout = [10 2 5]; % Size of each room in meters [x,y,z] ScenarioParameters.RoomSize = [10 10 3]; % Number of receivers per room. Note that only one receiver (STA) can be % active at any given time. ScenarioParameters.NumRxPerRoom = 1;
The NumDrops
и NumTxEventsPerDrop
параметры управляют длиной симуляции. В данном примере эти параметры сконфигурированы для короткой симуляции, но для значимых результатов они должны быть увеличены.
A 'drop' случайным образом помещает передатчики и приемники в сценарий и выбирает канал для BSS. Событие 'transmission' случайным образом выбирает передатчики и приемники для передач в соответствии с основными правилами доступа к каналу.
SimParameters = struct; SimParameters.NumDrops = 3; SimParameters.NumTxEventsPerDrop = 2;
Перед основным телом симуляции сайт передатчика объектов txsite
сгенерированы и присвоены имена комнат формы 'Room #' для удобства ссылки. Принято по одному передатчику (AP) на комнату. Каждый передатчик принят изотропным.
% Total number of transmitters, assuming one transmitter (tx) per room numTx = prod(ScenarioParameters.BuildingLayout); % Create transmitter sites with and isotropic antenna element roomNames = strings(1,numTx); for siteInd = 1:numTx roomNames(siteInd) = "Room " + siteInd; end txs = txsite('cartesian','Name',roomNames,... 'TransmitterFrequency',PHYParameters.TransmitterFrequency, ... 'TransmitterPower',10.^((PHYParameters.TxPower+PHYParameters.TxGain-30)/10),... 'Antenna','isotropic');
Объекты сайта приема rxsite
сгенерированы и присвоены имена формы 'Room # -STA #' для удобства ссылки. Параметр Scenario NumRxPerRoom
используется для определения количества приемников (STA) в каждой комнате. Каждый приемник принят изотропным.
% Total number of receivers, assuming one transmitter (tx) per room numRx = numTx*ScenarioParameters.NumRxPerRoom; % Create receiver sites roomNames = strings(1,numRx); for siteInd = 1:numRx roomNames(siteInd) = "Room " + (mod(siteInd-1,numTx)+1) + "-" + ceil(siteInd/numTx); end rxs = rxsite('cartesian','Name',roomNames,'Antenna','isotropic'); % Receiver noise power in dBm T = 290; % Temperature (Kelvin) k = physconst('Boltzmann'); % Boltzmann constant % Sample rate (Hz) fs = wlanSampleRate(wlanHESUConfig('ChannelBandwidth',PHYParameters.ChannelBandwidth)); rxNoisePower = 10*log10(k*T*fs)+30+PHYParameters.NoiseFigure;
В этом разделе сценарий симуляции, характеристики радио и крупномасштабная модель замирания проверяются путем выполнения калибровочного теста TGax Evaluation Methodology Box 1 Test 2 Nowlink Only [3]. Этот тест вычисляет SINR на всех приемниках (STA), принимая, что все передатчики (AP) активны. Несколько капель передатчиков и приемников выполняются в рамках симуляции. Один активный приемник выбирается по капли.
SINR для каждого приемника вычисляется и агрегируется по всем каплям, моделируемым для генерации кривой CDF. Эта кривая сравнивается с результатами калибровки, представленными в [4].
График, показывающий положения узлов, активные ссылки и интерферирующие ссылки, генерируется по каплям. Отдельные каналы могут быть скрыты и показаны на графике, нажав на соответствующую запись легенды.
seed = rng(6); % Seed random number generator and store state if showScenarioPlot hGrid = tgaxBuildResidentialGrid(ScenarioParameters.RoomSize,ScenarioParameters.BuildingLayout, ... numTx,numRx,MACParameters.NumChannels); end if calibrate fprintf('Running calibration ...\n'); % Pre-allocate output output = struct; output.sinr = zeros(SimParameters.NumDrops,numTx); % for storing SINR values for drop = 1:SimParameters.NumDrops % Drop receivers in each room [association,txChannels,rxChannels,txPositions,rxPositions] = tgaxDropNodes( ... txs,rxs,ScenarioParameters,MACParameters.NumChannels); % All transmitters active activeTx = true(numTx,1); % Only pick one receiver per Room rxAlloc = randi([1 ScenarioParameters.NumRxPerRoom],numTx,1); activeRx = reshape(rxAlloc==1:ScenarioParameters.NumRxPerRoom,[],1); % Generate propagation model propModel = TGaxResidential('roomSize',ScenarioParameters.RoomSize); % Get the index of the transmitter for each receiver tnum = repmat((1:numTx),1,numRx/numTx); % SINR calculation - loop over each non-overlapping channel numChannels = numel(unique(txChannels)); for k = 1:numChannels % Use kth non-overlapping channel tind = txChannels == k; rind = false(size(activeRx)); rind(activeRx) = rxChannels(activeRx) == k; % Get the index of the transmitter of interest for each active receiver tsigind = tnum(rind); % Calculate SNR output.sinr(drop,tind) = sinr(rxs(rind),txs(tind),... 'ReceiverGain',PHYParameters.RxGain,... 'ReceiverNoisePower',rxNoisePower,... 'PropagationModel',propModel,... 'SignalSource',txs(tsigind)); end % Plot nodes and links if showScenarioPlot % update plot data mask = txChannels==rxChannels'; tgaxUpdatePlot(hGrid,txPositions,rxPositions,activeTx,activeRx,mask,txChannels,rxChannels, ... sprintf('Box 1 Test 2 "downlink only" calibration, drop #%d/%d',drop,SimParameters.NumDrops)); end end % Plot the CDF of SINR and compare with calibration curves tgaxCalibrationCDF(output.sinr,'SS1Box1Test2','Long-term Radio Characteristics'); fprintf('Calibration complete \n') end
Running calibration ... Calibration complete
В этом примере моделируется небольшое количество капель. Поэтому для более значимого сравнения количество моделируемых капель должно быть увеличено. Результат калибровки для 100 капель показан ниже:
В этом разделе сценарий и модель потерь пути, калиброванная в части А, используются для выполнения симуляции уровня системы, ориентированного на PHY, и определения частоты ошибок пакета для сети. Эта симуляция описывается как PHY-сфокусированная, поскольку PHY не абстрагируется и MAC упрощается. Каждая активная ссылка моделируется с помощью обработки передатчика основной полосы частот и приемника. Очень простой MAC принимает при каждом событии передачи все передатчики (AP) хотят передать, и один приемник (STA) на BSS является получателем. Простой алгоритм CCA используется для управления доступом к каналу между передатчиками, как указано на фигуре 4 [3]. Алгоритм CCA включает случайные передатчики, если степень сигнала, принятая от передатчиков, которые уже активированы, не превышает порог CCA, MACParameters.CCAThreshold
.
Принятая степень сигнала от всех возможных интерферирующих передатчиков вычисляется в каждом активном приемнике. Если мощность приемника от интерферирующего передатчика выше уровня шума получателя, то ссылка моделируется с полной обработкой передатчика основной полосы частот и приемника. Для каждого смоделированного канала генерируется и передается через модель стационарного внутреннего канала NLOS TGax Model-D. В приемнике формы волны от интересующего передатчика и всех интерферирующих передатчиков масштабируются ожидаемыми потерями пути и объединяются, чтобы создать форму волны, содержащую интересующий сигнал плюс интерференция. Все формы волны выровнены по времени. Приемник выполняет синхронизацию, демодуляцию и декодирование, чтобы попытаться восстановить полезную нагрузку. Декодированная полезная нагрузка сравнивается с PSDU, переданным в BSS, чтобы определить, был ли пакет успешно восстановлен.
В этом примере параметры передачи и канала приняты одинаковыми для всех узлов. Строение передачи для всех пакетов является одним пространственно-временным потоком, без пространственно-временного блочного кодирования и скорости 16-QAM-1/2 (MCS 3).
if systemLevelSimulation % Pre-allocate outputs output.numPkts = zeros(numRx,1); output.numPktErrors = zeros(numRx,1); output.sinrMeas = nan(numRx,SimParameters.NumTxEventsPerDrop,SimParameters.NumDrops); output.sinrEst = nan(numRx,SimParameters.NumTxEventsPerDrop,SimParameters.NumDrops); output.pktErrorRate = 0; % For each possible transmitter create a waveform configuration. In this % example the link and radio parameters are the same for all nodes. cfgHEBase = wlanHESUConfig; cfgHEBase.ChannelBandwidth = PHYParameters.ChannelBandwidth; % Channel bandwidth cfgHEBase.NumTransmitAntennas = PHYParameters.NumTxAntennas; % Number of transmit antennas cfgHEBase.SpatialMapping = 'Fourier'; % Spatial mapping matrix cfgHEBase.NumSpaceTimeStreams = 1; % Number of space-time streams cfgHEBase.GuardInterval = 0.8; % Guard interval duration cfgHEBase.HELTFType = 4; % HE-LTF compression mode cfgHEBase.APEPLength = 1e3; % Payload length in bytes cfgHEBase.ChannelCoding = 'LDPC'; % Channel coding cfgHEBase.MCS = 3; % Modulation and coding scheme cfgHE = cell(numTx,1); for txidx = 1:numTx cfgHE{txidx} = cfgHEBase; end fprintf('Running System Level Simulation ...\n') for drop = 1:SimParameters.NumDrops fprintf(' Running drop #%d/%d ...\n',drop,SimParameters.NumDrops); % Drop receivers in each room [association,txChannels,rxChannels,txPositions,rxPositions] = tgaxDropNodes( ... txs,rxs,ScenarioParameters,MACParameters.NumChannels); % Generate propagation model propModel = TGaxResidential('roomSize',ScenarioParameters.RoomSize); % Calculate signal strength for all links signalStrength = sigstrength(rxs,txs,propModel,'Type','power',... 'ReceiverGain',PHYParameters.RxGain); % all signal strengths in dBm % Threshold signals below noise level to reduce simulation time signalStrength(signalStrength < rxNoisePower) = -Inf; % Threshold signals that are not on same non-overlapping channel signalStrength(~(txChannels == rxChannels')) = -Inf; % Mask the transmitter-receiver links that are non-negligible to % simulate and get the linear indices nonnegligibleMask = signalStrength > -Inf; % Reset the non-negligible channels to create a new realization for the % current drop nonnegligibleIdx = find(nonnegligibleMask)'; % For each possible active link in a drop create a channel % configuration. In this example the link and radio parameters are the % same for all nodes. tgaxChan = cell(numel(nonnegligibleIdx),1); for i = 1:numel(nonnegligibleIdx) % Index of transmitter for a given link txIdx = mod(nonnegligibleIdx(i)-1,numTx)+1; % Channel configuration. The channel realization for each link is % different as the global random stream is used. tgaxChanBase = wlanTGaxChannel; tgaxChanBase.DelayProfile = 'Model-D'; tgaxChanBase.NumTransmitAntennas = cfgHE{txIdx}.NumTransmitAntennas; tgaxChanBase.NumReceiveAntennas = PHYParameters.NumRxAntennas; tgaxChanBase.TransmitReceiveDistance = 10; % Distance in meters for NLOS tgaxChanBase.ChannelBandwidth = cfgHE{txIdx}.ChannelBandwidth; tgaxChanBase.LargeScaleFadingEffect = 'None'; tgaxChanBase.EnvironmentalSpeed = 0; % m/s, stationary tgaxChanBase.SampleRate = fs; tgaxChanBase.NormalizeChannelOutputs = false; % Store in cell array and reset the channel to generate a new % response tgaxChan{i} = tgaxChanBase; reset(tgaxChan{i}); end for txevent = 1:SimParameters.NumTxEventsPerDrop fprintf(' Running transmission event #%d/%d ...\n',txevent,SimParameters.NumTxEventsPerDrop); % Determine active transmitters and receivers with Clear Channel Assessment [activeTx,activeRx] = tgaxCCA(signalStrength,MACParameters.CCALevel); % Plot scenario and links if showScenarioPlot tgaxUpdatePlot(hGrid,txPositions,rxPositions,activeTx,activeRx,nonnegligibleMask,txChannels,rxChannels, ... sprintf('PHY System-Level Simulation, Drop #%d/%d, Transmission Event #%d/%d', ... drop,SimParameters.NumDrops,txevent,SimParameters.NumTxEventsPerDrop)); end % Extract elements for active links using activeTx and activeRx cfgHEActive = cfgHE(activeTx); associationActive = association(activeTx,activeRx); nonnegligibleMaskActive = nonnegligibleMask(activeTx,activeRx); signalStrengthActive = signalStrength(activeTx,activeRx); % Create array containing active channels tgaxChanActive = cell(size(associationActive)); matchIdx = nonnegligibleIdx==find(activeTx&activeRx'); tgaxChanActive(nonnegligibleMaskActive) = tgaxChan(any(matchIdx,1)); % Generate a waveform for each non-negligible active link and % combine waveforms for each receiver [rxWavs,txPSDUActive,signalPower,interfPower] = tgaxGenerateRxWaveforms( ... cfgHEActive,tgaxChanActive,nonnegligibleMaskActive,signalStrengthActive,associationActive); % Run PHY link simulation for each link and determine if the packet % has been decoded successfully. The estimated interference power % is passed to the receiver in the place of an interference power % measurement algorithm. numActiveRxs = sum(activeRx); pktError = false(numActiveRxs,1); sinrMeas = nan(numActiveRxs,1); for rxIdx = 1:numActiveRxs [pktError(rxIdx),sinrMeas(rxIdx)] = tgaxModelPHYLink( ... rxWavs{rxIdx},cfgHEActive{rxIdx},rxNoisePower,interfPower(rxIdx),txPSDUActive{rxIdx}); end % Store output for active receivers output.numPktErrors(activeRx) = output.numPktErrors(activeRx)+pktError; output.numPkts(activeRx) = output.numPkts(activeRx) + 1; output.sinrMeas(activeRx,txevent,drop) = sinrMeas; % Calculate the expected SINR at each receiver sinrEst = 10*log10(signalPower./(interfPower+10^((rxNoisePower-30)/10))); output.sinrEst(activeRx,txevent,drop) = sinrEst; end end % Calculate average packet error rate output.pktErrorRate = sum(output.numPktErrors)/sum(output.numPkts); disp('Simulation complete') disp(['Average packet error rate for transmitters: ' num2str(output.pktErrorRate)]); end rng(seed); % Restore random state
Running System Level Simulation ... Running drop #1/3 ... Running transmission event #1/2 ... Running transmission event #2/2 ... Running drop #2/3 ... Running transmission event #1/2 ... Running transmission event #2/2 ... Running drop #3/3 ... Running transmission event #1/2 ... Running transmission event #2/2 ... Simulation complete Average packet error rate for transmitters: 0.054152
Симуляция уровня системы, ориентированная на PHY, продемонстрированная в этом примере, может использоваться, чтобы исследовать влияние параметров уровня PHY на производительность системы. Например, рисунок ниже показывает среднюю частоту ошибок пакета сети для различных значений порога CCA для 50 падений и 2 событий передачи на падение.
В этом примере используются следующие вспомогательные функции:
IEEE P802.11ax™/D4.1 Проект стандарта на информационные технологии - Телекоммуникации и обмен информацией между системами - Локальные и столичные сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического Слоя (PHY) - Поправка 6: Усовершенствования для высокой Эффективности WLAN.
IEEE 802.11-14/0980r16 - Сценарии симуляции TGax.
IEEE 802.11-14/0571r12 - 11ax Методика оценки.
IEEE 802.11-14/0800r30 - Результаты калибровки коробок 1 и 2.