Восстановление сигнала 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) каждого поля измеряется.

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

В этом примере 802.11ac VHT однопользовательская форма волны сгенерирована локально, но полученная форма волны могла использоваться. MATLAB® может использоваться, чтобы получить данные I/Q из широкого спектра инструментов с помощью платформ программно определяемого радио и Instrument Control 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-поле-данных извлечено и PSDU, и биты CRC VHT-SIG-B восстановили использование полученных пакетных параметров.

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

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);

Выйдите напрямую обработку

Обработка фронтенда состоит из пакетного обнаружения, крупного исправления смещения несущей частоты, синхронизируя синхронизацию и прекрасное исправление смещения несущей частоты. Цикл 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.

% 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. MPDUs извлечены от 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 содержит de-aggregated список MPDUs. Каждый 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 802.11ac™-2013 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Спецификации - Поправка 4: Улучшения для Очень Высокой Пропускной способности для Операции в Полосах ниже 6 ГГц.