Отобразите передачу и прием Используя 802.11 формы волны и SDR

Это, которое показывают примеры, как закодировать и упаковать файл изображения в пакеты WLAN для передачи и впоследствии декодировать пакеты, чтобы получить изображение. Пример также показывает, как использовать программно определяемое радио (SDR) для беспроводной передачи и приема пакетов WLAN.

Введение

Этот пример импорт и сегменты файл изображения в несколько модулей эксплуатационных данных среднего управления доступом (MAC) (MSDUs). Это передает каждый MSDU wlanMACFrame функция, чтобы создать Модуль данных о протоколе MAC (MPDU). Эта функция также использует wlanMACFrameConfig возразите как вход, который последовательно нумерует MPDUs через SequenceNumber свойство. Пример затем передает MPDUs физическому слою (PHY) как Эксплуатационные данные Слоя PHY Модули (PSDUs). Каждые данные PSDU используют сингл, невысокопроизводительный (nonHT), 802.11a™ пакет WLAN для передачи. Этот пример создает основополосную форму волны WLAN с помощью wlanWaveformGenerator функция. Эта функция использует несколько PSDUs и процессы каждый, чтобы сформировать серию модулей данных о протоколе процедуры сходимости физического уровня (PLCP) (PPDUs), готовый к передаче.

Сгенерированная форма волны затем проходит через канал аддитивного белого Гауссова шума (AWGN), чтобы симулировать беспроводную передачу. Впоследствии, wlanMPDUDecode функционируйте берет шумную форму волны и декодирует его. Затем SequenceNumber свойство в восстановленном объекте настройки системы координат MAC позволяет примеру последовательно заказывать извлеченный MSDUs. Информационные биты в нескольких получили объединение MSDUs, чтобы восстановить переданное изображение. Эта схема показывает обработку приемника.

В качестве альтернативы сгенерированная форма волны WLAN может быть передана по воздуху и получила использование, они поддержали SDRs.

Пакет поддержки Communications Toolbox для аналога радио Devices® ADALM-Pluto

Пакет поддержки Communications Toolbox для радио USRP® Embedded Series

Пакет поддержки Communications Toolbox для радио Xilinx® Zynq®-Based

Setup в качестве примера

Прежде, чем запустить пример, набор channel переменная, чтобы быть одной из этих опций:

  • OverTheAir: Используйте SDR, чтобы передать и получить форму волны WLAN

  • GaussianNoise: Передайте форму волны передачи через канал AWGN (значение по умолчанию)

  • NoImpairments: Передайте форму волны передачи через без ухудшений

Если вы устанавливаете channel к OverTheAir, установите deviceName к желаемому SDR:

  • Установите на Pluto использовать Радио ADALM-Pluto (значение по умолчанию)

  • Установите на E3xx использовать USRP Встроенное Серийное Радио

  • Установите на AD936x или FMCOMMS5 использовать Xilinx Находящееся в Zynq Радио

channel = "GaussianNoise";
if образуйте канал == "OverTheAir"
    deviceName = "Pluto";
end

Сконфигурируйте все осциллографы и фигуры для примера.

% Setup handle for image plot
if ~exist('imFig','var') || ~ishandle(imFig) %#ok<SUSENS> 
    imFig = figure;
    imFig.NumberTitle = 'off';
    imFig.Name = 'Image Plot';
    imFig.Visible = 'off';
else
    clf(imFig); % Clear figure
    imFig.Visible = 'off';
end

% Setup Spectrum viewer
spectrumScope = dsp.SpectrumAnalyzer( ...
    'SpectrumType','Power density', ...
    'SpectralAverages',10, ...
    'YLimits',[-90 -30], ...
    'Title','Received Baseband WLAN Signal Spectrum', ...
    'YLabel','Power spectral density', ...
    'Position',[69 376 800 450]);

% Setup the constellation diagram viewer for equalized WLAN symbols
refQAM = wlanReferenceSymbols('64QAM');
constellation = comm.ConstellationDiagram(...
    'Title','Equalized WLAN Symbols',...
    'ShowReferenceConstellation',true,...
    'ReferenceConstellation',refQAM,...
    'Position',[878 376 460 460]);

