exponenta event banner

Моделирование частоты ошибок пакетов 802.11ax для формата на основе триггера восходящей линии связи

В этом примере показано, как измерить частоту ошибок пакетов в формате IEEE ® 802.11ax™ высокой эффективностью (HE) восходящей линии связи на основе триггера (TB).

Введение

Формат 802.11ax [1] HE на основе триггера (HE TB) позволяет передачу OFDMA или MU-MIMO в восходящей линии связи. Передача HE TB полностью управляется точкой доступа (AP). Все параметры, необходимые для передачи, предоставляются в триггерном кадре всем STA, участвующим в передаче HE TB. Каждая станция (STA) передает пакет HE TB одновременно, когда запускается точкой доступа, как показано на следующей диаграмме.

В этом примере сквозное моделирование используется для определения частоты ошибок пакетов линии связи HE TB для четырех STA в конфигурации MU-MIMO. В каждой точке SNR передается множество пакетов без нарушений, кроме канала и шума. Принятые пакеты демодулируются, и PSDU восстанавливаются для каждого STA. Блоки PSDU сравниваются с переданными блоками для определения количества ошибок пакетов и, следовательно, частоты ошибок пакетов для всех пользователей. Обнаружение пакетов, синхронизация по времени и выравнивание символов выполняются приемником. В этом примере коррекция смещения частоты не выполняется. Обработка цепочки обработки HE TB показана на следующей диаграмме.

Приемник выполняет процесс упорядоченного последовательного подавления помех (MMSE-SIC) на основе среднеквадратичной ошибки для выравнивания данных [2]. Чтобы избежать распространения ошибок на этапе подавления, потоки данных для всех STA сортируются в порядке убывания на основе информации о состоянии канала и выравниваются последовательно. На этой диаграмме показана процедура выравнивания MMSE-SIC.

Метод выравнивания

В этом примере можно указать метод выравнивания как «mmse» или «mmse-sic». Эквалайзер по умолчанию - «mmse-sic».

equalizationMethod = 'mmse-sic';

Конфигурация пользователя

В этом примере информация о распределении и параметры передачи для нескольких STA восходящей линии связи конфигурируются с использованием 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 TB создается для описания передачи четырех пользователей.

cfgTB = getUserConfig(cfgSys);

Параметры моделирования

Для каждой точки SNR (дБ) в 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 используется с профилем задержки Model-B. Модель-В считается NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Это описано далее в wlanTGaxChannel. В этом примере предполагается, что все STA находятся на одинаковом расстоянии от точки доступа.

tgaxBase = wlanTGaxChannel;
tgaxBase.SampleRate = fs;
tgaxBase.TransmissionDirection = 'Uplink';
tgaxBase.TransmitReceiveDistance = 10;
chanBW = cfgSys.ChannelBandwidth;
tgaxBase.ChannelBandwidth = chanBW;
tgaxBase.NumReceiveAntennas = numRx;

Для каждого из четырех пользователей создается отдельный канал. Каждый канал является клоном 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

Обработка точек SNR

Для каждой точки SNR тестируется количество пакетов и вычисляется частота ошибок пакетов. Преамбула pre-HE стандарта 802.11ax обратно совместима с 802.11ac™, поэтому в этом примере компоненты временной синхронизации для сигнала VHT используются для синхронизации сигнала HE в приемнике. Для каждого пользователя выполняются следующие этапы обработки для создания формы сигнала в приемнике, содержащем всех четырех пользователей:

  1. Для создания формы сигнала HE TB создается и кодируется PSDU для каждого пользователя на основе предварительно определенных пользовательских параметров.

  2. Форма сигнала для каждого пользователя проходит через внутреннюю модель канала TGax. Различные реализации канала моделируются для различных пользователей и пакетов путем случайного изменения UserIndex свойство канала. Это приводит к одинаковым свойствам пространственной корреляции для всех пользователей.

  3. Формы сигналов для всех пользователей HE TB масштабируются и объединяются для обеспечения одинакового SNR для каждого пользователя после добавления шума.

  4. AWGN добавляется к принятой форме сигнала для создания требуемого среднего SNR на поднесущую после демодуляции OFDM для каждого пользователя. comm.AWGNChannel сконфигурирован для обеспечения правильного SNR. Конфигурация учитывает нормализацию в канале по количеству приемных антенн и энергии шума в неиспользуемых поднесущих, которая удаляется во время демодуляции OFDM.

В приемнике (AP) выполняются следующие этапы обработки:

  1. Пакет обнаружен.

  2. Устанавливается точная синхронизация по времени. Выборки L-STF, L-LTF и L-SIG предусмотрены для точной синхронизации, чтобы обеспечить возможность обнаружения пакетов в начале или конце L-STF.

  3. Поля HE-LTF и HE-Data для всех пользователей извлекаются из синхронизированной принятой формы сигнала. Поля HE-LTF и HE-Data демодулируются OFDM.

  4. Демодулированный HE-LTF извлекается для каждого RU и выполняется оценка канала.

  5. Оценка шума выполняется с использованием пилот-сигналов демодулированного поля данных для каждого RU.

  6. Поле данных извлекается и выравнивается для всех пользователей в RU из поля демодулированных данных.

  7. Для каждого RU и пользователя в RU пространственные потоки для пользователя демодулируются и декодируются для восстановления переданного PSDU.

Петля parfor может использоваться для параллельной обработки точек SNR, поэтому для каждой точки SNR создается и конфигурируется канал AWGN с comm.AWGNChannel. Чтобы разрешить использование параллельных вычислений для увеличения скорости комментировать оператор «for» и раскомментировать оператор «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);

    % Create an instance of the AWGN channel per SNR point simulated
    awgn = comm.AWGNChannel;
    awgn.NoiseMethod = 'Signal to noise ratio (SNR)';
    awgn.SignalPower = 1/numRx;
    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.
        awgn.SNR = snr(isnr)-10*log10(ofdmInfo.FFTLength/sum(sysInfo.RUSizes));
        rxWaveform = awgn(rxWaveform);

        % 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

Зависимость частоты ошибок пакетов от SNR

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');

Количество пакетов, протестированных в каждой точке SNR, контролируется numPackets. Для получения значимых результатов это значение должно быть больше значений, представленных в этом примере. Рисунок ниже был создан путем выполнения более длительного моделирования с помощью numPackets: 1e4 иsnr: 20:2:28, где показана частота ошибок пакетов как эквалайзера MMSE, так и эквалайзера MMSE-SIC.

Приложение

В этом примере используются следующие вспомогательные функции и объекты:

Избранная библиография

  1. IEEE P802.11ax™/D4.1 Проект стандарта для информационных технологий - Телекоммуникации и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY) - Поправка 6: Усовершенствования для высокой эффективности WLAN.

  2. М. Дебба, Б. Муке, М. де Курвиль, М. Мук, С. Симоэнс и П. Лубатон. Схема последовательного подавления помех MMSE для новой регулируемой гибридной системы OFDM с расширенным спектром. IEEE 51-я конференция по технологии транспортных средств, стр. 745-749, том 2, 2000.