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

Полученные пакеты ухудшаются из-за нарушений радиосвязи и канала. Восстановление содержимого пакета требует коррекции временных параметров символа и смещения частоты, оценки канала и демодуляции и восстановления преамбулы и полезной нагрузки. Функции WLAN Toolbox™ выполняют эти операции на полях VHT, HT-mixed и не-HT PPDU.

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

В этом примере показано, как восстановить содержимое из формы волны VHT формата.

Сгенерируйте сигнал VHT на 80 МГц

Создайте объект строения VHT. Задайте APEPLength на 3200 и MCS на 5. Создайте поток битов передачи для поля данных. Для формы волны VHT поле данных содержит PSDULength*8 биты.

cfgVHT = wlanVHTConfig('APEPLength',3200,'MCS',5);
txBits = randi([0 1],cfgVHT.PSDULength*8,1);

Создание полей PPDU по отдельности. Создайте поля преамбулы L-STF, L-LTF, L-SIG, VHT-SIG-A, VHT-STF, VHT-LTF и VHT-SIG-B и поле VHT-Data.

lstf = wlanLSTF(cfgVHT);
lltf = wlanLLTF(cfgVHT);
lsig = wlanLSIG(cfgVHT);
vhtSigA = wlanVHTSIGA(cfgVHT);
vhtstf = wlanVHTSTF(cfgVHT);
vhtltf = wlanVHTLTF(cfgVHT);
vhtSigB = wlanVHTSIGB(cfgVHT);
vhtData = wlanVHTData(txBits,cfgVHT);

Сгруппируйте отдельные поля, чтобы создать одну форму сигнала PPDU.

txPPDU = [lstf; lltf; lsig; vhtSigA; vhtstf; vhtltf; vhtSigB; vhtData];

Передайте сигнал VHT через канал SISO TGac

Создайте объекты каналов TGac SISO и AWGN.

chBW = cfgVHT.ChannelBandwidth;
fs = 80e6;
tgac = wlanTGacChannel('SampleRate',fs,'ChannelBandwidth',chBW,...
    'LargeScaleFadingEffect','Pathloss and shadowing');
awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');

Вычислите отклонение шума для приемника с рисунком шума на 9 дБ. Отклонение шума, noiseVar, равно kTBF, где k - константа Больцмана, T - температура окружающей среды 290 К, B - ширина полосы пропускания (частота дискретизации), а F - рисунок шума приемника. Передайте переданную форму волны через шумный канал TGac.

noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10)
noiseVar = 2.5438e-12
rxPPDU = awgnChan(tgac(txPPDU),noiseVar);

Восстановление содержимого преамбулы VHT из PPDU

В целом L-STF и L-LTF обрабатываются, чтобы выполнить оценку и коррекцию смещения частоты и синхронизацию символа. В данном примере несущая частота не смещена, и синхронизация пакета является 'on-time'. Поэтому для точной демодуляции определение смещения несущей частоты и временных параметров символа не требуется.

Найдите начальный и стоповый индексы для полей PPDU.

fieldInd = wlanFieldIndices(cfgVHT)
fieldInd = struct with fields:
       LSTF: [1 640]
       LLTF: [641 1280]
       LSIG: [1281 1600]
    VHTSIGA: [1601 2240]
     VHTSTF: [2241 2560]
     VHTLTF: [2561 2880]
    VHTSIGB: [2881 3200]
    VHTData: [3201 12160]

Индекс VHT-SIG-B указывает длину преамбулы в выборках.

numSamples = fieldInd.VHTSIGB(2);

Постройте график преамбулы и начала пакетных данных. Добавьте маркеры к и постройте график, чтобы очертить контуры поля пакета.

time = ([0:double(numSamples)-1]/fs)*1e6;
peak = 1.2*max(abs(rxPPDU(1:numSamples)));
fieldMarkers = zeros(numSamples,1);
fieldMarkers(fieldInd.LSTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LLTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LSIG(2)-1,1) = peak;
fieldMarkers(fieldInd.VHTSIGA(2)-1,1) = peak;
fieldMarkers(fieldInd.VHTSTF(2)-1,1) = peak;
fieldMarkers(fieldInd.VHTLTF(2)-1,1) = peak;
fieldMarkers(fieldInd.VHTSIGB(2)-1,1) = peak;
plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers)
xlabel ('Time (microseconds)')
ylabel('Magnitude')
title('VHT Preamble')

Figure contains an axes. The axes with title VHT Preamble contains 2 objects of type line.

Демодулируйте L-LTF и оцените канал.

rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgVHT);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgVHT);

Извлеките поле L-SIG из полученного PPDU, восстановите его информационные биты и проверьте CRC.

rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
[recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,chBW);
failCRC
failCRC = logical
   0

