Вы находитесь на странице: 1из 13

Министерство образования и науки Российской Федерации Федеральное государственное

бюджетное общеобразовательное учреждение высшего образования


«Чувашский государственный университет им. И.Н.Ульянова»
Факультет радиоэлектроники и автоматики
Кафедра Радиотехники и радиотехнических систем

Лабораторная работа
по дисциплине: «Программно-определяемое и когнитивное радио»

Adalm Pluto

Передача и прием изображений с использованием WLAN Toolbox PlutoSDR

Выполнили: магистранты
группы РМГ-01-19/1101
Васильева Л.
Игнатьев Д.
Милкин Ю.
Санаттулова И.
Федоров А.
Проверил: доцент
Чумаров С.Г.

Чебоксары 2020
Передача и прием изображений с использованием WLAN Toolbox и One PlutoSDR

В лабораторной работе показано, как передавать и принимать пакеты WLAN на одном устройстве
PlutoSDR с использованием пакета поддержки Communications Toolbox ™ для ADALM-PLUTO Radio и
WLAN Toolbox ™. Файл изображения кодируется и упаковывается в пакеты WLAN для передачи, а
затем декодируется при приеме.
Используемые инструменты, требуемое оборудование и программное обеспечение:

-Communications Toolbox ™
- Радиомодуль ADALM-PLUTO и соответствующее программное обеспечение Communications Toolbox
Support Package для ADALM-PLUTO Radio

Ход работы:
Можно использовать WLAN Toolbox для генерации кадров и сигналов MAC, соответствующих
стандарту. Эти сигналы основной полосы частот могут быть преобразованы с повышением частоты для
передачи RF с использованием оборудования SDR, такого как PlutoSDR. Функция передатчика
повторяющихся сигналов PlutoSDR позволяет передавать сигналы по воздуху и принимать их с
использованием того же оборудования SDR. Полученный сигнал захватывается и субдискретизируется
до основной полосы частот с помощью PlutoSDR и декодируется для восстановления переданной
информации, как показано на следующем рисунке.

Рисунок 1. Структурная схема Adalm Pluto


Этот пример импортирует и сегментирует файл изображения на несколько блоков данных службы
MAC (MSDU). Каждый MSDU передается в функцию wlanMACFrame для создания блока данных
протокола MAC (MPDU). Эта функция также использует объект wlanMACFrameConfig в качестве
входных данных, который можно использовать для последовательной нумерации MPDU
через SequenceNumberсвойство. MPDU передаются на уровень PHY как блоки данных службы
физического уровня (PSDU). Данные каждого PSDU упаковываются в один пакет WLAN NonHT,
802.11a ™ [ 1 ] с помощью WLAN Toolbox. В этом примере создается форма волны основной полосы
частот WLAN с помощью wlanWaveformGenerator.функция. Эта функция потребляет несколько блоков
PSDU и обрабатывает каждый для формирования серии блоков данных протокола PLCP
(PPDU). Несколько PPDU преобразуются с повышением частоты, и форма сигнала RF отправляется по
воздуху с использованием PlutoSDR, как показано на следующем рисунке.
Рисунок 2. Функциональная схема Adalm Pluto при передаче сигнала
Затем этот пример фиксирует передаваемую форму волны с использованием того же PlutoSDR. РЧ-
передача демодулируется в основной полосе частот, а принятые MPDU декодируются с
использованием функции wlanMPDUDecode . Извлеченные блоки MSDU упорядочиваются с
использованием SequenceNumberсвойства в объекте конфигурации восстановленного кадра
MAC. Информационные биты в нескольких принятых MSDU объединяются для восстановления
переданного изображения. Обработка приемника показана на следующей диаграмме.

Рисунок 3. Функциональная схема Adalm Pluto при приёме сигнала


