802.11 Динамическое управление скоростью Симуляции

Этот пример показывает динамическое управление скоростью путем изменения схемы модуляции и кодирования (MCS) последовательных пакетов, переданных по частотно-избирательному многолучевому каналу с замираниями.

Введение

Стандарт 802.11™ IEEE ® поддерживает динамическое управление скоростью путем регулировки значения MCS каждого переданного пакета на основе базового канала распространения радиосвязи. Максимизация пропускной способности ссылки в канале распространения, которая является временем, изменяющимся из-за многолучевого замирания или перемещения окружающих объектов, требует динамического изменения MCS. Стандарт IEEE 802.11 не задает какой-либо стандартизированный алгоритм управления скоростью (RCA) для динамического изменения скорости модуляции. Реализация RCA остается открытой для производителей устройств WLAN. Этот пример использует схему регулирования скорости с обратной связью. Рекомендуемая MCS для передачи пакета вычисляется в приемник и доступна в передатчике без задержки обратной связи. В реальной системе эта информация будет передаваться через обмен системами координат управления. MCS настраивается для каждого последующего пакета в ответ на развивающийся канал с условием шума степени изменяющимся со временем.

В этом примере форма волны IEEE 802.11ac™ [1], состоящая из одного пакета формата VHT, генерируется с помощью wlanWaveformGenerator функция. Форма волны передается через канал TGac и добавляется шум. Пакет синхронизируется и декодируется для восстановления PSDU. ОСШ оценивают и сравнивают с порогами, чтобы определить, какая MCS подходит для передачи следующего пакета. Этот рисунок показывает обработку для каждого пакета.

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

В этом примере моделируется передача VHT IEEE 802.11ac. Свойства формы волны VHT заданы в wlanVHTConfig объект строения. В этом примере объект первоначально сконфигурирован для полосы пропускания канала 40 МГц, одной передающей антенны и скорости QPSK-1/2 (MCS 1). MCS для последующих пакетов изменяется алгоритмом на протяжении всей симуляции.

cfgVHT = wlanVHTConfig;
cfgVHT.ChannelBandwidth = 'CBW40'; % 40 MHz channel bandwidth
cfgVHT.MCS = 1;                    % QPSK rate-1/2
cfgVHT.APEPLength = 4096;          % APEP length in bytes

% Set random stream for repeatability of results
s = rng(21);

Строение канала

В этом примере модель канала N-LOS TGac используется с профилем задержки Model-D. Для Модели-D, когда расстояние между передатчиком и приемником больше или равно 10 метрам, модель является NLOS. Это описано далее в wlanTGacChannel.

tgacChannel = wlanTGacChannel;
tgacChannel.DelayProfile = 'Model-D';
tgacChannel.ChannelBandwidth = cfgVHT.ChannelBandwidth;
tgacChannel.NumTransmitAntennas = 1;
tgacChannel.NumReceiveAntennas = 1;
tgacChannel.TransmitReceiveDistance = 20; % Distance in meters for NLOS
tgacChannel.RandomStream = 'mt19937ar with seed';
tgacChannel.Seed = 0;

% Set the sampling rate for the channel
sr = wlanSampleRate(cfgVHT);
tgacChannel.SampleRate = sr;

Параметры алгоритма управления скоростью

Обычно RCA используют качество канала или показатели эффективности ссылки, такие как ОСШ или частота ошибок пакета, для выбора скорости. RCA, представленный в этом примере, оценивает ОСШ полученного пакета. При приеме предполагаемый ОСШ сравнивается с предопределенным порогом. Если ОСШ превышает предопределенный порог, для передачи следующего пакета выбирается новый MCS. The rcaAttack и rcaRelease управляет сглаживанием изменений скорости, чтобы избежать преждевременного изменения скорости. ОСШ должен превысить threshold + rcaAttack значение для увеличения MCS и должно находиться под threshold - rcaRelease значение для уменьшения MCS. В этой симуляции rcaAttack и rcaRelease состоят в консервативном увеличении MCS и агрессивном ее уменьшении. Для threshold значений, выбранных для сценария, моделируемого в этом примере, ожидается небольшое количество ошибок пакета. Эти параметры могут не подходить для других сценариев.