failCRC = 0 указывает, что CRC прошел.

Для формата VHT биты скорости L-SIG являются постоянными и устанавливаются на [1 1 0 1]. Проверьте информацию о скорости L-SIG и подтвердите, что эта постоянная последовательность восстановлена. Для формата VHT установка MCS в VHT-SIG-A2 определяет фактическую скорость передачи данных.

rate = recLSIG(1:4)'
rate = 1x4 int8 row vector

   1   1   0   1

Извлеките VHT-SIG-A и подтвердите, что проверка CRC прошла.

rxVHTSIGA = rxPPDU(fieldInd.VHTSIGA(1):fieldInd.VHTSIGA(2),:);
[recVHTSIGA,failCRC] = wlanVHTSIGARecover(rxVHTSIGA, ...
    chEstLLTF,noiseVar,chBW);
failCRC
failCRC = logical
   0

Извлеките настройку MCS из VHT-SIG-A. Для VHT с одним пользователем MCS расположен в VHT-SIG-A2 битах с 4 по 7.

recMCSbits = (recVHTSIGA(29:32))';
recMCS = bi2de(double(recMCSbits))
recMCS = 5
isequal(recMCS,cfgVHT.MCS)
ans = logical
   1

Восстановленный параметр MCS соответствует значению MCS в объекте строения.

Извлечение и демодуляция VHT-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления полей VHT-SIG-B и VHT-Data.

rxVHTLTF = rxPPDU(fieldInd.VHTLTF(1):fieldInd.VHTLTF(2),:);
demodVHTLTF = wlanVHTLTFDemodulate(rxVHTLTF,cfgVHT);
chEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF,cfgVHT);

Извлечение и извлечение VHT-SIG-B.

rxVHTSIGB = rxPPDU(fieldInd.VHTSIGB(1):fieldInd.VHTSIGB(2),:);
recVHTSIGB = wlanVHTSIGBRecover(rxVHTSIGB,chEstVHTLTF,noiseVar,chBW);

Как описано в таблице 22-1 IEEE Std 802.11ac -2013, значение в поле VHT-SIG-B Length, умноженное на 4, является восстановленной длиной APEP для пакетов, несущих данные. Проверьте, что длина APEP, содержащаяся в первых 19 битах VHT-SIG-B, соответствует указанной длине APEP.

sigbAPEPbits = recVHTSIGB(1:19)';
sigbAPEPlength = bi2de(double(sigbAPEPbits))*4
sigbAPEPlength = 3200
isequal(sigbAPEPlength,cfgVHT.APEPLength)
ans = logical
   1

Восстановленное значение соответствует сконфигурированной длине APEP.

Восстановите уравненные символы с помощью оценок канала из VHT-LTF.

recPSDU = wlanVHTDataRecover(rxPPDU(fieldInd.VHTData(1):fieldInd.VHTData(2),:),...
    chEstVHTLTF,noiseVar,cfgVHT);

Сравните биты PSDU передачи и приема.

numErr = biterr(txBits,recPSDU)
numErr = 0

Количество битовых ошибок равно нулю.

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

В этом примере показано, как восстановить содержимое с формы волны в формате HT.

Сгенерируйте сигнал HT на 20 МГц

Создайте объект строения HT и блок PSDU передачи. Задайте MCS на 2. Для формы волны HT поле данных PSDULength*8 биты.

cfgHT = wlanHTConfig('MCS',2);
txPSDU = randi([0 1],cfgHT.PSDULength*8,1);

Создание полей PPDU по отдельности. Создайте поля преамбулы L-STF, L-LTF, L-SIG, HT-SIG, HT-STF и HT-LTF и поле HT-Data.

lstf = wlanLSTF(cfgHT);
lltf = wlanLLTF(cfgHT);
lsig = wlanLSIG(cfgHT);
htsig = wlanHTSIG(cfgHT);
htstf = wlanHTSTF(cfgHT);
htltf = wlanHTLTF(cfgHT);
htData = wlanHTData(txPSDU,cfgHT);

Сгруппируйте отдельные поля, чтобы создать одну форму сигнала PPDU.

txPPDU = [lstf; lltf; lsig; htsig; htstf; htltf; htData];

Передайте сигнал HT через канал TGn SISO

Создайте объекты канала SISO TGn и канала AWGN.

fs = 20e6;
tgnChan = wlanTGnChannel('SampleRate',fs,'LargeScaleFadingEffect','Pathloss and shadowing');
awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');

Вычислите отклонение шума для приемника с рисунком шума на 9 дБ. Отклонение шума, noiseVar, равно kTBF, где k - константа Больцмана, T - температура окружающей среды 290 К, B - ширина полосы пропускания (частота дискретизации), а F - рисунок шума приемника. Передайте переданную форму волны через шумный канал TGn.

noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10);
rxPPDU = awgnChan(tgnChan(txPPDU),noiseVar);

Восстановление содержимого преамбулы HT из PPDU

В целом L-STF и L-LTF обрабатываются, чтобы выполнить оценку и коррекцию смещения частоты и синхронизацию символа. В данном примере несущая частота не смещена, и синхронизация пакета является 'on-time'. Поэтому для точной демодуляции определение смещения несущей частоты и временных параметров символа не требуется.

Найдите начальный и стоповый индексы для полей PPDU.

fieldInd = wlanFieldIndices(cfgHT)
fieldInd = struct with fields:
      LSTF: [1 160]
      LLTF: [161 320]
      LSIG: [321 400]
     HTSIG: [401 560]
     HTSTF: [561 640]
     HTLTF: [641 720]
    HTData: [721 9200]

Индекс HT-LTF указывает длину преамбулы в выборках.

numSamples = fieldInd.HTLTF(2);

Постройте график преамбулы и начала пакетных данных. Добавьте маркеры к и постройте график, чтобы очертить контуры поля пакета.

time = ([0:double(numSamples)-1]/fs)*1e6;
peak = 1.2*max(abs(rxPPDU(1:numSamples)));
fieldMarkers = zeros(numSamples,1);
fieldMarkers(fieldInd.LSTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LLTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LSIG(2)-1,1) = peak;
fieldMarkers(fieldInd.HTSIG(2)-1,1) = peak;
fieldMarkers(fieldInd.HTSTF(2)-1,1) = peak;
fieldMarkers(fieldInd.HTLTF(2)-1,1) = peak;
plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers)
xlabel ('Time (microseconds)')
ylabel('Magnitude')
title('HT Format Preamble')

Figure contains an axes. The axes with title HT Format Preamble contains 2 objects of type line.

Демодулируйте L-LTF и оцените канал.

rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgHT);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgHT);

Извлеките поле L-SIG из полученного PPDU и восстановите его информационные биты.

rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
[recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,cfgHT.ChannelBandwidth);
failCRC
failCRC = logical
   0

failCRC = 0 указывает, что CRC прошел.

Для формата HT биты скорости L-SIG являются постоянными и устанавливаются на [1 1 0 1]. Проверьте информацию о скорости L-SIG и подтвердите, что эта постоянная последовательность восстановлена. Для формата HT настройка MCS в HT-SIG определяет фактическую скорость передачи данных.

rate = recLSIG(1:4)'
rate = 1x4 int8 row vector

   1   1   0   1

Извлеките HT-SIG и подтвердите, что проверка CRC прошла.

recHTSIG = rxPPDU(fieldInd.HTSIG(1):fieldInd.HTSIG(2),:);
[recHTSIG,failCRC] = wlanHTSIGRecover(recHTSIG,chEstLLTF,noiseVar,cfgHT.ChannelBandwidth);
failCRC
failCRC = logical
   0

Извлеките настройку MCS из HT-SIG. Для HT MCS расположен в битах HT-SIG с 0 по 6.

recMCSbits = (recHTSIG(1:7))';
recMCS = bi2de(double(recMCSbits))
recMCS = 2
isequal(recMCS,cfgHT.MCS)
ans = logical
   1

Восстановленный параметр MCS соответствует значению MCS в объекте строения.

Извлечение и демодуляция HT-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления поля HT-Data.

rxHTLTF = rxPPDU(fieldInd.HTLTF(1):fieldInd.HTLTF(2),:);
demodHTLTF = wlanHTLTFDemodulate(rxHTLTF,cfgHT);
chEstHTLTF = wlanHTLTFChannelEstimate(demodHTLTF,cfgHT);

Восстановление содержимого HT-данных из PPDU

Восстановите полученные уравненные символы с помощью оценок канала от HT-LTF.

[recPSDU] = wlanHTDataRecover(rxPPDU(fieldInd.HTData(1):fieldInd.HTData(2),:),...
    chEstHTLTF,noiseVar,cfgHT);

Сравните переданные и принятые биты PSDU и подтвердите, что количество битовых ошибок меньше нуля.

numErr = biterr(txPSDU,recPSDU)
numErr = 0

Восстановление пакетов, отличных от HT

Этот пример проходит через восстановление содержимого волны без HT-формата.

Сгенерируйте сигнал без HT на 20 МГц

Создайте объект строения, отличный от HT, и блок PSDU передачи. Задайте MCS на 4Для формы сигнала, отличной от HT, поле данных PSDULength*8 биты.

cfgNonHT = wlanNonHTConfig('MCS',4);
txPSDU = randi([0 1],cfgNonHT.PSDULength*8,1);

