exponenta event banner

Процедура восстановления для пакета 802.11ac

В этом примере показано, как обнаружить пакет и декодировать биты полезной нагрузки в принятом сигнале IEEE ® 802.11ac™ VHT. Приемник восстанавливает параметры формата пакета из полей преамбулы для декодирования данных.

Введение

В однопользовательском пакете 802.11ac параметры передачи передаются в приемник с использованием полей преамбулы L-SIG и VHT-SIG-A [1]:

  • Поле L-SIG содержит информацию, позволяющую приемнику определять время передачи пакета.

  • Поле VHT-SIG-A содержит параметры передачи, включая схему модуляции и кодирования, количество пространственно-временных потоков и канальное кодирование.

В этом примере мы обнаруживаем и декодируем пакет в сформированной форме сигнала, содержащей допустимый кадр MAC с контрольной последовательностью кадров (FCS). Все параметры передачи, кроме полосы пропускания канала, считаются неизвестными и поэтому извлекаются из декодированных полей преамбулы L-SIG и VHT-SIG-A в каждом пакете. Извлеченная конфигурация передачи используется для декодирования полей данных VHT-SIG-B и VHT. Дополнительно проводят следующий анализ:

  • Отображается форма сигнала обнаруженного пакета.

  • Отображается спектр обнаруженного пакета.

  • Отображается совокупность выровненных символов данных на пространственный поток.

  • Измеряют величину вектора ошибки (EVM) каждого поля.

Передача сигнала

В этом примере однопользовательский сигнал VHT 802.11ac генерируется локально, но может использоваться захваченный сигнал. MATLAB ® может использоваться для получения данных I/Q от широкого спектра приборов с помощью Toolbox™ управления приборами и программно-определяемых радиоплатформ.

Локально генерируемая форма сигнала ухудшается посредством канала с замиранием 3x3 TGac, аддитивного белого гауссова шума и смещения несущей частоты. Для локальной генерации формы сигнала мы конфигурируем объект конфигурации формата пакета VHT. Следует отметить, что объект конфигурации пакета VHT используется только на стороне передатчика. Приемник будет динамически формулировать другой объект конфигурации VHT, когда пакет декодируется. Вспомогательная функция vhtSigRecGenerateWaveform генерирует нарушенную форму сигнала локально. В функции помощника выполняются следующие шаги обработки:

  • Правильный кадр MAC генерируется и кодируется в форму сигнала VHT.

  • Сигнал пропускают через модель канала с замиранием TGac.

  • Смещение несущей частоты добавляется к форме сигнала.

  • К форме сигнала добавляется аддитивный белый гауссов шум.

% VHT link parameters
cfgVHTTx = wlanVHTConfig( ...
    'ChannelBandwidth',    'CBW80', ...
    'NumTransmitAntennas', 3, ...
    'NumSpaceTimeStreams', 2, ...
    'SpatialMapping',      'Hadamard', ...
    'STBC',                true, ...
    'MCS',                 5, ...
    'GuardInterval',       'Long', ...
    'APEPLength',          1052);

% Propagation channel
numRx = 3;                  % Number of receive antennas
delayProfile = 'Model-C';   % TGac channel delay profile

% Impairments
noisePower = -30;  % Noise power to apply in dBW
cfo = 62e3;        % Carrier frequency offset (Hz)

% Generated waveform parameters
numTxPkt = 1;      % Number of transmitted packets
idleTime = 20e-6;  % Idle time before and after each packet

% Generate waveform
rx = vhtSigRecGenerateWaveform(cfgVHTTx, numRx, ...
    delayProfile, noisePower, cfo, numTxPkt, idleTime);

Восстановление пакетов

Сигнал для обработки сохраняется в переменной rx. Этапы обработки для восстановления пакета:

  • Пакет обнаружен и синхронизирован.

  • Обнаружен формат пакета.

  • Поле L-SIG извлекается, и его информационные биты восстанавливаются для определения длины пакета в микросекундах.

  • Извлекают поле VHT-SIG-A и восстанавливают его информационные биты.

  • Параметры формата пакета извлекаются из декодированных битов L-SIG и VHT-SIG-A.

  • Поле VHT-LTF извлекается для выполнения оценки канала MIMO для декодирования полей данных VHT-SIG-B и VHT.

  • Поле VHT-SIG-B извлекается, и его информационные биты восстанавливаются.

  • Поле VHT-Data извлекается, и биты PSDU и VHT-SIG-B CRC восстанавливаются, используя извлеченные параметры пакета.

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

