Процедура восстановления для пакета 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 Data. Дополнительно проводят следующий анализ:

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

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

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

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

Передача формы волны

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

Локально сгенерированная форма волны нарушается каналом 3x3 TGac с замираниями, аддитивным белым Гауссовым шумом и смещением несущей частоты. Чтобы сгенерировать сигнал локально, мы конфигурируем объект строения формата пакета VHT. Обратите внимание, что объект строения пакета VHT используется только на стороне передатчика. Приемник динамически формулирует другой объект строения VHT, когда пакет декодируется. Функция helper vhtSigRecGenerateWaveform генерирует ослабленную форму волны локально. Шаги обработки в функции helper:

  • Действительный 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 Data.

  • Поле 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 Eq. 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 Data. Сюда входят биты 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

The 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: Улучшения для очень высокой пропускной способности