Пример настройки
Перед тем, как запустить этот пример, выполняем следующие действия:
1. Настройте свой хост-компьютер для работы с пакетом поддержки для ADALM-PLUTO
Radio. См. Раздел « Начало работы» для получения помощи.
2. Убедитесь, что установлен WLAN Toolbox. Для запуска этого примера у вас должна быть
лицензия WLAN Toolbox.
Когда вы запускаете этот пример, первое, что делает сценарий, это проверяет наличие WLAN Toolbox.
% Убедитесь, что WLAN Toolbox установлен, и что существует действующая
% лицензия,
если пуста (ver ( 'wlan' )) % Проверьте наличие
ошибки установки WLAN Toolbox ( «Пожалуйста, установите WLAN Toolbox для запуска этого
примера.» );
elseif ~ license ( 'test' , 'WLAN_System_Toolbox' ) % Проверить наличие действующей лицензии
ошибка ( ...
'Для запуска этого примера требуется действующая лицензия для WLAN Toolbox.' );
конец
Затем сценарий настраивает все области и цифры, которые будут отображаться в примере.
%
Дескриптор установки для изображения, если ~ существует ( 'imFig' , 'var' ) || ~ ishandle (рис.)
imFig = рисунок;
imFig.NumberTitle = 'выкл' ;
imFig.Name = 'График изображения' ;
imFig.Visible = 'выкл' ;
еще
clf (imFig); % Очистить цифру
imFig.Visible = 'off' ;
конец

% Настройка средства просмотра


спектра SpectrumScope = dsp.SpectrumAnalyzer ( ...
'SpectrumType' , 'Power density' , ...
'SpectralAverages' , 10, ...
'YLimits' , [-130-50], ...
'Название ' , ' Спектр принятого сигнала WLAN в основной полосе частот ' , ...
' YLabel ' , ' Спектральная плотность мощности ' , ...
' Позиция ' , [69 376 800 450]);

% Настройте программу просмотра диаграмм созвездия для выравнивания символов WLAN


constellation = comm.ConstellationDiagram ( ...
'Заголовок' , 'Выровненные символы WLAN' , ...
'ShowReferenceConstellation' , false, ...
'Position' , [878 376 460 460 ]);
SDR передатчик объект Система используется с PlutoSDR для передачи данных базовой полосы к
аппаратному SDR.
% Инициализировать SDR-устройство
deviceNameSDR = 'Pluto' ; % Set SDR Device
radio = sdrdev (deviceNameSDR); % Создать объект устройства SDR
В следующих разделах объясняется конструкция и архитектура этого примера, а также то, что вы
можете ожидать увидеть при выполнении кода.
Конструкция передатчика
Общую структуру передатчика WLAN можно описать следующим образом:
1. Импортируйте файл изображения и преобразуйте его в поток десятичных байтов.
2. Сгенерируйте сигнал WLAN в основной полосе частот с помощью WLAN Toolbox, упакуйте
поток данных в несколько пакетов 802.11a.
3. Подготовьте сигнал основной полосы частот для передачи с помощью оборудования SDR.
4. Отправьте данные основной полосы частот на оборудование SDR для повышения частоты
дискретизации и непрерывной передачи на желаемой центральной частоте.
Параметр усиления передатчика используется для ухудшения качества принятой формы волны, вы
можете изменить этот параметр, чтобы снизить качество передачи и ухудшить сигнал. Это
рекомендуемые значения, в зависимости от конфигурации вашей антенны, возможно, вам придется
настроить эти значения. Предлагаемые значения:
1. Установите 0 для увеличения усиления (0 дБ)
2. Установите -10 для усиления по умолчанию (-10 дБ)
3. Установите значение -20 для уменьшения усиления (-20 дБ)
txGain = -10;
Подготовить файл изображения
В примере данные считываются из файла изображения, масштабируются для передачи и
преобразуются в поток десятичных байтов. Масштабирование изображения снижает качество
изображения за счет уменьшения размера потока двоичных данных.
Размер передаваемого изображения напрямую влияет на количество пакетов WLAN, необходимых для
передачи данных изображения. Коэффициент масштабирования используется для масштабирования
исходного размера изображения. Количество пакетов WLAN, которые генерируются для передачи,
зависит от следующего:
1. Масштаб изображения, установленный при импорте файла изображения.
2. Длина данных, переносимых в пакете. Это указывается msduLengthпеременной.
3. Значение MCS переданного пакета.
Сочетание коэффициента масштабирования scale0,2 и длины MSDU msduLength2304, как показано
ниже, требует передачи 11 пакетов радиосвязи WLAN. Увеличение коэффициента масштабирования
или уменьшение длины MSDU приведет к передаче большего количества пакетов.
% Введите файл изображения и преобразуйте его в двоичный поток
fileTx = 'peppers.png' ; % Имя файла изображения
fData = imread (fileTx); % Прочитать данные изображения из файла
scale = 0,2; % Коэффициент масштабирования изображения
origSize = size (fData); % Исходный размер входного изображения
scaledSize = max (floor (scale. * OrigSize (1: 2)), 1); % Рассчитать размер нового изображения
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, :); % Изменить размер изображения
imsize = size (fData); % Сохранить новый размер изображения
txImage = fData (:);
В примере отображается файл изображения, который необходимо передать. Когда файл изображения
успешно получен и декодирован, в примере отображается изображение.
% График передачи изображения
рисунок (рис.);
imFig.Visible = ' вкл ' ;
подсюжет (211);
imshow (fData);
title ( 'Переданное изображение' );
подсюжет (212);
title ( 'Полученное изображение появится здесь ...' );
set (gca, 'видимый' , 'выкл.' );
set (findall (gca, 'type' , 'text' ), 'visible' , 'on' );