cfgVHTRx = wlanVHTConfig('ChannelBandwidth', cfgVHTTx.ChannelBandwidth);
idxLSTF = wlanFieldIndices(cfgVHTRx, 'L-STF');
idxLLTF = wlanFieldIndices(cfgVHTRx, 'L-LTF');
idxLSIG = wlanFieldIndices(cfgVHTRx, 'L-SIG');
idxSIGA = wlanFieldIndices(cfgVHTRx, 'VHT-SIG-A');

Следующий код настраивает объекты и переменные для обработки.

chanBW = cfgVHTTx.ChannelBandwidth;
sr = wlanSampleRate(cfgVHTTx);

% Setup plots for example
[spectrumAnalyzer, timeScope, constellationDiagram] = vhtSigRecSetupPlots(sr);

% Minimum packet length is 10 OFDM symbols
lstfLen = double(idxLSTF(2)); % Number of samples in L-STF
minPktLen = lstfLen*5;

rxWaveLen = size(rx, 1);

Внешняя обработка

Внешняя обработка состоит из обнаружения пакетов, грубой коррекции смещения несущей частоты, временной синхронизации и точной коррекции смещения несущей частоты. A while цикл используется для обнаружения и синхронизации пакета в принятой форме сигнала. Смещение образца searchOffset используется для индексирования элементов в массиве rx для обнаружения пакета. Первый пакет в пределах rx обнаруживается и обрабатывается. При сбое синхронизации для обнаруженного пакета смещение индекса выборки searchOffset увеличивается, чтобы выйти за пределы обработанного пакета в rx. Это повторяется до тех пор, пока пакет не будет успешно обнаружен и синхронизирован.

searchOffset = 0; % Offset from start of waveform in samples
while (searchOffset + minPktLen) <= rxWaveLen
    % Packet detection
    pktOffset = wlanPacketDetect(rx, chanBW, searchOffset);

    % Adjust packet offset
    pktOffset = searchOffset + pktOffset;
    if isempty(pktOffset) || (pktOffset + idxLSIG(2) > rxWaveLen)
        error('** No packet detected **');
    end

    % Coarse frequency offset estimation using L-STF
    LSTF = rx(pktOffset + (idxLSTF(1):idxLSTF(2)), :);
    coarseFreqOffset = wlanCoarseCFOEstimate(LSTF, chanBW);

    % Coarse frequency offset compensation
    rx = helperFrequencyOffset(rx,sr,-coarseFreqOffset);

    % Symbol timing synchronization
    LLTFSearchBuffer = rx(pktOffset+(idxLSTF(1):idxLSIG(2)),:);
    pktOffset = pktOffset+wlanSymbolTimingEstimate(LLTFSearchBuffer,chanBW);
    if (pktOffset + minPktLen) > rxWaveLen
        fprintf('** Not enough samples to recover packet **\n\n');
        break;
    end

    % Timing synchronization complete: packet detected
    fprintf('Packet detected at index %d\n\n', pktOffset + 1);

    % Fine frequency offset estimation using L-LTF
    LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)), :);
    fineFreqOffset = wlanFineCFOEstimate(LLTF, chanBW);

    % Fine frequency offset compensation
    rx = helperFrequencyOffset(rx, sr, -fineFreqOffset);

    % Display estimated carrier frequency offset
    cfoCorrection = coarseFreqOffset + fineFreqOffset; % Total CFO
    fprintf('Estimated CFO: %5.1f Hz\n\n', cfoCorrection);

    break; % Front-end processing complete, stop searching for a packet
end
Packet detected at index 1600

Estimated CFO: 61954.3 Hz

Определение формата