rcaAttack = 1;  % Control the sensitivity when MCS is increasing
rcaRelease = 0; % Control the sensitivity when MCS is decreasing
threshold = [11 14 19 20 25 28 30 31 35];
snrUp = [threshold inf]+rcaAttack;
snrDown = [-inf threshold]-rcaRelease;
snrInd = cfgVHT.MCS; % Store the start MCS value

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

В этой симуляции numPackets пакеты передаются через канал TGac, разделенный фиксированным временем простоя. Состояние канала поддерживается на протяжении всей симуляции, поэтому канал с течением времени развивается медленно. Эта эволюция медленно изменяет полученный ОСШ, измеренный в приемнике. Поскольку канал TGac изменяется очень медленно с течением времени, здесь изменение ОСШ в приемнике, видимой в короткой симуляции, может быть принудительно использовано walkSNR параметр для изменения степени шума:

  1. Настройка walkSNR в true генерирует различный ОСШ путем случайной установки степени шума на пакет во время передачи. ОСШ проходит между 14-33 дБ (используя amplitude и meanSNR переменные).

  2. Настройка walkSNR false фиксирует степень, приложенную к принятой форме волны, так что изменения канала являются основным источником изменений ОСШ в приемнике.

numPackets = 100; % Number of packets transmitted during the simulation
walkSNR = true;

% Select SNR for the simulation
if walkSNR
    meanSNR = 22;   % Mean SNR
    amplitude = 14; % Variation in SNR around the average mean SNR value
    % Generate varying SNR values for each transmitted packet
    baseSNR = sin(linspace(1,10,numPackets))*amplitude+meanSNR;
    snrWalk = baseSNR(1); % Set the initial SNR value
    % The maxJump controls the maximum SNR difference between one
    % packet and the next
    maxJump = 0.5;
else
    % Fixed mean SNR value for each transmitted packet. All the variability
    % in SNR comes from a time varying radio channel
    snrWalk = 22; %#ok<UNRCH>
end

% To plot the equalized constellation for each spatial stream set
% displayConstellation to true
displayConstellation = false;
if displayConstellation
    ConstellationDiagram = comm.ConstellationDiagram; %#ok<UNRCH>
    ConstellationDiagram.ShowGrid = true;
    ConstellationDiagram.Name = 'Equalized data symbols';
end

% Define simulation variables
snrMeasured = zeros(1,numPackets);
MCS = zeros(1,numPackets);
ber = zeros(1,numPackets);
packetLength = zeros(1,numPackets);

Обработка Цепи

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

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

  2. Фиксированное время простоя складывается между последовательными пакетами.

  3. Форма волны передается через развивающийся канал TGac.

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

  5. Эта локальная функция processPacket передает переданную форму волны через канал TGac, выполняет обработку приемника и оценку ОСШ.

  6. VHT-LTF извлекают из полученной формы волны. VHT-LTF является демодулированным OFDM, и выполняется оценка канала.

  7. Поле VHT Data извлекается из синхронизированной принятой формы волны.

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

  9. Оцененный ОСШ для каждого пакета сравнивается с порогом, сравнение используется для корректировки MCS для следующего пакета.

  10. PSDU восстанавливается с использованием извлеченного поля VHT-данных.

Для простоты этот пример принимает:

  1. Фиксированная полоса пропускания и строение антенны для каждого переданного пакета.

  2. Нет явного пакета обратной связи, чтобы сообщить передатчику о предложенной настройке MCS для следующего пакета. Пример принимает, что эта информация известна передатчику перед передачей последующего пакета.

  3. Фиксированное время простоя 0,5 миллисекунды между пакетами.

