Это, которое показывают примеры, как закодировать и упаковать файл изображения в пакеты 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
Установка и Setup (пакет поддержки Communications Toolbox для аналоговых устройств радио ADALM-Pluto)
Поддерживаемые аппаратные средства (пакет поддержки Communications Toolbox для аналоговых устройств радио ADALM-Pluto)
Пакет поддержки Communications Toolbox для радио USRP® Embedded Series
Установка и Setup (пакет поддержки Communications Toolbox для USRP встроенное серийное радио)
Аппаратная поддержка (пакет поддержки Communications Toolbox для USRP встроенное серийное радио)
Пакет поддержки Communications Toolbox для радио Xilinx® Zynq®-Based
Установка и Setup (пакет поддержки Communications Toolbox для Xilinx находящееся в Zynq радио)
Аппаратная поддержка (пакет поддержки Communications Toolbox для Xilinx находящееся в Zynq радио)
Прежде, чем запустить пример, набор 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.
Импортируйте файл изображения и преобразуйте его в поток десятичных байтов
Сгенерируйте основополосный сигнал WLAN использование WLAN Toolbox
Упакуйте поток данных в несколько 802.11a пакеты
При использовании SDR эти шаги описывают настройку передатчика SDR.
Подготовьте сгенерированный модулированный сигнал к передаче с помощью оборудования SDR
Отправьте основополосные данные в оборудование SDR для повышающей дискретизации и непрерывной передачи на желаемой центральной частоте
Подготовьте файл изображения
Считайте данные из файла изображения, масштабируйте его для передачи и преобразуйте его в поток десятичных байтов. Масштабирование изображения уменьшает качество путем уменьшения размера потока двоичных данных.
Размер потока двоичных данных влияет на количество пакетов WLAN, требуемых для передачи данных изображения. Количество пакетов WLAN, сгенерированных для передачи, зависит от этих факторов.
Масштабирование изображений, набор при импорте файла изображения
Длину данных несут в пакете, заданном msduLength
переменная
Схема модуляции и кодирования (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');
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.
При использовании оборудования SDR получите несколько пакетов переданного сигнала WLAN
Обнаружьте пакет
Крупное смещение несущей частоты оценивается и корректируется
Прекрасная временная синхронизация устанавливается. L-STF, L-LTF и выборки L-SIG обеспечиваются для прекрасной синхронизации, чтобы позволить настраивать пакетное обнаружение в запуске или конце L-STF
Прекрасное смещение несущей частоты оценивается и корректируется
Выполните оценку канала для полученного сигнала с помощью L-LTF
Обнаружьте формат пакета
Декодируйте поле L-SIG, чтобы восстановить значение MCS и длину фрагмента данных
Декодируйте поле данных, чтобы получить передаваемые данные в каждом пакете
Декодируйте полученный PSDU и проверку, если последовательность проверки системы координат (FCS) передала для PSDU
Закажите декодируемый MSDUs на основе SequenceNumber
свойство в восстановленном MAC структурирует объект настройки
Объедините декодируемый 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);
Обработка приемника
Спроектируйте фильтр преобразования уровня для передискретизации формы волны к номинальному основополосному уровню для обработки приемника с помощью 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);
Восстановите изображение
Восстановите изображение с помощью принятых кадров 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.
При использовании SDR измените txGain
наблюдать различие в EVM и BER после приема сигнала и обработки. Можно видеть ошибки в отображенном, полученном изображении.
При выполнении примера без SDR измените SNR
наблюдать различие в EVM и BER после приема сигнала и обработки.
Увеличьте масштабный коэффициент (scale
) улучшить качество полученного изображения путем генерации большего количества битов передачи. Это также увеличивает число переданного PPDUs.
Типичные проблемы радио ADALM-PLUTO и фиксируют (пакет поддержки Communications Toolbox для аналоговых устройств радио ADALM-Pluto)
USRP встроенные серийные типичные проблемы радио и фиксирует (пакет поддержки Communications Toolbox для USRP встроенное серийное радио)
Xilinx находящиеся в Zynq радио-типичные проблемы и фиксирует (пакет поддержки Communications Toolbox для Xilinx находящееся в Zynq радио)