В этом примере показано, как измерить пакетный коэффициент ошибок высокоэффективного (HE) восходящего канала IEEE® 802.11ax™, формата основанного на триггере (TB).
802.11ax [1] основанный на триггере HE (Тбайт HE) формат допускает OFDMA или передачу MU-MIMO в восходящем канале. Передачей Тбайта HE управляет полностью точка доступа (AP). Все параметры, требуемые для передачи, предоставляются в триггерной системе координат всему STAs, участвующему в передаче Тбайта HE. Каждая станция (STA) передает пакет Тбайта HE одновременно, когда инициировано AP как показано в следующей схеме.
В этом примере сквозная симуляция используется, чтобы определить пакетный коэффициент ошибок ссылки Тбайта HE для четырех STAs в настройке MU-MIMO. В каждой точке ОСШ несколько пакетов передаются без ухудшений кроме канала и шума. Полученные пакеты демодулируются и PSDUs, восстановленный для каждого STA. PSDUs сравниваются с переданными, чтобы определить количество пакетных ошибок и следовательно пакетного коэффициента ошибок для всех пользователей. Пакетное обнаружение, временная синхронизация и эквализация символа выполняются приемником. Никакая коррекция смещения частоты выполняется в этом примере. Обработку цепи обработки Тбайта HE показывают в следующей схеме.
Приемник выполняет базирующуюся упорядоченную последовательную интерференционную отмену минимальной средней квадратной ошибки (MMSE-SIC) процесс для эквализации данных [2]. Чтобы избежать передачи ошибок на этапе отмены, потоки данных для всего STAs сортируются в порядке убывания на основе информации о состоянии канала и компенсируются последовательно. Эта схема показывает процедуру эквализации MMSE-SIC.
В этом примере можно задать метод эквализации как 'mmse' или 'mmse-так'. Эквалайзер по умолчанию 'mmse-так'.
equalizationMethod = 'mmse-sic';
В этом примере информация о выделении и параметры передачи для нескольких восходящие STAs сконфигурированы с помощью heTBSystemConfig
объект.
allocationIndex = 195; % Four uplink users in a MU-MIMO configuration
cfgSys = heTBSystemConfig(allocationIndex);
В основанной на триггере передаче некоторые параметры являются тем же самым для всех восходящих пользователей, в то время как некоторые могут отличаться. User
свойство cfgSys
содержит массив ячеек пользовательских настроек. Каждым элементом массива ячеек является объект, который может быть сконфигурирован, чтобы установить параметры отдельных пользователей. В этом примере у всех пользователей есть те же параметры передачи.
% These parameters are same for all users in the MU-MIMO system cfgSys.HELTFType = 4; % HE-LTF compression mode cfgSys.GuardInterval = 3.2; % Guard interval type cfgSys.SingleStreamPilots = 1; % Single stream pilot transmission of HE-LTF numRx = 8; % Number of receive(AP) antennas % The individual parameters for each user are specified below allocInfo = ruInfo(cfgSys); numUsers = allocInfo.NumUsers; % Number of uplink users for userIdx = 1:numUsers cfgSys.User{userIdx}.NumTransmitAntennas = 1; cfgSys.User{userIdx}.NumSpaceTimeStreams = 1; cfgSys.User{userIdx}.SpatialMapping = 'Direct'; cfgSys.User{userIdx}.MCS = 7; cfgSys.User{userIdx}.APEPLength = 1e3; cfgSys.User{userIdx}.ChannelCoding = 'LDPC'; end
Основанная на триггере передача для отдельного пользователя в системе сконфигурирована с wlanHETBConfig
объект. Настройки передачи для всех пользователей сгенерированы с помощью метода getUserConfig
. Массив ячеек четырех объектов Тбайта HE создается, чтобы описать передачу четырех пользователей.
cfgTB = getUserConfig(cfgSys);
Для каждой точки ОСШ (дБ) в snr
вектор много пакетов генерируется, проходится канал и демодулируется, чтобы определить пакетный коэффициент ошибок.
snr = 20:2:24; % The sample rate and field indices for the HE TB packet is same for all % users. Here the trigger configuration of the first user is used to get % the sample rate and field indices of the HE TB PPDU. fs = wlanSampleRate(cfgTB{1}); % Same for all users ind = wlanFieldIndices(cfgTB{1}); % Same for all users
В этом примере TGax NLOS внутренняя модель канала используется с Моделью-B профиля задержки. Модель-B рассматривается NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Это описано далее в wlanTGaxChannel
. В этом примере все STAs приняты, чтобы быть на том же расстоянии от AP.
tgaxBase = wlanTGaxChannel;
tgaxBase.SampleRate = fs;
tgaxBase.TransmissionDirection = 'Uplink';
tgaxBase.TransmitReceiveDistance = 10;
chanBW = cfgSys.ChannelBandwidth;
tgaxBase.ChannelBandwidth = chanBW;
tgaxBase.NumReceiveAntennas = numRx;
tgaxBase.NormalizeChannelOutputs = false;
Отдельный канал создается для каждого из этих четырех пользователей. Каждый канал является клоном tgaxBase
, но с различным UserIndex
свойство, и хранится в массиве ячеек tgax
. UserIndex
свойство каждого отдельного канала собирается предоставить уникальный канал каждому пользователю. В этом примере случайная реализация канала используется для каждого пакета случайным образом различным UserIndex
свойство для каждого переданного пакета.
% A cell array stores the channel objects, one per user tgax = cell(1,numUsers); for userIdx = 1:numUsers tgax{userIdx} = clone(tgaxBase); tgax{userIdx}.NumTransmitAntennas = cfgSys.User{userIdx}.NumTransmitAntennas; tgax{userIdx}.UserIndex = userIdx; end
Поскольку каждый ОСШ указывает, что много пакетов тестируются, и пакетный коэффициент ошибок вычисляется. Преамбула предHE 802.11ax назад совместима с 802.11ac™, поэтому в этом примере, компоненты временной синхронизации для формы волны VHT используются, чтобы синхронизировать форму волны HE в приемнике. Для каждого пользователя выполняющие шаги обработки происходят, чтобы создать форму волны в приемнике, содержащем все четырех пользователей:
Чтобы создать форму волны Тбайта HE, PSDU создается и кодируется для каждого пользователя на основе предопределенных пользовательских параметров.
Форма волны для каждого пользователя передается через внутреннюю модель канала TGax. Различная реализация канала моделируется для различных пользователей и пакетов случайным образом различным UserIndex
свойство канала. Это приводит к тем же пространственным свойствам корреляции для всех пользователей.
Формы волны для всех пользователей Тбайта HE масштабируются и объединяются, чтобы гарантировать тот же ОСШ для каждого пользователя после сложения шума.
AWGN добавляется к принятой форме волны, чтобы создать желаемый средний ОСШ на активную поднесущую после демодуляции OFDM.
В приемнике (AP) происходят выполняющие шаги обработки:
Пакет обнаруживается.
Прекрасная временная синхронизация устанавливается. L-STF, L-LTF и выборки L-SIG обеспечиваются для прекрасной синхронизации, чтобы допускать пакетное обнаружение в запуске или конце L-STF.
HE-LTF и Поля данных HE для всех пользователей извлечены из синхронизируемой принятой формы волны. HE-LTF и Поля данных HE являются демодулируемым OFDM.
Демодулируемый HE-LTF извлечен для каждого RU, и оценка канала выполняется.
Шумовая оценка выполняется с помощью демодулируемых пилотов поля данных для каждого RU.
Поле данных извлекается и компенсируется для всех пользователей в RU от демодулируемого поля данных.
Для каждого RU и пользователя в RU, пространственные потоки для пользователя демодулируются и декодируются, чтобы восстановить переданный PSDU.
Цикл parfor может использоваться, чтобы параллелизировать обработку точек ОСШ. Чтобы включить использование параллельных вычислений для увеличенной скорости комментируют 'для' оператора и не комментируют 'parfor' оператор ниже.
ofdmInfo = wlanHEOFDMInfo('HE-Data',cfgSys.ChannelBandwidth,cfgSys.GuardInterval); numSNR = numel(snr); % Number of SNR points numPackets = 50; % Number of packets to simulate packetErrorRate = zeros(numUsers,numSNR); txPSDU = cell(numUsers); % parfor isnr = 1:numSNR % Use 'parfor' to speed up the simulation for isnr = 1:numSNR % Set random substream index per iteration to ensure that each % iteration uses a repeatable set of random numbers stream = RandStream('combRecursive','Seed',0); stream.Substream = isnr; RandStream.setGlobalStream(stream); % RU allocation information sysInfo = ruInfo(cfgSys); % Simulate multiple packets numPacketErrors = zeros(numUsers,1); for pktIdx = 1:numPackets % Transmit processing rxWaveform = 0; packetError = zeros(numUsers,1); txPSDU = cell(1,numUsers); % Generate random channel realization for each packet by varying % the UserIndex property of the channel. This assumes all users % have the same number of transmit antennas. chPermutations = randperm(numUsers); for userIdx = 1:numUsers % HE TB config object for each user cfgUser = cfgTB{userIdx}; % Generate a packet with random PSDU txPSDU{userIdx} = randi([0 1],getPSDULength(cfgUser)*8,1,'int8'); % Generate HE TB waveform, containing payload for single user txTrig = wlanWaveformGenerator(txPSDU{userIdx},cfgUser); % Pass waveform through a random TGax Channel channelIdx = chPermutations(userIdx); reset(tgax{channelIdx}); % New channel realization rxTrig = tgax{channelIdx}([txTrig; zeros(15,size(txTrig,2))]); % Scale the transmit power of the user within an RU. This is to % ensure same SNR for each user after the addition of noise. ruNum = cfgSys.User{userIdx}.RUNumber; SF = sqrt(1/sysInfo.NumUsersPerRU(ruNum))*sqrt(cfgUser.RUSize/(sum(sysInfo.RUSizes))); % Combine uplink users into one waveform rxWaveform = rxWaveform+SF*rxTrig; end % Pass the waveform through AWGN channel. Account for noise % energy in nulls so the SNR is defined per active subcarriers. packetSNR = snr(isnr)-10*log10(ofdmInfo.FFTLength/sum(sysInfo.RUSizes)); rxWaveform = awgn(rxWaveform,packetSNR); % Receive processing % Packet detect and determine coarse packet offset coarsePktOffset = wlanPacketDetect(rxWaveform,chanBW,0,0.05); if isempty(coarsePktOffset) % If empty no L-STF detected; packet error numPacketErrors = numPacketErrors+1; continue; % Go to next loop iteration end % Extract the non-HT fields and determine fine packet offset nonhtfields = rxWaveform(coarsePktOffset+(ind.LSTF(1):ind.LSIG(2)),:); finePktOffset = wlanSymbolTimingEstimate(nonhtfields,chanBW); % Determine final packet offset pktOffset = coarsePktOffset+finePktOffset; % If packet detected out with the range of expected delays from % the channel modeling; packet error if pktOffset>50 numPacketErrors = numPacketErrors+1; continue; % Go to next loop iteration end % Extract HE-LTF and HE-Data fields for all RUs rxLTF = rxWaveform(pktOffset+(ind.HELTF(1):ind.HELTF(2)),:); rxData = rxWaveform(pktOffset+(ind.HEData(1):ind.HEData(2)),:); for ruIdx = 1:allocInfo.NumRUs % Demodulate HE-LTF and HE-Data field for the RU of interest ru = [allocInfo.RUSizes(ruIdx) allocInfo.RUIndices(ruIdx)]; demodHELTFRU = wlanHEDemodulate(rxLTF,'HE-LTF',chanBW,cfgSys.GuardInterval,cfgSys.HELTFType,ru); demodHEDataRU = wlanHEDemodulate(rxData,'HE-Data',chanBW,cfgSys.GuardInterval,ru); % Channel estimate [chanEst,ssPilotEst] = heLTFChannelEstimate(demodHELTFRU,cfgSys,ruIdx); % Get indices of data and pilots within RU (without nulls) ruOFDMInfo = wlanHEOFDMInfo('HE-Data',cfgSys.ChannelBandwidth,cfgSys.GuardInterval, ... [allocInfo.RUSizes(ruIdx) allocInfo.RUIndices(ruIdx)]); % Estimate noise power in HE fields of each user nVarEst = heNoiseEstimate(demodHEDataRU(ruOFDMInfo.PilotIndices,:,:),ssPilotEst,cfgSys,ruIdx); % Discard pilot subcarriers demodDataSym = demodHEDataRU(ruOFDMInfo.DataIndices,:,:); chanEstData = chanEst(ruOFDMInfo.DataIndices,:,:); % Equalize if strcmpi(equalizationMethod,'mmse-sic') [eqSym,csi] = heSuccessiveEqualize(demodDataSym,chanEstData,nVarEst,cfgSys,ruIdx); else [eqSym,csi] = heEqualizeCombine(demodDataSym,chanEstData,nVarEst,cfgSys); end for userIdx = 1:allocInfo.NumUsersPerRU(ruIdx) % Get TB config object for each user userNum = cfgSys.RU{ruIdx}.UserNumbers(userIdx); cfgUser = cfgTB{userNum}; % Get space-time stream indices for the current user stsIdx = cfgUser.StartingSpaceTimeStream-1+(1:cfgUser.NumSpaceTimeStreams); % Demap and decode bits rxPSDU = wlanHEDataBitRecover(eqSym(:,:,stsIdx),nVarEst,csi(:,stsIdx),cfgUser,'LDPCDecodingMethod','layered-bp'); % PER calculation packetError(userNum) = any(biterr(txPSDU{userNum},rxPSDU)); end end numPacketErrors = numPacketErrors+packetError; end % Calculate packet error rate (PER) at SNR point packetErrorRate(:,isnr)= numPacketErrors/numPackets; disp(['SNR ' num2str(snr(isnr)) ... ' completed for ' num2str(numUsers) ' users']); end
SNR 20 completed for 4 users SNR 22 completed for 4 users SNR 24 completed for 4 users
markers = 'ox*sd^v><ph+ox*sd^v'; color = 'bmcrgbrkymcrgbrkymc'; figure; for nSTA = 1:numUsers semilogy(snr,packetErrorRate(nSTA,:).',['-' markers(nSTA) color(nSTA)]); hold on; end grid on; xlabel('SNR (dB)'); ylabel('PER'); dataStr = arrayfun(@(x)sprintf('STA- %d',x),1:numUsers,'UniformOutput',false); legend(dataStr); title('PER for uplink 802.11ax link');
Количеством пакетов, протестированных в каждой точке ОСШ, управляет numPackets
. Для значимых результатов это значение должно быть больше, чем представленные в этом примере. Рисунок ниже был создан путем выполнения более длительной симуляции с numPackets
:1e4 и snr
:20:2:28, который показывает пакетный коэффициент ошибок и эквалайзера MMSE и эквалайзера MMSE-SIC.
Этот пример использует следующие функции помощника и объекты:
Черновой Стандарт IEEE P802.11ax™/D4.1 для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования - Поправка 6: Улучшения для Высокой эффективности WLAN.
М. Дебба, Б. Мукет, М. де Курвиль, M. Унавозьте, С. Симоенс и П. Лубэтон. Последовательная интерференционная схема отмены MMSE нового корректируемого гибрида распространила систему OFDM. IEEE 51-е Автомобильные Технологические Заседания конференции, стр 745-749, издание 2, 2000.