пауза (1); % Пауза для печати изображения Tx


Данные передачи фрагмента
В примере используется поток данных, созданный из файла входного изображения txImage. Поток
данных разделяется на меньшие по размеру блоки передачи (MSDU) msduLength. MPDU создается для
каждого передающего блока с помощью функции wlanMACFrame . Каждый вызов этой функции
создает MPDU, соответствующий данному MSDU и объекту конфигурации кадра. Объект
конфигурации кадра может быть создан с помощью wlanMACFrameConfig, который можно
использовать для настройки порядкового номера MPDU. Затем все MPDU последовательно передаются
на физический уровень для передачи.
В этом примере msduLengthполе установлено в 2304 байта. Это необходимо для гарантии того, что
максимальный размер MSDU, указанный в стандарте [ 1 ], не будет превышен. К данным в последнем
MPDU добавляются нули, чтобы сделать все MPDU одинакового размера.
msduLength = 2304; % Длина MSDU в байтах
numMSDUs = ceil (длина (txImage) / msduLength);
padZeros = msduLength-mod (длина (txImage), msduLength);
txData = [txImage; нули (padZeros, 1)];
txDataBits = double (reshape (de2bi (txData, 8) ', [], 1));

% Разделить поток входных данных на фрагменты


bitsPerOctet = 8;
данные = нули (0, 1);

для ind = 0: numMSDUs-1

% Извлечь данные изображения (в октетах) для каждого MPDU


frameBody = txData (ind * msduLength + 1: msduLength * (ind + 1), :);

% Создать объект конфигурации кадра MAC и настроить порядковый номер


cfgMAC = wlanMACFrameConfig ( 'FrameType' , 'Data' , 'SequenceNumber' , ind);

% Создать MPDU
[mpdu, lengthMPDU] = wlanMACFrame (frameBody, cfgMAC);

% Преобразование байтов MPDU в битовый поток


psdu = reshape (de2bi (hex2dec (mpdu), 8) ', [], 1);

% Concatenate PSDU для


данных генерации сигналов = [data; psdu]; % # ОК <АГРОУ>

end
Генерация сигнала основной полосы частот WLAN IEEE 802.11a
Сигнал без HT синтезируется с помощью wlanWaveformGenerator с объектом конфигурации без
HT. Объект создается с помощью функции wlanNonHTConfig . Свойства объекта содержат
конфигурацию. В этом примере объект настроен для полосы пропускания 20 МГц, 1 передающей
антенны и скорости 64QAM 2/3 (MCS 6).
nonHTcfg = wlanNonHTConfig; % Создать конфигурацию пакета
nonHTcfg.MCS = 6; % Модуляция: 64QAM Скорость: 2/3
nonHTcfg.NumTransmitAntennas = 1; % Количество передающей антенны
chanBW = nonHTcfg.ChannelBandwidth;
nonHTcfg.PSDULength = lengthMPDU; % Установите длину PSDU

% SdrTransmitter использует | transferRepeat | функциональность для передачи


сигнала WLAN основной полосы частот в цикле из памяти DDR на PlutoSDR.
% Переданный радиочастотный сигнал подвергается избыточной дискретизации и передается на частоте 30
МГц. Сигнал
% 802.11a передается по каналу 5, который соответствует центральной
% частоте 2,432 ГГц, как определено в разделе 17.4.6.3 [1].

sdrTransmitter = sdrtx (имя_устройстваSDR); % Свойства передатчика


sdrTransmitter.RadioID = 'usb: 0' ;

% Передискретизация формы волны передачи на 30 МГц


fs = wlanSampleRate (nonHTcfg); % Частота дискретизации передачи в МГц
osf = 1,5; % Коэффициент передискретизации

sdrTransmitter.BasebandSampleRate = fs * osf;
sdrTransmitter.CenterFrequency = 2.432e9; % Канал 5
sdrTransmitter.ShowAdvancedProperties = true;
sdrTransmitter.Gain = txGain;

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


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

% Генерировать пакеты основной полосы частот NonHT, разделенные временем простоя


txWaveform = wlanWaveformGenerator (данные, nonHTcfg, ...
'NumPackets' , numMSDUs, 'IdleTime' , 20e-6, ...
'ScramblerInitialization' , scramblerInitialization);

% Передискретизация формы волны передачи


txWaveform = resample (txWaveform, fs * osf, fs);

fprintf ( '\ nГенерация формы волны передачи WLAN: \ n' )

% Масштабируйте нормализованный сигнал, чтобы избежать насыщения ВЧ-каскадов


powerScaleFactor = 0,8;
txWaveform = txWaveform. * (1 / max (abs (txWaveform)) * powerScaleFactor);

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


sdrTransmitter.transmitRepeat (txWaveform);
Повторная передача с использованием оборудования SDR
transmitRepeatФункция передает модулирующий WLAN пакеты с простоем к PlutoSDR, и сохраняет
выборки сигнала в аппаратной памяти. Затем пример передает форму волны непрерывно по воздуху,
пока не будет вызван метод выпуска передающего объекта. В командном окне отображаются
сообщения, подтверждающие успешное начало передачи.

Приемника структура
Общую структуру приемника WLAN можно описать следующим образом:
1. Захват нескольких пакетов переданного сигнала WLAN с помощью оборудования SDR.
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. Упорядочить декодированные MSDU на основе SequenceNumberсвойства в объекте
конфигурации восстановленного кадра MAC.
12. Объедините декодированные MSDU из всех переданных пакетов, чтобы сформировать
полученное изображение
В этом примере строится график спектральной плотности мощности (PSD) захваченной формы волны
и показаны визуализации выровненных символов данных и полученного изображения.
Настройка приемника
SdrReceiver управляется с помощью свойств, определенных в sdrReceiverобъекте. Частота
дискретизации приемника составляет 30 МГц, что в 1,5 раза превышает частоту дискретизации
основной полосы частот 20 МГц.
SDR приемник объект система используется с PlutoSDR получить модулирующие данные от
оборудования SDR.
sdrReceiver = sdrrx (имя_устройстваSDR);
sdrReceiver.RadioID = 'usb: 0' ;
sdrReceiver.BasebandSampleRate = sdrTransmitter.BasebandSampleRate;
sdrReceiver.CenterFrequency = sdrTransmitter.CenterFrequency;
sdrReceiver.GainSource = 'Руководство' ;
sdrReceiver.Gain = 10;
sdrReceiver.OutputDataType = 'двойной' ;

% Настройте длину захвата, эквивалентную удвоенной длине


% переданного сигнала, это необходимо для того, чтобы блоки PSDU принимались по порядку.
% При приеме повторяющиеся фрагменты MAC удаляются.
captureLength = 2 * длина (txWaveform);
SpectreScope.SampleRate = sdrReceiver.BasebandSampleRate;

% Получить индексы требуемых полей в PSDU


indLSTF = wlanFieldIndices (nonHTcfg, 'L-STF' );
indLLTF = wlanFieldIndices (nonHTcfg, 'L-LTF' );
indLSIG = wlanFieldIndices (nonHTcfg, 'L-SIG' );
Ns = indLSIG (2) -indLSIG (1) +1; % Количество отсчетов в символе OFDM
Захват получаемых пакетов
Переданный сигнал фиксируется с помощью PlutoSDR.
fprintf ( '\ nНачало нового захвата RF. \ n' )

burstCapture = захват (sdrReceiver, captureLength, «Образцы» );


Обработка получателя
В примере используется цикл while для захвата и декодирования пакетов. Сигнал WLAN непрерывно
передается по воздуху в цикле, первый пакет, захваченный sdrReceiver, не обязательно будет первым
переданным пакетом. Это означает, что пакеты могут быть декодированы вне очереди. Чтобы
полученные пакеты можно было повторно объединить в правильном порядке, необходимо определить
их порядковые номера. Декодированные биты PSDU для каждого пакета передаются
в функцию wlanMPDUDecode . Эта функция декодирует MPDU и выводит MSDU, а также
восстановленный объект конфигурации кадра MAC wlanMACFrameConfig . ВSequenceNumberСвойство
в восстановленном объекте конфигурации кадра MAC может использоваться для упорядочивания
блоков MSDU в передаваемой последовательности. Цикл while завершает обработку приема, когда
обнаруживается повторяющийся кадр, который окончательно удаляется во время обработки
приемника. В случае отсутствия кадра качество изображения ухудшается.
Когда пакет WLAN успешно декодирован, обнаруженный порядковый номер отображается в
командном окне для каждого принятого пакета. Совокупность выровненных символов данных
отображается для каждого принятого пакета.
% Показать спектральную плотность мощности полученного сигнала
Spectrum (burstCaptures);

% Уменьшить разрешение полученного сигнала


rxWaveform = resample (burstCapture, fs, fs * osf);
rxWaveformLen = размер (rxWaveform, 1);
searchOffset = 0; % Смещение от начала формы волны в выборках

% Минимальная длина пакета составляет 10 символов OFDM


lstfLen = double (indLSTF (2)); % Количество образцов в L-STF
minPktLen = lstfLen * 5;
pktInd = 1;
sr = wlanSampleRate (nonHTcfg); % Частота выборки
fineTimingOffset = [];
packetSeq = [];
displayFlag = 0; % Флаг для отображения декодированной информации

% Выполнить расчет EVM


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

% Обработка получателя
при (searchOffset + minPktLen) <= rxWaveformLen % Обнаружение
пакетов
pktOffset = wlanPacketDetect (rxWaveform, chanBW, searchOffset, 0.8);

% Настроить смещение пакета


pktOffset = searchOffset + pktOffset;
если пусто (pktOffset) || (pktOffset + double (indLSIG (2))> rxWaveformLen),
если pktInd == 1
disp ( '** Пакет не обнаружен **' );
конец
перерыва ;
конец

% Извлечь поля без HT и выполнить грубую коррекцию смещения частоты


%, чтобы обеспечить надежную синхронизацию символа
nonHT = rxWaveform (pktOffset + (indLSTF (1): indLSIG (2)), :);
coarseFreqOffset = wlanCoarseCFOEstimate (nonHT, chanBW);
nonHT = helperFrequencyOffset (nonHT, fs, -coarseFreqOffset);

% Синхронизация времени символа


fineTimingOffset = wlanSymbolTimingEstimate (nonHT, chanBW);

% Настроить смещение пакета


pktOffset = pktOffset + fineTimingOffset;

% Синхронизация по времени завершена: пакет обнаружен и синхронизирован


% Извлеките поле преамбулы без HT после синхронизации и
% выполните частотную коррекцию
if (pktOffset <0) || ((pktOffset + minPktLen)> rxWaveformLen)
searchOffset = pktOffset + 1.5 * lstfLen;
продолжить ;
end
fprintf ( '\ nPacket-% d обнаружен в индексе% d \ n' , pktInd, pktOffset + 1);

% Извлечь первые 7 символов OFDM данных для определения формата и


декодирования% L-SIG
nonHT = rxWaveform (pktOffset + (1: 7 * Ns), :);
nonHT = helperFrequencyOffset (nonHT, fs, -coarseFreqOffset);

% Выполните точную коррекцию сдвига частоты для синхронизированных и


% грубо скорректированных полей преамбулы
lltf = nonHT (indLLTF (1): indLLTF (2), :); % Экстракт L-LTF
fineFreqOffset = wlanFineCFOEstimate (lltf, chanBW);
nonHT = helperFrequencyOffset (nonHT, fs, -fineFreqOffset);
cfoCorrection = coarseFreqOffset + fineFreqOffset; % Общий финансовый директор

% Оценка канала с использованием L-LTF


lltf = nonHT (indLLTF (1): indLLTF (2), :);
demodLLTF = wlanLLTFDemodulate (lltf, chanBW);
chanEstLLTF = wlanLLTFChannelEstimate (demodLLTF, chanBW);

% Оценка шума
noiseVarNonHT = helperNoiseEstimate (demodLLTF);

% Обнаружение формата пакета с использованием 3 символов OFDM сразу


% после
формата L-LTF = wlanFormatDetect (nonHT (indLLTF (2) + (1: 3 * Ns), :), ...
chanEstLLTF, noiseVarNonHT, chanBW);
disp ([ '' формат 'обнаружен формат' ]);
если ~ strcmp (формат, 'Non-HT' )
fprintf ( 'Обнаружен формат, отличный от Non-HT \ n' );
searchOffset = pktOffset + 1.5 * lstfLen;
продолжить ;
конец

% Восстановить биты поля L-SIG


[recLSIGBits, failCheck] = wlanLSIGRecover ( ...
nonHT (indLSIG (1): indLSIG (2), :), ...
chanEstLLTF, noiseVarNonHT, chanBW);

если неуспешно
fprintf ( 'Ошибка проверки L-SIG \ n' );
searchOffset = pktOffset + 1.5 * lstfLen;
продолжить ;
else
fprintf ( 'L-SIG check pass \ n' );
конец

% Получить параметры пакета на основе декодированного L-SIG


[lsigMCS, lsigLen, rxSamples] = helperInterpretLSIG (recLSIGBits, sr);

если (rxSamples + pktOffset)> длина (rxWaveform)


disp ( '** Недостаточно образцов для декодирования пакета **' );
перерыв ;
конец

% Применить коррекцию CFO ко всему пакету


rxWaveform (pktOffset + (1: rxSamples), :) = helperFrequencyOffset ( ...
rxWaveform (pktOffset + (1: rxSamples), :), fs, -cfoCorrection);

% Создать объект конфигурации получения без HT


rxNonHTcfg = wlanNonHTConfig;
rxNonHTcfg.MCS = lsigMCS;
rxNonHTcfg.PSDULength = lsigLen;

% Получить индексы полей данных в PPDU


indNonHTData = wlanFieldIndices (rxNonHTcfg, 'NonHT-Data' );

% Восстановить биты PSDU с использованием параметров переданного пакета и


оценок% канала из L-LTF
[rxPSDU, eqSym] = wlanNonHTDataRecover (rxWaveform (pktOffset + ...
(indNonHTData (1): indNonHTData (2)), :), ...
chanEstLLTF, noiseVarNonHT, rxNonHTcfg);
созвездие (изменить форму (eqSym, [], 1)); % Текущая
пауза в созвездии (0); % Разрешить созвездию перекрашивать
релиз (созвездие); % Отменить предыдущий график созвездия

refSym = wlanClosestReferenceSymbol (eqSym, rxNonHTcfg);


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

% Декодируйте MPDU и извлекайте MSDU


[cfgMACRx, msduList {pktInd}, status] = wlanMPDUDecode (rxPSDU, rxNonHTcfg); % # ОК <*
ПРОСЕЛЕНИЕ>

если strcmp (статус, 'Успех' )


disp ( 'Пройдена проверка MAC FCS' );

% Сохранить информацию о последовательности


packetSeq (pktInd) = cfgMACRx.SequenceNumber;

% Преобразование MSDU в поток двоичных данных


rxBit {pktInd} = изменить форму (de2bi (hex2dec (cell2mat (msduList {pktInd})), 8) ', [], 1);

else % Декодирование
завершилось неудачно, если strcmp (status, 'FCSFailed' )
% FCS failed
disp ( 'Ошибка проверки MAC FCS' );
иначе
% FCS пройден, но обнаружены другие ошибки декодирования
disp ( 'MAC FCS check pass' );
конец

% Поскольку в этом примере не моделируется повторная передача, мы будем


% извлекать данные изображения (MSDU) и порядковый номер из MPDU,
% даже если проверка FCS не удалась.

% Удалить заголовок и FCS. Извлеките MSDU.


macHeaderBitsLength = 24 * bitsPerOctet;
fcsBitsLength = 4 * bitsPerOctet;
msduList {pktInd} = rxPSDU (macHeaderBitsLength + 1: end-fcsBitsLength);

% Извлечь и сохранить порядковый номер


sequenceNumStartIndex = 23 * bitsPerOctet + 1;
sequenceNumEndIndex = 25 * bitsPerOctet - 4;
packetSeq (pktInd) = bi2de (rxPSDU (sequenceNumStartIndex: sequenceNumEndIndex) ');

% MSDU поток двоичных данных


rxBit {pktInd} = двойной (msduList {pktInd});
конец

% Отображение декодированной информации,


если displayFlag
fprintf ( 'Расчетный финансовый директор:% 5.1f Hz \ n \ n' , cfoCorrection); % # ОК <UNRCH>

disp ( 'Расшифрованное содержимое L-SIG:' );


fprintf ( 'MCS:% d \ n' , lsigMCS);
fprintf ( 'Длина:% d \ n' , lsigLen);
fprintf ( 'Количество образцов в пакете:% d \ n \ n' , rxSamples);

fprintf ( 'EVM: \ n' );


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

fprintf ( 'Содержимое поля управления декодированной последовательностью MAC: \ n' );


fprintf ( 'Порядковый номер:% d \ n' , packetSeq (pktInd));
конец
% Обновить поисковый индекс
searchOffset = pktOffset + double (indNonHTData (2));

pktInd = pktInd + 1;
% Завершить обработку при обнаружении повторяющегося пакета.
% Извлекают данные включают в себя биты из дублированного кадра ,
если длина (уникальный (packetSeq)) <длина (packetSeq)
Перерыв
конец
конец

% Освободить состояние объектов sdrTransmitter и sdrReceiver


релиз (sdrTransmitter);
выпуск (sdrReceiver);
Восстановить изображение
Изображение восстанавливается из полученных кадров MAC.
если ~ (isempty (fineTimingOffset) || isempty (pktOffset)) && ...
(numMSDUs == (numel (packetSeq) -1))
% Удалить дубликат захваченного фрагмента MAC
rxBitMatrix = cell2mat (rxBit);
rxData = rxBitMatrix (1: конец, 1: число (packetSeq) -1);

startSeq = найти (packetSeq == 0);


rxData = circshift (rxData, [0 - (startSeq (1) -1)]); % Заказать фрагменты MAC

% Выполните расчет коэффициента ошибок по битам (BER)


bitErrorRate = comm.ErrorRate;
err = bitErrorRate (double (rxData (:)), ...
txDataBits (1: длина (изменить форму (rxData, [], 1))));
fprintf ( '\ nЧастота битовых ошибок (BER): \ n' );
fprintf ( 'Частота ошибок по битам (BER) =% 0.5f. \ n' , err (1));
fprintf ( 'Количество битовых ошибок =% d. \ n' , err (2));
fprintf ( 'Количество переданных битов =% d. \ n \ n' , длина (txDataBits));

% Восстановить изображение из полученных данных


fprintf ( '\ nСоздание изображения из полученных данных. \ N' );

decdata = bi2de (reshape (rxData (1: length (txImage) * bitsPerOctet), 8, []) ');

полученное изображение = uint8 (изменить форму (decdata, imsize));


%
Построить полученное изображение, если оно существует ( 'imFig' , 'var' ) && ishandle (imFig) % Если
число Tx открыто
рисунок (рис.); подсюжет (212);
еще
фигура; подсюжет (212);
конец
imshow (полученное изображение);
title (sprintf ( 'Полученное изображение' ));
конец

Рекомендации по ознакомлению
Вы можете изменить txGainусиление sdrTransmitter, чтобы увидеть разницу в EVM и BER после приема
и обработки сигнала. Вы также должны увидеть любые ошибки в отображаемом полученном
изображении. Попробуйте изменить коэффициент масштабирования scaleна 0,5. Это должно улучшить
качество полученного изображения за счет генерации большего количества передаваемых битов. Это
также должно увеличить количество передаваемых PPDU.
Поиск проблемы
Общие советы по устранению неполадок оборудования SDR и пакета поддержки Communications
Toolbox для ADALM-PLUTO Radio можно найти в разделе Общие проблемы и исправления .

Список литературы
1. IEEE Std 802.11 ™ -2012 Стандарт IEEE для информационных технологий - Телекоммуникации
и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть
11: Спецификации управления доступом к среде (MAC) и физического уровня (PHY) беспроводной
локальной сети.