Пакетное восстановление

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

Пакетное восстановление VHT

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

Сгенерируйте форму волны VHT на 80 МГц

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

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

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

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

Конкатенация отдельных полей, чтобы создать одну форму волны PPDU.

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

Передайте форму волны VHT через канал TGac SISO

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

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

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

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

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

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

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

fieldInd = wlanFieldIndices(vht)
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 Format Preamble')

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

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

Извлеките поле 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,vht.MCS)
ans = logical
   1

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

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

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

Извлеките и восстановите VHT-SIG-B.

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

Как описано в 802.11ac Станд. IEEE 2013, Таблица 22-1, значение в поле 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,vht.APEPLength)
ans = logical
   1

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

Восстановите содержимое VHT-данных с PPDU

Создайте объект настройки восстановления.

cfgRec = wlanRecoveryConfig;

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

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

Сравните передачу и получите биты PSDU.

numErr = biterr(txBits,recPSDU)
numErr = 0

Количество битовых ошибок является нулем.

Пакетное восстановление HT

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

Сгенерируйте форму волны HT на 20 МГц

Создайте объект настройки HT и передачу PSDU. Установите MCS на 2. Позже эти настройки сравниваются с восстановленной информацией сигнала. Для формы волны HT поле данных является битами PSDULength*8.

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

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

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

Конкатенация отдельных полей, чтобы создать одну форму волны PPDU.

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

Передайте форму волны HT через канал TGn SISO

Создайте канал TGn SISO и объекты канала 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 K, 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 обрабатываются, чтобы выполнить оценку смещения частоты и исправление и синхронизацию символа. В данном примере несущая частота не смещается, и пакетная синхронизация 'вовремя'. Поэтому для точной демодуляции, определение смещения несущей частоты и синхронизации символа не требуется.

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

fieldInd = wlanFieldIndices(ht)
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')

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

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

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

rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
[recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,ht.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,ht.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,ht.MCS)
ans = logical
   1

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

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

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

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

Создайте объект настройки восстановления.

cfgRec = wlanRecoveryConfig;

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

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

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

numErr = biterr(txPSDU,recPSDU)
numErr = 0

Пакетное восстановление Non-HT

Этот пример продвигается посредством восстановления содержимого формы волны формата non-HT.

Сгенерируйте форму волны Non-HT на 20 МГц

Создайте объект настройки non-HT и передачу PSDU. Установите MCS на 4. Позже эти настройки сравниваются с восстановленной информацией сигнала. Для формы волны non-HT поле данных является битами PSDULength*8.

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

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

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

Конкатенация отдельных полей, чтобы создать одну форму волны PPDU.

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

Передайте форму волны Non-HT через 802.11g канал SISO

Вычислите потерю пути свободного пространства для разделительного расстояния передатчика к получателю 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)
ch802 = 
  comm.RayleighChannel with properties:

             SampleRate: 20000000
             PathDelays: 1.0000e-07
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 3
        DopplerSpectrum: [1x1 struct]

  Show all properties

awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');

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

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

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

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

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

fieldInd = wlanFieldIndices(nht)
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')

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

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

Извлеките поле 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 non-HT 4.

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

   1   0   0   1

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

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

Восстановите содержимое Non-HT-Data с PPDU

Создайте объект настройки восстановления с его методом коррекции, обнуленным, обеспечив.

cfgRec = wlanRecoveryConfig('EqualizationMethod','ZF');

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

rxPSDU = rxPPDU(fieldInd.NonHTData(1):fieldInd.NonHTData(2),:);
[recPSDU,~,eqSym] = wlanNonHTDataRecover(rxPSDU,chEstLLTF,noiseVar,nht,cfgRec);

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

numErr = biterr(txPSDU,recPSDU)
numErr = 0

Смотрите также

| | |

Похожие темы