Симуляция частоты ошибок пакета 802.11ad для OFDM PHY

Этот пример показывает, как измерить частоту ошибок пакета канала IEEE ® 802.11ad™ DMG OFDM PHY с помощью сквозной симуляции с каналом AWGN.

Введение

В этом примере сквозная симуляция используется, чтобы определить вероятность пакетной ошибки для ссылки OFDM 802.11ad DMG [1] с каналом AWGN при выборе точек ОСШ для определенной схемы модуляции и кодирования (MCS). Для каждой точки ОСШ несколько пакетов передаются через канал, демодулируются и PSDU восстанавливаются. Блоки PSDU сравнивают с переданными для определения количества ошибок пакета и, следовательно, частоты ошибок пакета. В этом примере принята идеальная синхронизация времени и частоты. Следующая схема суммирует обработку для каждого пакета.

Этот пример также демонстрирует, как ускорить симуляции с помощью parfor цикл вместо for цикл при симуляции каждой точки ОСШ. The parfor функция, как часть Toolbox™ Parallel Computing, выполняет обработку для каждого ОСШ параллельно, чтобы уменьшить общее время симуляции.

Строение формы волны

В этом примере моделируется передача OFDM 802.11ad DMG. Объект строения формата DMG, wlanDMGConfig, содержит формат специфическое строение передачи. Свойства объекта содержат строение. В этом примере объект сконфигурирован для передачи OFDM с MCS 21 и 8192-байтовым PSDU. Если mcs задается как вектор, симуляция выполняется для каждого элемента MCS. MCS определяет используемый тип PHY, поэтому MCS должна находиться в области значений 13-24, чтобы использовать OFDM PHY.

% Create a format configuration object for a DMG OFDM transmission
cfgDMG = wlanDMGConfig;
cfgDMG.PSDULength = 8192; % bytes

% For DMG OFDM PHY, the valid range of MCS is 13-24(inclusive)
mcs = 21; % OFDM PHY, 16QAM, rate 13/16

Параметры симуляции

Для каждой точки ОСШ генерируется количество пакетов, которые передаются через канал и демодулируются для определения частоты ошибок пакета. Точки ОСШ для моделирования выбираются из snrRanges на основе MCS для моделирования. Область значений ОСШ для каждого MCS выбирается в порядок, чтобы моделировать переход от всех пакетов, декодируемых с ошибкой, ко всем пакетам, которые декодируются успешно, когда ОСШ увеличивается.

% SNR ranges to use for AWGN
snrRanges = {...
    -1:0.5:1.5, ...  % MCS 13
    0:0.5:2.5, ...   % MCS 14
    1.5:0.5:4, ...   % MCS 15
    3:0.5:5.5, ...   % MCS 16
    4.5:0.5:7, ...   % MCS 17
    7.5:0.5:10, ...  % MCS 18
    9:0.5:11.5, ...  % MCS 19
    10.5:0.5:13, ... % MCS 20
    12:0.5:14.5, ... % MCS 21
    14.5:0.5:17, ... % MCS 22
    16.5:0.5:19, ... % MCS 23
    17.5:0.5:20, ... % MCS 24
    };

Количество пакетов, протестированных в каждой точке ОСШ, управляется двумя параметрами:

  1. maxNumErrors - максимальное количество ошибок пакета, моделируемых в каждой точке ОСШ. Когда количество ошибок пакета достигает этого предела, симуляция в этой точке ОСШ завершена.

  2. maxNumPackets является максимальным количеством пакетов, моделируемых в каждой точке ОСШ, и ограничивает длину симуляции, если предел ошибки пакета не достигнут.

Числа, выбранные в этом примере, приведут к очень короткой симуляции. Для значимых результатов мы рекомендуем увеличить эти цифры.

maxNumErrors = 10;   % The maximum number of packet errors at an SNR point
maxNumPackets = 100; % Maximum number of packets at an SNR point

Установите оставшиеся переменные для симуляции.

% OFDM information
ofdmInfo = wlanDMGOFDMInfo();

% Indices of data and pilot occupied subcarriers
cfgDMG.MCS = mcs(1); % Set OFDM MCS to get subcarrier indices
Nsd = numel(ofdmInfo.DataIndices); % Number of data carrying subcarriers

Обработка точек ОСШ

Для каждой точки ОСШ проверяется количество пакетов и вычисляется вероятность ошибки пакета.

Для каждого пакета выполняются следующие шаги обработки:

  1. PSDU создается и кодируется, чтобы создать одну форму волны пакета.

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

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

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

  5. Блок PSDU восстанавливается из уравненных символов данных.

A parfor цикл может использоваться для параллелизации обработки точек ОСШ, поэтому для каждой точки ОСШ создается и конфигурируется канал AWGN с comm.AWGNChannel объект. Чтобы использовать параллельные вычисления для повышенной скорости, закомментируйте for оператор и разъединение parfor оператор в этом коде.

