Этот пример показывает динамическое управление скоростью посредством изменения схемы модуляции и кодирования (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 параметр для изменения мощности шума:
Настройка walkSNR to true генерирует изменяющееся SNR путем случайной установки мощности шума на пакет во время передачи. SNR проходит между 14-33 дБ (с использованием amplitude и meanSNR переменные).
Настройка 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);
Для каждого пакета выполняются следующие шаги обработки:
PSDU создается и кодируется для создания сигнала одного пакета.
Между последовательными пакетами добавляется фиксированное время простоя.
Сигнал пропускается через развивающийся канал TGac.
AWGN добавляется к передаваемой форме сигнала для создания требуемого среднего SNR на поднесущую.
Эта локальная функция processPacket пропускает передаваемый сигнал через канал TGac, выполняет обработку приемника и оценку SNR.
VHT-LTF извлекается из принятого сигнала. VHT-LTF демодулируется OFDM и выполняется оценка канала.
Поле VHT Data извлекается из синхронизированного принятого сигнала.
Оценка шума выполняется с использованием пилот-сигналов демодулированного поля данных и оценки однопоточного канала на пилотных поднесущих.
Оцененное SNR для каждого пакета сравнивается с порогом, сравнение используется для корректировки MCS для следующего пакета.
PSDU восстанавливается с использованием извлеченного поля VHT-Data.
Для простоты в этом примере предполагается следующее:
Фиксированная полоса пропускания и конфигурация антенны для каждого передаваемого пакета.
Нет явного пакета обратной связи для информирования передатчика о предлагаемой установке MCS для следующего пакета. В примере предполагается, что эта информация известна передатчику перед передачей последующего пакета.
Фиксированное время простоя 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 и пропускной способности данных в течение всего периода моделирования.
График MCS, используемый для передачи каждого пакета. При сравнении с расчетным SNR можно увидеть, что выбор MCS зависит от расчетного SNR.
Частота битовых ошибок на пакет зависит от условий канала, SNR и MCS, используемых для передачи.
Пропускная способность максимизируется путем изменения 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 для последующих переданных пакетов.
В этом примере используются следующие вспомогательные функции:
Стандарт 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