for numPkt = 1:numPackets
    if walkSNR
        % Generate SNR value per packet using random walk algorithm biased
        % towards the mean SNR
        snrWalk = 0.9*snrWalk+0.1*baseSNR(numPkt)+rand(1)*maxJump*2-maxJump;
    end

    % Generate a single packet waveform
    txPSDU = randi([0,1],8*cfgVHT.PSDULength,1,'int8');
    txWave = wlanWaveformGenerator(txPSDU,cfgVHT,'IdleTime',5e-4);

    % Receive processing, including SNR estimation
    y = processPacket(txWave,snrWalk,tgacChannel,cfgVHT);

    % Plot equalized symbols of data carrying subcarriers
    if displayConstellation && ~isempty(y.EstimatedSNR)
        release(ConstellationDiagram);
        ConstellationDiagram.ReferenceConstellation = wlanReferenceSymbols(cfgVHT);
        ConstellationDiagram.Title = ['Packet ' int2str(numPkt)];
        ConstellationDiagram(y.EqDataSym(:));
        drawnow
    end

    % Store estimated SNR value for each packet
    if isempty(y.EstimatedSNR)
        snrMeasured(1,numPkt) = NaN;
    else
        snrMeasured(1,numPkt) = y.EstimatedSNR;
    end

    % Determine the length of the packet in seconds including idle time
    packetLength(numPkt) = y.RxWaveformLength/sr;

    % Calculate packet error rate (PER)
    if isempty(y.RxPSDU)
        % Set the PER of an undetected packet to NaN
        ber(numPkt) = NaN;
    else
        [~,ber(numPkt)] = biterr(y.RxPSDU,txPSDU);
    end

    % Compare the estimated SNR to the threshold, and adjust the MCS value
    % used for the next packet
    MCS(numPkt) = cfgVHT.MCS; % Store current MCS value
    increaseMCS = (mean(y.EstimatedSNR) > snrUp((snrInd==0)+snrInd));
    decreaseMCS = (mean(y.EstimatedSNR) <= snrDown((snrInd==0)+snrInd));
    snrInd = snrInd+increaseMCS-decreaseMCS;
    cfgVHT.MCS = snrInd-1;
end

Отображение и график результатов симуляции

Этот пример строит графики изменения MCS, ОСШ, BER и пропускной способности данных в течение длительности симуляции.

  1. MCS, используемый для передачи каждого пакета, нанесен на график. При сравнении с предполагаемым ОСШ можно увидеть, что выбор MCS зависит от предполагаемого ОСШ.

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

  3. Пропускная способность максимизируется путем изменения MCS в соответствии с условиями канала. Пропускная способность вычисляется с помощью скользящего окна из трех пакетов. Для каждой нанесенной точки пропускная способность является количеством бит данных, успешно восстановленных за время трех пакетов. Длина раздвижного окна может быть увеличена для дальнейшего сглаживания пропускной способности. Вы можете увидеть падения пропускной способности либо при уменьшении MCS, либо при возникновении ошибки пакета.

% Display and plot simulation results
disp(['Overall data rate: ' num2str(8*cfgVHT.APEPLength*(numPackets-numel(find(ber)))/sum(packetLength)/1e6) ' Mbps']);
disp(['Overall packet error rate: ' num2str(numel(find(ber))/numPackets)]);

plotResults(ber,packetLength,snrMeasured,MCS,cfgVHT);

% Restore default stream
rng(s);
Overall data rate: 20.631 Mbps
Overall packet error rate: 0.03

Заключение и дальнейшие исследования

Этот пример использует схему управления скоростью с обратной связью, где знание MCS, используемое для последующей передачи пакета, принято доступным передатчику.

В этом примере изменением MCS с течением времени из-за принятого ОСШ управляет threshold, rcaAttack и rcaRelease параметры. The rcaAttack и rcaRelease используются как элементы управления, чтобы сгладить изменения скорости, это чтобы избежать преждевременного изменения ставок. Попробуйте изменить rcaRelease управление до двух. В этом случае уменьшение MCS медленнее реагирует, когда условия в канале не хороши, что приводит к более высокой BER.

Попробуйте задать displayConstellation к true порядок построить график уравненных символов на каждый полученный пакет, можно увидеть изменение схемы модуляции с течением времени. Также попробуйте задать walkSNR false порядка чтобы визуализировать изменение MCS на пакет. Здесь изменчивость в ОСШ вызвана только радиоканалом, а не комбинацией канала и случайной ходьбы.

Дальнейшее исследование включает использование альтернативной схемы RCA, более реалистичное изменение MCS, включая изменение количества пространственных временных потоков, размер пакета и разрешение STBC для последующих переданных пакетов.

Приложение

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

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

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

Локальные функции

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

  • processPacket: Добавьте нарушения канала и декодируйте пакет приема

  • plotResults: Постройте график результатов симуляции