Проект передатчика

Эти шаги описывают общую процедуру передатчика WLAN.

  1. Импортируйте файл изображения и преобразуйте его в поток десятичных байтов

  2. Сгенерируйте основополосный сигнал WLAN использование WLAN Toolbox

  3. Упакуйте поток данных в несколько 802.11a пакеты

При использовании SDR эти шаги описывают настройку передатчика SDR.

  1. Подготовьте сгенерированный модулированный сигнал к передаче с помощью оборудования SDR

  2. Отправьте основополосные данные в оборудование SDR для повышающей дискретизации и непрерывной передачи на желаемой центральной частоте

Подготовьте файл изображения

Считайте данные из файла изображения, масштабируйте его для передачи и преобразуйте его в поток десятичных байтов. Масштабирование изображения уменьшает качество путем уменьшения размера потока двоичных данных.

Размер потока двоичных данных влияет на количество пакетов WLAN, требуемых для передачи данных изображения. Количество пакетов WLAN, сгенерированных для передачи, зависит от этих факторов.

  1. Масштабирование изображений, набор при импорте файла изображения

  2. Длину данных несут в пакете, заданном msduLength переменная

  3. Схема модуляции и кодирования (MCS) значение переданного пакета

Комбинация масштабного коэффициента и длины MSDU определяет количество радио-пакетов WLAN, требуемых для передачи. Установка scale к 0.2 и msduLength к 2304 требует передачи 11 радио-пакетов WLAN. Увеличение масштабного коэффициента или уменьшение длины MSDU приведут к передаче большего количества пакетов.

% Input an image file and convert to binary stream
fileTx = 'peppers.png';            % Image file name
fData = imread(fileTx);            % Read image data from file
scale = 0.2;                       % Image scaling factor
origSize = size(fData);            % Original input image size
scaledSize = max(floor(scale.*origSize(1:2)),1); % Calculate new image size
heightIx = min(round(((1:scaledSize(1))-0.5)./scale+0.5),origSize(1));
widthIx = min(round(((1:scaledSize(2))-0.5)./scale+0.5),origSize(2));
fData = fData(heightIx,widthIx,:); % Resize image
imsize = size(fData);              % Store new image size
txImage = fData(:);

% Plot transmit image
imFig.Visible = 'on';
subplot(211);
imshow(fData);
title('Transmitted Image');
subplot(212);
title('Received image appears here...');
set(gca,'Visible','off');

Figure Image Plot contains an axes object. The axes object with title Transmitted Image contains an object of type image.

set(findall(gca, 'type', 'text'), 'visible', 'on');

Данные о передаче фрагмента

Разделите поток данных (txImage) в меньшие модули передачи (MSDUs) размера msduLength. Затем создайте MPDU для каждого модуля передачи с помощью wlanMACFrame функция. Каждый вызов этой функции создает соответствие MPDU данному MSDU и объекту настройки системы координат. Затем создайте объект настройки системы координат использование wlanMACFrameConfig сконфигурировать порядковый номер MPDU. Все MPDUs затем последовательно передаются физическому уровню для передачи.

Чтобы гарантировать, что размер MSDU передачи не превышает заданный стандартом максимум, устанавливает msduLength поле к 2304 байты. Чтобы сделать весь MPDUs тем же размером, добавьте данные в последнем MPDU с нулями.