Формат пакета определяется с использованием трех символов OFDM, непосредственно следующих за L-LTF. Требуется оценка мощности канала и шума, полученных от L-LTF.

% Channel estimation using L-LTF
LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)), :);
demodLLTF = wlanLLTFDemodulate(LLTF, chanBW);
chanEstLLTF = wlanLLTFChannelEstimate(demodLLTF, chanBW);

% Estimate noise power in non-HT fields
noiseVarNonHT = helperNoiseEstimate(demodLLTF);

% Detect the format of the packet
fmt = wlanFormatDetect(rx(pktOffset + (idxLSIG(1):idxSIGA(2)), :), ...
    chanEstLLTF, noiseVarNonHT, chanBW);
disp([fmt ' format detected']);
if ~strcmp(fmt,'VHT')
    error('** A format other than VHT has been detected **');
end
VHT format detected

Декодирование L-SIG

При передаче VHT поле L-SIG используется для определения времени приема или RXTIME пакета. RXTIME вычисляется с использованием битов поля полезной нагрузки L-SIG [1 Экв. 22-105]. Количество выборок, содержащих пакет в пределах rx затем можно рассчитать. Полезная нагрузка L-SIG декодируется с использованием оценки мощности канала и шума, полученной из L-LTF.

% Recover L-SIG field bits
disp('Decoding L-SIG... ');
[rxLSIGBits, failCheck, eqLSIGSym] = wlanLSIGRecover(rx(pktOffset + (idxLSIG(1):idxLSIG(2)), :), ...
    chanEstLLTF, noiseVarNonHT, chanBW);

if failCheck % Skip L-STF length of samples and continue searching
    disp('** L-SIG check fail **');
else
    disp('L-SIG check pass');
end

% Measure EVM of L-SIG symbol
EVM = comm.EVM;
EVM.ReferenceSignalSource = 'Estimated from reference constellation';
EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK');
rmsEVM = EVM(eqLSIGSym);
fprintf('L-SIG EVM: %2.2f%% RMS\n', rmsEVM);

% Calculate the receive time and corresponding number of samples in the
% packet
lengthBits = rxLSIGBits(6:17).';
RXTime = ceil((bi2de(double(lengthBits)) + 3)/3) * 4 + 20; % us
numRxSamples = RXTime * 1e-6 * sr; % Number of samples in receive time

fprintf('RXTIME: %dus\n', RXTime);
fprintf('Number of samples in packet: %d\n\n', numRxSamples);
Decoding L-SIG... 
L-SIG check pass
L-SIG EVM: 1.83% RMS
RXTIME: 84us
Number of samples in packet: 6720

Форма сигнала и спектр обнаруженного пакета в пределах rx отображаются для вычисленного RXTIME и соответствующего количества выборок.

sampleOffset = max((-lstfLen + pktOffset), 1); % First index to plot
sampleSpan = numRxSamples + 2*lstfLen;         % Number of samples to plot
% Plot as much of the packet (and extra samples) as we can
plotIdx = sampleOffset:min(sampleOffset + sampleSpan, rxWaveLen);

% Configure timeScope to display the packet
timeScope.TimeSpan = sampleSpan/sr;
timeScope.TimeDisplayOffset = sampleOffset/sr;
timeScope.YLimits = [0 max(abs(rx(:)))];
timeScope(abs(rx(plotIdx ,:)));

% Display the spectrum of the detected packet
spectrumAnalyzer(rx(pktOffset + (1:numRxSamples), :));

Декодирование VHT-SIG-A

Поле VHT-SIG-A содержит конфигурацию передачи пакета. Биты VHT-SIG-A восстанавливаются с использованием оценок мощности канала и шума, полученных из L-LTF.

% Recover VHT-SIG-A field bits
disp('Decoding VHT-SIG-A... ');
[rxSIGABits, failCRC, eqSIGASym] = wlanVHTSIGARecover(rx(pktOffset + (idxSIGA(1):idxSIGA(2)), :), ...
    chanEstLLTF, noiseVarNonHT, chanBW);

if failCRC
    disp('** VHT-SIG-A CRC fail **');
else
    disp('VHT-SIG-A CRC pass');