function Y = processPacket(txWave,snrWalk,tgacChannel,cfgVHT)
    % Pass the transmitted waveform through the channel, perform
    % receiver processing, and SNR estimation.

    chanBW = cfgVHT.ChannelBandwidth; % Channel bandwidth
    % Set the following parameters to empty for an undetected packet
    estimatedSNR = [];
    eqDataSym = [];
    noiseVarVHT = [];
    rxPSDU = [];

    % Get the OFDM info
    ofdmInfo = wlanVHTOFDMInfo('VHT-Data',cfgVHT);

    % Pass the waveform through the fading channel model
    rxWave = tgacChannel(txWave);

    % Create an instance of the AWGN channel for each transmitted packet
    awgnChannel = comm.AWGNChannel;
    awgnChannel.NoiseMethod = 'Signal to noise ratio (SNR)';
    % Normalization
    awgnChannel.SignalPower = 1/tgacChannel.NumReceiveAntennas;
    % Account for energy in nulls
    awgnChannel.SNR = snrWalk-10*log10(ofdmInfo.FFTLength/ofdmInfo.NumTones);

    % Add noise
    rxWave = awgnChannel(rxWave);
    rxWaveformLength = size(rxWave,1); % Length of the received waveform

    % Recover packet
    ind = wlanFieldIndices(cfgVHT); % Get field indices
    pktOffset = wlanPacketDetect(rxWave,chanBW); % Detect packet

    if ~isempty(pktOffset) % If packet detected
        % Extract the L-LTF field for fine timing synchronization
        LLTFSearchBuffer = rxWave(pktOffset+(ind.LSTF(1):ind.LSIG(2)),:);

        % Start index of L-LTF field
        finePktOffset = wlanSymbolTimingEstimate(LLTFSearchBuffer,chanBW);

        % Determine final packet offset
        pktOffset = pktOffset+finePktOffset;

        if pktOffset<15 % If synchronization successful
            % Extract VHT-LTF samples from the waveform, demodulate and
            % perform channel estimation
            VHTLTF = rxWave(pktOffset+(ind.VHTLTF(1):ind.VHTLTF(2)),:);
            demodVHTLTF = wlanVHTLTFDemodulate(VHTLTF,cfgVHT);
            chanEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF,cfgVHT);

            % Get single stream channel estimate
            chanEstSSPilots = vhtSingleStreamChannelEstimate(demodVHTLTF,cfgVHT);

            % Extract VHT data field
            vhtdata = rxWave(pktOffset+(ind.VHTData(1):ind.VHTData(2)),:);

            % Estimate the noise power in VHT data field
            noiseVarVHT = vhtNoiseEstimate(vhtdata,chanEstSSPilots,cfgVHT);

            % Recover equalized symbols at data carrying subcarriers using
            % channel estimates from VHT-LTF
            [rxPSDU,~,eqDataSym] = wlanVHTDataRecover(vhtdata,chanEstVHTLTF,noiseVarVHT,cfgVHT);

            % SNR estimation per receive antenna
            powVHTLTF = mean(VHTLTF.*conj(VHTLTF));
            estSigPower = powVHTLTF-noiseVarVHT;
            estimatedSNR = 10*log10(mean(estSigPower./noiseVarVHT));
        end
    end

    % Set output
    Y = struct( ...
        'RxPSDU',           rxPSDU, ...
        'EqDataSym',        eqDataSym, ...
        'RxWaveformLength', rxWaveformLength, ...
        'NoiseVar',         noiseVarVHT, ...
        'EstimatedSNR',     estimatedSNR);

end

function plotResults(ber,packetLength,snrMeasured,MCS,cfgVHT)
    % Visualize simulation results

    figure('Outerposition',[50 50 900 700])
    subplot(4,1,1);
    plot(MCS);
    xlabel('Packet Number')
    ylabel('MCS')
    title('MCS selected for transmission')

    subplot(4,1,2);
    plot(snrMeasured);
    xlabel('Packet Number')
    ylabel('SNR')
    title('Estimated SNR')

    subplot(4,1,3);
    plot(find(ber==0),ber(ber==0),'x')
    hold on; stem(find(ber>0),ber(ber>0),'or')
    if any(ber)
        legend('Successful decode','Unsuccessful decode')
    else
        legend('Successful decode')
    end
    xlabel('Packet Number')
    ylabel('BER')
    title('Instantaneous bit error rate per packet')

    subplot(4,1,4);
    windowLength = 3; % Length of the averaging window
    movDataRate = movsum(8*cfgVHT.APEPLength.*(ber==0),windowLength)./movsum(packetLength,windowLength)/1e6;
    plot(movDataRate)
    xlabel('Packet Number')
    ylabel('Mbps')
    title(sprintf('Throughput over last %d packets',windowLength))

end