msduLength = 2304; % MSDU length in bytes
numMSDUs = ceil(length(txImage)/msduLength);
padZeros = msduLength-mod(length(txImage),msduLength);
txData = [txImage;zeros(padZeros,1)];
txDataBits = double(reshape(de2bi(txData, 8)',[],1));

% Divide input data stream into fragments
bitsPerOctet = 8;
data = zeros(0,1);

for i=0:numMSDUs-1

    % Extract image data (in octets) for each MPDU
    frameBody = txData(i*msduLength+1:msduLength*(i+1),:);

    % Create MAC frame configuration object and configure sequence number
    cfgMAC = wlanMACFrameConfig('FrameType','Data','SequenceNumber',i);

    % Generate MPDU
    [psdu, lengthMPDU]= wlanMACFrame(frameBody,cfgMAC,'OutputFormat','bits');

    % Concatenate PSDUs for waveform generation
    data = [data; psdu]; %#ok<AGROW>

end

Сгенерируйте 802.11a основополосный сигнал WLAN

Синтезируйте форму волны non-HT с помощью wlanWaveformGenerator функция с объектом настройки формата non-HT, созданным wlanNonHTConfig функция. В этом примере объект настройки имеет полосу пропускания на 20 МГц, одну передающую антенну и 64QAM уровень 2/3 (MCS 6).

nonHTcfg = wlanNonHTConfig;       % Create packet configuration
nonHTcfg.MCS = 6;                 % Modulation: 64QAM Rate: 2/3
nonHTcfg.NumTransmitAntennas = 1; % Number of transmit antenna
chanBW = nonHTcfg.ChannelBandwidth;
nonHTcfg.PSDULength = lengthMPDU; % Set the PSDU length

Инициализируйте скремблер случайным целым числом для каждого пакета.

scramblerInitialization = randi([1 127],numMSDUs,1);

Установитесь коэффициент сверхдискретизации на 1.5 сгенерировать форму волны на уровне 30 МГц для передачи.

osf = 1.5;

sampleRate = wlanSampleRate(nonHTcfg); % Nominal sample rate in Hz

% Generate baseband NonHT packets separated by idle time
txWaveform = wlanWaveformGenerator(data,nonHTcfg, ...
    'NumPackets',numMSDUs,'IdleTime',20e-6, ...
    'ScramblerInitialization',scramblerInitialization,...
    'OversamplingFactor',osf);

Сконфигурируйте SDR для передачи

При использовании SDR, установленного параметр усиления передатчика (txGain) уменьшать качество передачи и повреждать принятую форму волны.

Создайте sdrTransmitter объект с помощью sdrtx функция. Установите центральную частоту, частоту дискретизации и усиление к соответствующим свойствам sdrTransmitter объект. Для 802.11a сигнал на канале 5 в диапазоне частот на 2,4 ГГц, соответствующая центральная частота составляет 2,432 ГГц, как задано в разделе 16.3.6.3 из Станд. IEEE 802.11-2016.

sdrTransmitter возразите использует функциональность повторения передачи, чтобы передать основополосную форму волны WLAN в цикле из памяти двойной скорости передачи данных (DDR) на SDR.

if channel == "OverTheAir"
    txGain = -10;

    % Transmitter properties
    sdrTransmitter = sdrtx (deviceName);
    sdrTransmitter.BasebandSampleRate = sampleRate*osf;
    sdrTransmitter.CenterFrequency = 2.432e9; % Channel 5
    sdrTransmitter.Gain = txGain;

    fprintf'\nGenerating WLAN transmit waveform:\n')

    % Scale the normalized signal to avoid saturation of RF stages
    powerScaleFactor = 0.8;
    txWaveform = txWaveform.* (1/макс. (abs (txWaveform)) *powerScaleFactor);

    % Transmit RF waveform
    transmitRepeat (sdrTransmitter, txWaveform);
end

transmitRepeat функционируйте передает основополосные пакеты WLAN со временем простоя к SDR и хранит выборки сигнала в аппаратной памяти. Пример затем передает форму волны постоянно по воздуху до релиза объекта передачи.

Проект приемника

Описанные ниже шаги описывают общую структуру приемника WLAN.

  1. При использовании оборудования SDR получите несколько пакетов переданного сигнала WLAN

  2. Обнаружьте пакет

  3. Крупное смещение несущей частоты оценивается и корректируется

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

  5. Прекрасное смещение несущей частоты оценивается и корректируется

  6. Выполните оценку канала для полученного сигнала с помощью L-LTF

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

  8. Декодируйте поле L-SIG, чтобы восстановить значение MCS и длину фрагмента данных

  9. Декодируйте поле данных, чтобы получить передаваемые данные в каждом пакете

  10. Декодируйте полученный PSDU и проверку, если последовательность проверки системы координат (FCS) передала для PSDU

  11. Закажите декодируемый MSDUs на основе SequenceNumber свойство в восстановленном MAC структурирует объект настройки

  12. Объедините декодируемый MSDUs от всех переданных пакетов, чтобы сформировать полученное изображение

Этот пример строит спектральную плотность мощности (PSD) принятой формы волны и показывает визуализацию компенсируемых символов данных и полученного изображения.

Setup приемника

При использовании SDR создайте sdrReceiver объект с помощью sdrrx функция. Установите центральную частоту, частоту дискретизации и тип выходных данных к соответствующим свойствам sdrReceiver объект.

В противном случае примените гауссов шум к txWaveform использование awgn функционируйте или передайте txWaveform сквозной к обработке приемника.

if channel == "OverTheAir"
    sdrReceiver = sdrrx(deviceName);
    sdrReceiver.BasebandSampleRate = sdrTransmitter.BasebandSampleRate;
    sdrReceiver.CenterFrequency = sdrTransmitter.CenterFrequency;
    sdrReceiver.OutputDataType = 'double';

    % Configure the capture length equivalent to twice the length of the
    % transmitted signal, this is to ensure that PSDUs are received in order.
    % On reception the duplicate MAC fragments are removed.
    sdrReceiver.SamplesPerFrame = 2*length(txWaveform);
    fprintf('\nStarting a new RF capture.\n')

    rxWaveform = capture(sdrReceiver,sdrReceiver.SamplesPerFrame,'Samples');
elseif channel == "GaussianNoise"
    SNR = 20; % dB
    rxWaveform = awgn(txWaveform,SNR,'measured');
else % No Impairments
    rxWaveform = txWaveform;
end

Покажите спектральную плотность мощности принятой формы волны.

spectrumScope.SampleRate = sampleRate*osf;
spectrumScope(rxWaveform);

Figure Spectrum Analyzer contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object with title Received Baseband WLAN Signal Spectrum contains an object of type line. This object represents Channel 1.

Обработка приемника

Спроектируйте фильтр преобразования уровня для передискретизации формы волны к номинальному основополосному уровню для обработки приемника с помощью designMultirateFIR функция.

aStop = 40; % Stopband attenuation
ofdmInfo = wlanNonHTOFDMInfo('NonHT-Data',nonHTcfg); % OFDM parameters
SCS = sampleRate/ofdmInfo.FFTLength; % Subcarrier spacing
txbw = max(abs(ofdmInfo.ActiveFrequencyIndices))*2*SCS; % Occupied bandwidth
[L,M] = rat(1/osf);
maxLM = max([L M]);
R = (sampleRate-txbw)/sampleRate;
TW = 2*R/maxLM; % Transition width
b = designMultirateFIR(L,M,TW,aStop);

Передискретизируйте сверхдискретизированную форму волны назад к 20 МГц для обработки использования dsp.FIRRateConverter Системный объект и фильтр, спроектированный выше.

firrc = dsp.FIRRateConverter(L,M,b);
rxWaveform = firrc(rxWaveform);

При использовании SDR SDR постоянно передает 802,11 формы волны, беспроводные в цикле. Первый пакет получен sdrReceiver может не быть первый переданный пакет. Это означает, что пакеты могут декодироваться из последовательности. Чтобы позволить полученным пакетам быть повторно объединенными в правильном порядке, их порядковый номер должен быть определен. wlanMPDUDecode функция декодирует MPDU от декодируемых битов PSDU каждого пакета и выводит MSDU, а также восстановленный объект wlanMACFrameConfig настройки системы координат MAC. SequenceNumber свойство в восстановленном объекте настройки системы координат MAC может использоваться для упорядоченного расположения MSDUs в переданной последовательности.

Чтобы отобразить декодируемое содержимое L-SIG каждого пакета, измерения EVM и порядковый номер, проверяют displayFlag поле.

displayFlag = false; 

Настройте необходимые переменные для обработки приемника.

rxWaveformLen = size(rxWaveform,1);
searchOffset = 0; % Offset from start of the waveform in samples

Получите индексы обязательного поля в PSDU.

ind = wlanFieldIndices(nonHTcfg);
Ns = ind.LSIG(2)-ind.LSIG(1)+1; % Number of samples in an OFDM symbol

% Minimum packet length is 10 OFDM symbols
lstfLen = double(ind.LSTF(2)); % Number of samples in L-STF
minPktLen = lstfLen*5;
pktInd = 1;
fineTimingOffset = [];
packetSeq = [];
rxBit = [];

% Perform EVM calculation
evmCalculator = comm.EVM('AveragingDimensions',[1 2 3]);
evmCalculator.MaximumEVMOutputPort = true;

Используйте while цикл, чтобы обработать полученные неисправные пакеты.

while (searchOffset+minPktLen)<=rxWaveformLen
    % Packet detect
    pktOffset = wlanPacketDetect(rxWaveform,chanBW,searchOffset,0.5);

    % Adjust packet offset
    pktOffset = searchOffset+pktOffset;
    if isempty(pktOffset) || (pktOffset+double(ind.LSIG(2))>rxWaveformLen)
        if pktInd==1
            disp('** No packet detected **');
        end
        break;
    end

    % Extract non-HT fields and perform coarse frequency offset correction
    % to allow for reliable symbol timing
    nonHT = rxWaveform(pktOffset+(ind.LSTF(1):ind.LSIG(2)),:);
    coarseFreqOffset = wlanCoarseCFOEstimate(nonHT,chanBW);
    nonHT = helperFrequencyOffset(nonHT,sampleRate,-coarseFreqOffset);

    % Symbol timing synchronization
    fineTimingOffset = wlanSymbolTimingEstimate(nonHT,chanBW);

    % Adjust packet offset
    pktOffset = pktOffset+fineTimingOffset;

    % Timing synchronization complete: Packet detected and synchronized
    % Extract the non-HT preamble field after synchronization and
    % perform frequency correction
    if (pktOffset<0) || ((pktOffset+minPktLen)>rxWaveformLen)
        searchOffset = pktOffset+1.5*lstfLen;
        continue;
    end
    fprintf('\nPacket-%d detected at index %d\n',pktInd,pktOffset+1);

    % Extract first 7 OFDM symbols worth of data for format detection and
    % L-SIG decoding
    nonHT = rxWaveform(pktOffset+(1:7*Ns),:);
    nonHT = helperFrequencyOffset(nonHT,sampleRate,-coarseFreqOffset);

    % Perform fine frequency offset correction on the synchronized and
    % coarse corrected preamble fields
    lltf = nonHT(ind.LLTF(1):ind.LLTF(2),:);           % Extract L-LTF
    fineFreqOffset = wlanFineCFOEstimate(lltf,chanBW);
    nonHT = helperFrequencyOffset(nonHT,sampleRate,-fineFreqOffset);
    cfoCorrection = coarseFreqOffset+fineFreqOffset; % Total CFO

    % Channel estimation using L-LTF
    lltf = nonHT(ind.LLTF(1):ind.LLTF(2),:);
    demodLLTF = wlanLLTFDemodulate(lltf,chanBW);
    chanEstLLTF = wlanLLTFChannelEstimate(demodLLTF,chanBW);

    % Noise estimation
    noiseVarNonHT = helperNoiseEstimate(demodLLTF);

    % Packet format detection using the 3 OFDM symbols immediately
    % following the L-LTF
    format = wlanFormatDetect(nonHT(ind.LLTF(2)+(1:3*Ns),:), ...
        chanEstLLTF,noiseVarNonHT,chanBW);
    disp(['  ' format ' format detected']);
    if ~strcmp(format,'Non-HT')
        fprintf('  A format other than Non-HT has been detected\n');
        searchOffset = pktOffset+1.5*lstfLen;
        continue;
    end

    % Recover L-SIG field bits
    [recLSIGBits,failCheck] = wlanLSIGRecover( ...
        nonHT(ind.LSIG(1):ind.LSIG(2),:), ...
        chanEstLLTF,noiseVarNonHT,chanBW);

    if failCheck
        fprintf('  L-SIG check fail \n');
        searchOffset = pktOffset+1.5*lstfLen;
        continue;
    else
        fprintf('  L-SIG check pass \n');
    end

    % Retrieve packet parameters based on decoded L-SIG
    [lsigMCS,lsigLen,rxSamples] = helperInterpretLSIG(recLSIGBits,sampleRate);

    if (rxSamples+pktOffset)>length(rxWaveform)
        disp('** Not enough samples to decode packet **');
        break;
    end

    % Apply CFO correction to the entire packet
    rxWaveform(pktOffset+(1:rxSamples),:) = helperFrequencyOffset(...
        rxWaveform(pktOffset+(1:rxSamples),:),sampleRate,-cfoCorrection);

    % Create a receive Non-HT config object
    rxNonHTcfg = wlanNonHTConfig;
    rxNonHTcfg.MCS = lsigMCS;
    rxNonHTcfg.PSDULength = lsigLen;

    % Get the data field indices within a PPDU
    indNonHTData = wlanFieldIndices(rxNonHTcfg,'NonHT-Data');

    % Recover PSDU bits using transmitted packet parameters and channel
    % estimates from L-LTF
    [rxPSDU,eqSym] = wlanNonHTDataRecover(rxWaveform(pktOffset+...
        (indNonHTData(1):indNonHTData(2)),:), ...
        chanEstLLTF,noiseVarNonHT,rxNonHTcfg);

    constellation(reshape(eqSym,[],1)); % Current constellation
    pause(0); % Allow constellation to repaint
    release(constellation); % Release previous constellation plot

    refSym = wlanClosestReferenceSymbol(eqSym,rxNonHTcfg);
    [evm.RMS,evm.Peak] = evmCalculator(refSym,eqSym);

    % Decode the MPDU and extract MSDU
    [cfgMACRx,msduList{pktInd},status] = wlanMPDUDecode(rxPSDU,rxNonHTcfg); %#ok<*SAGROW>

    if strcmp(status,'Success')
        disp('  MAC FCS check pass');

        % Store sequencing information
        packetSeq(pktInd) = cfgMACRx.SequenceNumber;

        % Convert MSDU to a binary data stream
        rxBit{pktInd} = reshape(de2bi(hex2dec(cell2mat(msduList{pktInd})),8)',[],1);

    else % Decoding failed
        if strcmp(status,'FCSFailed')
            % FCS failed
            disp('  MAC FCS check fail');
        else
            % FCS passed but encountered other decoding failures
            disp('  MAC FCS check pass');
        end

        % Since there are no retransmissions modeled in this example, we
        % extract the image data (MSDU) and sequence number from the MPDU,
        % even though FCS check fails.

        % Remove header and FCS. Extract the MSDU.
        macHeaderBitsLength = 24*bitsPerOctet;
        fcsBitsLength = 4*bitsPerOctet;
        msduList{pktInd} = rxPSDU(macHeaderBitsLength+1:end-fcsBitsLength);

        % Extract and store sequence number
        sequenceNumStartIndex = 23*bitsPerOctet+1;
        sequenceNumEndIndex = 25*bitsPerOctet-4;
        packetSeq(pktInd) = bi2de(rxPSDU(sequenceNumStartIndex:sequenceNumEndIndex)');

        % MSDU binary data stream
        rxBit{pktInd} = double(msduList{pktInd});
    end

    % Display decoded information
    if displayFlag
        fprintf('  Estimated CFO: %5.1f Hz\n\n',cfoCorrection); %#ok<*UNRCH> 

        disp('  Decoded L-SIG contents: ');
        fprintf('                            MCS: %d\n',lsigMCS);
        fprintf('                         Length: %d\n',lsigLen);
        fprintf('    Number of samples in packet: %d\n\n',rxSamples);

        fprintf('  EVM:\n');
        fprintf('    EVM peak: %0.3f%%  EVM RMS: %0.3f%%\n\n', ...
            evm.Peak,evm.RMS);

        fprintf('  Decoded MAC Sequence Control field contents:\n');
        fprintf('    Sequence number: %d\n\n',packetSeq(pktInd));
    end

    % Update search index
    searchOffset = pktOffset+double(indNonHTData(2));
    
    % Finish processing when a duplicate packet is detected. The
    % recovered data includes bits from duplicate frame
    % Remove the data bits from the duplicate frame
    if length(unique(packetSeq)) < length(packetSeq)
        rxBit = rxBit(1:length(unique(packetSeq)));
        break
    end

    pktInd = pktInd+1;
end
Packet-1 detected at index 7
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-2 detected at index 8647
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-3 detected at index 17287
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-4 detected at index 25927
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-5 detected at index 34567
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-6 detected at index 43207
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-7 detected at index 51847
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-8 detected at index 60487
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-9 detected at index 69127
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-10 detected at index 77767
  Non-HT format detected
  L-SIG check pass 
  MAC FCS check pass
Packet-11 detected at index 86407
  Non-HT format detected
  L-SIG check pass 

  MAC FCS check pass

При использовании SDR выпустите sdrTransmitter и sdrReceiver объекты остановить непрерывную передачу 802,11 форм волны и допускать любую модификацию свойств объектов SDR.

if channel == "OverTheAir"
    release(sdrTransmitter);
    release(sdrReceiver);
end
release(spectrumScope); 

Figure Spectrum Analyzer contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object with title Received Baseband WLAN Signal Spectrum contains an object of type line. This object represents Channel 1.

Восстановите изображение

Восстановите изображение с помощью принятых кадров MAC.

if ~(isempty(fineTimingOffset) || isempty(pktOffset))
    
    rxData = cell2mat(rxBit);
    startSeq = find(packetSeq==0);
    rxData = circshift(rxData,[0 -(startSeq(1)-1)]); % Order MAC fragments

    % Perform bit error rate (BER) calculation
    bitErrorRate = comm.ErrorRate;
    err = bitErrorRate(double(rxData(:)), ...
        txDataBits(1:length(reshape(rxData,[],1))));
    fprintf('  \nBit Error Rate (BER):\n');
    fprintf('          Bit Error Rate (BER) = %0.5f\n',err(1));
    fprintf('          Number of bit errors = %d\n',err(2));
    fprintf('    Number of transmitted bits = %d\n\n',length(txDataBits));

   
    try
        decdata = bi2de(reshape(rxData(1:length(txImage)*bitsPerOctet),8,[])');
        % Recreate image from received data
        fprintf('\nConstructing image from received data.\n');
        receivedImage = uint8(reshape(decdata,imsize));
        % Plot received image
        if exist('imFig','var') && ishandle(imFig) % If Tx figure is open
            figure(imFig); subplot(212);
        else
            figure; subplot(212);
        end
        imshow(receivedImage);
        title(sprintf('Received Image'));
    catch
        error("**Not enough received data to reconstruct image.**")
    end

    
end
  
Bit Error Rate (BER):
          Bit Error Rate (BER) = 0.00000
          Number of bit errors = 0
    Number of transmitted bits = 202752
Constructing image from received data.

Figure Image Plot contains 2 axes objects. Axes object 1 with title Transmitted Image contains an object of type image. Axes object 2 with title Received Image contains an object of type image.

Дальнейшее исследование

  • При использовании SDR измените txGain наблюдать различие в EVM и BER после приема сигнала и обработки. Можно видеть ошибки в отображенном, полученном изображении.

  • При выполнении примера без SDR измените SNR наблюдать различие в EVM и BER после приема сигнала и обработки.

  • Увеличьте масштабный коэффициент (scale) улучшить качество полученного изображения путем генерации большего количества битов передачи. Это также увеличивает число переданного PPDUs.

Поиск и устранение проблем SDR