end

% Measure EVM of VHT-SIG-A symbols for BPSK and QBPSK modulation schemes
release(EVM);
EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK');
rmsEVMSym1 = EVM(eqSIGASym(:,1));
release(EVM);
EVM.ReferenceConstellation = wlanReferenceSymbols('QBPSK');
rmsEVMSym2 = EVM(eqSIGASym(:,2));
fprintf('VHT-SIG-A EVM: %2.2f%% RMS\n', mean([rmsEVMSym1 rmsEVMSym2]));
Decoding VHT-SIG-A... 
VHT-SIG-A CRC pass
VHT-SIG-A EVM: 2.06% RMS

Вспомогательная функция helperVHTConfigRecover возвращает объект конфигурации формата VHT, cfgVHTRx, на основе восстановленных битов VHT-SIG-A и L-SIG. Свойства, которые не требуются для декодирования формы сигнала, устанавливаются в значения по умолчанию для wlanVHTConfig объект и, следовательно, может отличаться от значения в cfgVHTTx. Примеры таких свойств включают NumTransmitAntennas и SpatialMapping.

% Create a VHT format configuration object by retrieving packet parameters
% from the decoded L-SIG and VHT-SIG-A bits
cfgVHTRx = helperVHTConfigRecover(rxLSIGBits, rxSIGABits);

% Display the transmission configuration obtained from VHT-SIG-A
vhtSigRecDisplaySIGAInfo(cfgVHTRx);
  Decoded VHT-SIG-A contents: 
       ChannelBandwidth: 'CBW80'
    NumSpaceTimeStreams: 2
                   STBC: 1
                    MCS: 5
          ChannelCoding: {'BCC'}
          GuardInterval: 'Long'
                GroupID: 63
             PartialAID: 275
            Beamforming: 0
             PSDULength: 1167

Информация, предоставляемая VHT-SIG-A, позволяет вычислять местоположение последующих полей в принятой форме сигнала.

% Obtain starting and ending indices for VHT-LTF and VHT-Data fields
% using retrieved packet parameters
idxVHTLTF  = wlanFieldIndices(cfgVHTRx, 'VHT-LTF');
idxVHTSIGB = wlanFieldIndices(cfgVHTRx, 'VHT-SIG-B');
idxVHTData = wlanFieldIndices(cfgVHTRx, 'VHT-Data');

% Warn if waveform does not contain whole packet
if (pktOffset + double(idxVHTData(2))) > rxWaveLen
    fprintf('** Not enough samples to recover entire packet **\n\n');
end

Декодирование VHT-SIG-B

Первичное использование VHT-SIG-B предназначено для сигнализации пользовательской информации в многопользовательском пакете. В однопользовательском пакете VHT-SIG-B несет длину пакета, которая также может быть вычислена с использованием L-SIG и VHT-SIG-A (что показано в разделах выше). Несмотря на то, что не требуется декодировать однопользовательский пакет, VHT-SIG-B восстанавливается ниже, и биты интерпретируются. Символы VHT-SIG-B демодулируются с использованием оценки канала MIMO, полученной из VHT-LTF. Обратите внимание, что CRC для VHT-SIG-B переносится в поле VHT Data.

% Estimate MIMO channel using VHT-LTF and retrieved packet parameters
demodVHTLTF = wlanVHTLTFDemodulate(rx(pktOffset + (idxVHTLTF(1):idxVHTLTF(2)), :), cfgVHTRx);
chanEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF, cfgVHTRx);

% Estimate noise power in VHT-SIG-B fields
noiseVarVHT = helperNoiseEstimate(demodLLTF, chanBW, cfgVHTRx.NumSpaceTimeStreams);

% VHT-SIG-B Recover
disp('Decoding VHT-SIG-B...');
[rxSIGBBits, eqSIGBSym] = wlanVHTSIGBRecover(rx(pktOffset + (idxVHTSIGB(1):idxVHTSIGB(2)),:), ...
    chanEstVHTLTF, noiseVarVHT, chanBW);

