exponenta event banner

Моделирование динамического управления скоростью передачи 802.11

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

Введение

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

В этом примере форма сигнала IEEE 802.11ac™ [1], состоящая из одного пакета формата VHT, генерируется с использованием wlanWaveformGenerator функция. Сигнал пропускают через канал TGac и добавляют шум. Пакет синхронизируется и декодируется для восстановления PSDU. SNR оценивается и сравнивается с пороговыми значениями, чтобы определить, какая 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 используют метрики качества канала или производительности линии связи, такие как SNR или частота ошибок пакетов, для выбора скорости. RCA, представленный в этом примере, оценивает SNR принятого пакета. При приеме оцененное SNR сравнивается с заранее определенным порогом. Если SNR превышает предопределенный порог, то выбирается новый MCS для передачи следующего пакета. rcaAttack и rcaRelease управляет плавными изменениями ставок, чтобы избежать преждевременного изменения ставок. SNR должен превышать threshold + rcaAttack значение для увеличения MCS и должно находиться под threshold - rcaRelease значение для уменьшения MCS. В этом моделировании rcaAttack и rcaRelease настроены на консервативное увеличение СГК и агрессивное его уменьшение. Для 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 изменяется очень медленно с течением времени, здесь изменение SNR в приемнике, видимое в течение короткого моделирования, может быть принудительно выполнено с использованием walkSNR параметр для изменения мощности шума:

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

  2. Настройка walkSNR ложное фиксирование мощности шума, приложенной к принятому сигналу, так что изменения канала являются основным источником изменений SNR в приемнике.

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 добавляется к передаваемой форме сигнала для создания требуемого среднего SNR на поднесущую.

  5. Эта локальная функция processPacket пропускает передаваемый сигнал через канал TGac, выполняет обработку приемника и оценку SNR.

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

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

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

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

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

Для простоты в этом примере предполагается следующее:

  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, SNR, BER и пропускной способности данных в течение всего периода моделирования.

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

  2. Частота битовых ошибок на пакет зависит от условий канала, SNR и 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 во времени из-за принятого SNR управляется threshold, rcaAttack и rcaRelease параметры. rcaAttack и rcaRelease используются в качестве средств управления для сглаживания изменения ставок, это во избежание преждевременного изменения ставок. Попробуйте изменить rcaRelease управление до двух. В этом случае уменьшение MCS медленнее реагирует, когда условия канала плохи, что приводит к более высокому BER.

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

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

Приложение

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

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

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

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

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

  • 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