802.11ad пакетная симуляция коэффициента ошибок для OFDM PHY

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

Введение

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

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

Настройка формы волны

802.11ad передача DMG OFDM симулирована в этом примере. Объект настройки формата DMG, wlanDMGConfig, содержит формат определенная настройка передачи. Свойства объекта содержат настройку. В этом примере объект сконфигурирован для передачи OFDM с MCS 21 и 8 192-байтовым 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. comm.AWGNChannel объект сконфигурирован, чтобы обеспечить правильный ОСШ. Настройка составляет шумовую энергию в неиспользованных поднесущих, которые удалены во время демодуляции OFDM.

  3. DMG-поле-данных извлечено из отлично синхронизируемой полученной формы волны и демодулируемого OFDM.

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

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

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 802.11ad™-2012 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования. Поправка 3: Улучшения для Очень Высокой Пропускной способности в Полосе на 60 ГГц.