numSNR = numel(snrRanges{1}); % Number of SNR points
numMCS = numel(mcs);          % Number of MCS
packetErrorRate = zeros(numMCS,numSNR);

for imcs = 1:numMCS
    cfgDMG.MCS = mcs(imcs);
    if ~strcmp(phyType(cfgDMG),'OFDM')
        error('This example only supports DMG OFDM PHY simulation');
    end

    % Indices of fields within the packet
    fieldIndices = wlanFieldIndices(cfgDMG);

    % SNR points to simulate from MCS
    snr = snrRanges{cfgDMG.MCS-12};

    %parfor isnr = 1:numSNR % Use 'parfor' to speed up the simulation
    for isnr = 1:numSNR % Use 'for' to debug the simulation
        % 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
        awgnChannel = comm.AWGNChannel;
        awgnChannel.NoiseMethod = 'Signal to noise ratio (SNR)';
        awgnChannel.SignalPower = 1;
        % Account for noise energy in nulls so the SNR is defined per
        % active subcarrier
        awgnChannel.SNR = snr(isnr)-10*log10(ofdmInfo.FFTLength/ofdmInfo.NumTones);

        % Loop to simulate multiple packets
        numPacketErrors = 0;
        numPkt = 1; % Index of packet transmitted
        while numPacketErrors<=maxNumErrors && numPkt<=maxNumPackets
            % Generate a packet waveform
            txPSDU = randi([0 1],cfgDMG.PSDULength*8,1); % PSDULength in bytes
            tx = wlanWaveformGenerator(txPSDU,cfgDMG);

            % Pass the waveform through AWGN channel model
            rx = awgnChannel(tx);

            % Extract data field
            rxData = rx(fieldIndices.DMGData(1):fieldIndices.DMGData(2));

            % OFDM demodulate
            demodSym = wlanDMGOFDMDemodulate(rxData);
            dataSym = demodSym(ofdmInfo.DataIndices,:); % Discard pilots

            % Equalize
            chanSym = ones(Nsd,1); % Set channel gains to 1 as AWGN channel
            nVar = 10^(-snr(isnr)/10); % Noise variance
            [eqSym,csi] = helperSymbolEqualize(dataSym,chanSym,nVar);

            % Recover data
            rxPSDU = wlanDMGDataBitRecover(eqSym,nVar,csi,cfgDMG);

            % Determine if any bits are in error, i.e. a packet error
            packetError = any(biterr(txPSDU,rxPSDU));
            numPacketErrors = numPacketErrors+packetError;
            numPkt = numPkt+1;
        end

        % Calculate packet error rate (PER) at SNR point
        packetErrorRate(imcs,isnr) = numPacketErrors/(numPkt-1);
        disp(['MCS ' num2str(mcs(imcs)) ','...
              ' SNR ' num2str(snr(isnr)) ...
              ' completed after ' num2str(numPkt-1) ' packets,'...
              ' PER:' num2str(packetErrorRate(imcs,isnr))]);
    end
end
MCS 21, SNR 12 completed after 11 packets, PER:1
MCS 21, SNR 12.5 completed after 12 packets, PER:0.91667
MCS 21, SNR 13 completed after 71 packets, PER:0.15493
MCS 21, SNR 13.5 completed after 100 packets, PER:0.02
MCS 21, SNR 14 completed after 100 packets, PER:0
MCS 21, SNR 14.5 completed after 100 packets, PER:0

Постройте график частоты ошибок пакета по сравнению с результатами ОСШ

markers = 'ox*sd^v><ph+';
color = 'bmcrgbrkymcr';
figure;
for imcs = 1:numMCS
    semilogy(snrRanges{mcs(imcs)-12},packetErrorRate(imcs,:).',['-' markers(imcs) color(imcs)]);
    hold on;
end
grid on;
xlabel('SNR (dB)');
ylabel('PER');
dataStr = arrayfun(@(x)sprintf('MCS %d',x),mcs,'UniformOutput',false);
legend(dataStr);
title('PER for DMG OFDM-PHY with AWGN channel');

Дальнейшие исследования

Количество пакетов, протестированных в каждой точке ОСШ, управляется двумя параметрами: maxNumErrors и maxNumPackets. Для значимых результатов эти значения должны быть больше, чем значения, представленные в этом примере. Увеличение количества моделируемых пакетов позволяет сравнивать PER в различных сценариях. Как пример, рисунок ниже был создан путем выполнения примера дольше с maxNumErrors = 1e3 и maxNumPackets = 1e4, для mcs = 13:24.

Приложение

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

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

  1. Стандарт IEEE Std 802.11ad™-2012 IEEE на информационные технологии - Телекоммуникации и обмен информацией между системами - Локальные и столичные сети - Особые требования - Часть 11: Беспроводное управление доступом к среде локальной сети (MAC) и физический слой (PHY) Спецификации. Поправка 3: Улучшения для очень высокой пропускной способности в полосе 60 ГГц.