% Measure EVM of VHT-SIG-B symbol
release(EVM);
EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK');
rmsEVM = EVM(eqSIGBSym);
fprintf('VHT-SIG-B EVM: %2.2f%% RMS\n', rmsEVM);

% Interpret VHT-SIG-B bits to recover the APEP length (rounded up to a
% multiple of four bytes) and generate reference CRC bits
[refSIGBCRC, sigbAPEPLength] = helperInterpretSIGB(rxSIGBBits, chanBW, true);
disp('Decoded VHT-SIG-B contents: ');
fprintf('  APEP Length (rounded up to 4 byte multiple): %d bytes\n\n', sigbAPEPLength);
Decoding VHT-SIG-B...
VHT-SIG-B EVM: 5.21% RMS
Decoded VHT-SIG-B contents: 
  APEP Length (rounded up to 4 byte multiple): 1052 bytes

Декодирование данных VHT

Реконструированный объект конфигурации VHT может затем использоваться для восстановления поля данных VHT. Это включает в себя биты CRC VHT-SIG-B и PSDU.

Затем восстановленные символы данных VHT могут быть проанализированы по мере необходимости. В этом примере отображается выровненная совокупность восстановленных символов данных VHT на пространственный поток.

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

% Extract VHT Data samples from the waveform
vhtdata = rx(pktOffset + (idxVHTData(1):idxVHTData(2)), :);

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

% Recover PSDU bits using retrieved packet parameters and channel
% estimates from VHT-LTF
disp('Decoding VHT Data field...');
[rxPSDU, rxSIGBCRC, eqDataSym] = wlanVHTDataRecover(vhtdata, chanEstVHTLTF, noiseVarVHT, cfgVHTRx);

% Plot equalized constellation for each spatial stream
refConst = wlanReferenceSymbols(cfgVHTRx);
[Nsd, Nsym, Nss] = size(eqDataSym);
eqDataSymPerSS = reshape(eqDataSym, Nsd*Nsym, Nss);
for iss = 1:Nss
    constellationDiagram{iss}.ReferenceConstellation = refConst;
    constellationDiagram{iss}(eqDataSymPerSS(:, iss));
end

% Measure EVM of VHT-Data symbols
release(EVM);
EVM.ReferenceConstellation = refConst;
rmsEVM = EVM(eqDataSym(:));
fprintf('VHT-Data EVM: %2.2f%% RMS\n', rmsEVM);
Decoding VHT Data field...
VHT-Data EVM: 4.68% RMS

Затем биты CRC для VHT-SIG-B, восстановленные в данных VHT, сравниваются с локально сгенерированной ссылкой, чтобы определить, были ли успешно восстановлены биты услуги передачи данных VHT-SIG-B и VHT.

% Test VHT-SIG-B CRC from service bits within VHT Data against
% reference calculated with VHT-SIG-B bits
if ~isequal(refSIGBCRC, rxSIGBCRC)
    disp('** VHT-SIG-B CRC fail **');
else
    disp('VHT-SIG-B CRC pass');
end
VHT-SIG-B CRC pass

FCS в кадрах MAC может быть проверен с помощью wlanMPDUDecode. По мере восстановления кадра формата VHT PSDU содержит A-MPDU. MPDU извлекаются из A-MPDU с помощью wlanAMPDUDeaggregate.

mpduList = wlanAMPDUDeaggregate(rxPSDU, cfgVHTRx);
fprintf('Number of MPDUs present in the A-MPDU: %d\n', numel(mpduList));
Number of MPDUs present in the A-MPDU: 1

mpduList содержит распакованный список MPDU. Каждый MPDU в списке передается wlanMPDUDecode который проверяет FCS и декодирует MPDU.

for i = 1:numel(mpduList)
    [macCfg, payload, decodeStatus] = wlanMPDUDecode(mpduList{i}, cfgVHTRx, ...
                                                    'DataFormat', 'octets');
    if strcmp(decodeStatus, 'FCSFailed')
        fprintf('** FCS failed for MPDU-%d **\n', i);
    else
        fprintf('FCS passed for MPDU-%d\n', i);
    end
end
FCS passed for MPDU-1

Приложение

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

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

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