802.11ax пакетная симуляция коэффициента ошибок для восходящего основанного на триггере формата

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

Введение

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

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

Пользовательская настройка

В этом примере информация о выделении и параметры передачи для нескольких восходящие 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}.MCS = 7;
    cfgSys.User{userIdx}.APEPLength = 1e3;
    cfgSys.User{userIdx}.ChannelCoding = 'LDPC';
end

% Set spatial mapping property for the RU
for ruIdx = 1:allocInfo.NumRUs
    cfgSys.RU{ruIdx}.SpatialMapping = 'Direct';
end

Основанная на триггере передача для отдельного пользователя в системе сконфигурирована с объектом heTBConfig. Настройки передачи для всех пользователей сгенерированы с помощью метода getUserConfig. Массив ячеек четырех объектов HE-TB создается, чтобы описать передачу четырех пользователей.

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 = heTBSampleRate(cfgTB{1});    % Same for all users
ind = heTBFieldIndices(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, но с различным свойством 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 в получателе. Для каждого пользователя выполняющие шаги обработки происходят, чтобы создать форму волны в получателе, содержащем все четырех пользователей:

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

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

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

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

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

  1. Пакет обнаруживается.

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

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

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

  5. Шумовая оценка выполняется с помощью демодулируемых пилотов поля данных для каждого RU.

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

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

Цикл parfor может использоваться, чтобы параллелизировать обработку точек ОСШ, поэтому для каждой точки ОСШ, что канал AWGN создается и конфигурируется с коммуникацией. AWGNChannel. Чтобы включить использование параллельных вычислений для увеличенной скорости комментируют 'для' оператора и не комментируют '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',1);
    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
        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 = heTBWaveformGenerator(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

        % Demodulate HE-LTF for all RUs
        rxLTF = rxWaveform(ind.HELTF(1):ind.HELTF(2),:);
        demodHELTF = heTBDemodulate(rxLTF,'HE-LTF',cfgSys);

        % Demodulate HE-Data for all RUs
        rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);
        demodHEData = heTBDemodulate(rxData,'HE-Data',cfgSys);

        for ruIdx = 1:allocInfo.NumRUs
            % Extract the RU of interest from the full bandwidth grid
            ruNoNullsInd = sum(allocInfo.RUSizes(1:ruIdx-1))+(1:allocInfo.RUSizes(ruIdx)).';
            rxRUGrid = demodHEData(ruNoNullsInd,:,:);
            demodHELTFRU = demodHELTF(ruNoNullsInd,:,:);

            % 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(rxRUGrid(ruOFDMInfo.PilotIndices,:,:),ssPilotEst,cfgSys,ruIdx);

            % Discard pilot subcarriers
            demodDataSym = rxRUGrid(ruOFDMInfo.DataIndices,:,:);
            chanEstData = chanEst(ruOFDMInfo.DataIndices,:,:);

            % Equalize
            [eqSym,csi] = heEqualizeCombine(demodDataSym,chanEstData,nVarEst,cfgSys);

            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 = heTBDataBitRecover(eqSym(:,:,stsIdx),nVarEst,csi(:,stsIdx),cfgUser);

                % PER calculation
                packetError(userNum,1) = any(biterr(txPSDU{userNum},rxPSDU));
                numPacketErrors = numPacketErrors+packetError;
                packetError = zeros(numUsers,1);
            end
        end
    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.

Приложение

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

Выбранная библиография

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