Создание полей PPDU по отдельности. Используйте содержимое, отличное от HT-данных, чтобы проверить вероятность битовой ошибки после восстановления. Создайте поля преамбулы L-STF, L-LTF и L-SIG и поле данных, отличное от HT.

lstf = wlanLSTF(cfgNonHT);
lltf = wlanLLTF(cfgNonHT);
lsig = wlanLSIG(cfgNonHT);
nhtData = wlanNonHTData(txPSDU,cfgNonHT);

Сгруппируйте отдельные поля, чтобы создать одну форму сигнала PPDU.

txPPDU = [lstf; lltf; lsig; nhtData];

Передайте сигнал без HT через канал SISO 802.11g

Вычислите потери при распространении в свободном пространстве для расстояния разделения передатчика к приемнику 3 метра. Создайте канал 802.11g с максимальным доплеровским сдвигом на 3 Гц и задержкой пути RMS, равной двукратному шагу расчета. Создайте канал AWGN.

dist = 3;
pathLoss = 10^(-log10(4*pi*dist*(2.4e9/3e8)));
fs = 20e6;
trms = 2/fs;
maxDoppShift = 3;
ch802 = comm.RayleighChannel('SampleRate',fs,'MaximumDopplerShift',maxDoppShift,'PathDelays',trms);
awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');

Вычислите отклонение шума для приемника с рисунком шума на 9 дБ. Отклонение шума, noiseVar, равно kTBF, где k - константа Больцмана, T - температура окружающей среды 290 К, B - ширина полосы пропускания (частота дискретизации), а F - рисунок шума приемника. Передайте переданную форму волны через шумный канал 802.11g.

noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10);
rxPPDU = awgnChan(ch802(txPPDU),noiseVar) * pathLoss;

Восстановление содержимого преамбулы, отличной от HT, из PPDU

В целом L-STF и L-LTF обрабатываются, чтобы выполнить оценку и коррекцию смещения частоты и синхронизацию символа. В данном примере несущая частота не смещена, и синхронизация пакета является 'on-time'. Поэтому для точной демодуляции определение смещения несущей частоты и временных параметров символа не требуется.

Найдите начальный и стоповый индексы для полей PPDU.

fieldInd = wlanFieldIndices(cfgNonHT)
fieldInd = struct with fields:
         LSTF: [1 160]
         LLTF: [161 320]
         LSIG: [321 400]
    NonHTData: [401 7120]

Индекс остановки поля L-SIG указывает длину преамбулы в выборках.

numSamples = fieldInd.LSIG(2);

Постройте график преамбулы и начала пакетных данных. Добавьте маркеры к и постройте график, чтобы очертить контуры поля пакета.

time = ((0:double(numSamples)-1)/fs)*1e6;
peak = 1.2*max(abs(rxPPDU(1:numSamples)));
fieldMarkers = zeros(numSamples,1);
fieldMarkers(fieldInd.LSTF(2)-1,1)  = peak;
fieldMarkers(fieldInd.LLTF(2)-1,1) = peak;
fieldMarkers(fieldInd.LSIG(2)-1,1) = peak;
plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers)
xlabel ('Time (microseconds)')
ylabel('Magnitude')
title('Non-HT Format Preamble')

Figure contains an axes. The axes with title Non-HT Format Preamble contains 2 objects of type line.

Демодулируйте L-LTF и оцените канал.

rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgNonHT);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgNonHT);

Извлеките поле L-SIG из полученного PPDU и восстановите его информационные биты.

rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
recLSIG = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,'CBW20');

Первые четыре бита поля L-SIG, биты от 0 до 3, содержат информацию о скорости. Подтвердите, что последовательность [1 0 0 1] восстанавливается. Эта последовательность соответствует скорости передачи данных 24 МГц для настройки MCS, не являющейся HT 4.

rate = recLSIG(1:4)'
rate = 1x4 int8 row vector

   1   0   0   1

Извлечение и демодуляция L-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления поля, отличного от HT-данных.

rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:);
demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgNonHT);
chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgNonHT);

Восстановление содержимого данных, отличных от HT, из PPDU

Восстановите уравненные символы с помощью оценок канала из HT-LTF, задавая метод эквализации с нулевым принуждением.

rxPSDU = rxPPDU(fieldInd.NonHTData(1):fieldInd.NonHTData(2),:);
[recPSDU,~,eqSym] = wlanNonHTDataRecover(rxPSDU,chEstLLTF,noiseVar,cfgNonHT,'EqualizationMethod','ZF');

Сравните переданные и принятые биты PSDU и подтвердите, что количество битовых ошибок меньше нуля.

numErr = biterr(txPSDU,recPSDU)
numErr = 0

См. также

| |

Похожие темы