主要内容

使用802.11波形和SDR的图像传输和接收

该示例示出了如何将图像文件进行编码和包装到用于传输的WLAN分组,并随后解码分组以检索图像。该示例还示出了如何使用软件定义的无线电(SDR)以用于WLAN分组的过空中传输和接收。

介绍

这个示例将一个图像文件导入并分割为多个介质访问控制(MAC)服务数据单元(MSDUs)。它将每个MSDU传递给wlanmacframe.功能,创建MAC协议数据单元(MPDU)。该函数还使用了wlanMACFrameConfig对象作为输入,它通过序列号财产。然后,该示例将MPDUs作为PHY层服务数据单元(PSDUs)传递到物理层(PHY)。每个PSDU数据使用单个非高吞吐量(非ht), 802.11a™WLAN数据包传输。此示例使用WLAN基带波形wlanWaveformGenerator功能。此功能利用多个PSDU,并对每个PSDU进行处理,以形成一系列准备传输的物理层聚合程序(PLCP)协议数据单元(PPDU)。

然后生成的波形通过加性高斯白噪声(AWGN)信道来模拟无线传输。随后,wlanmpdudecode.函数获取噪声波形并对其进行解码。然后,序列号属性允许示例按顺序排列提取的MSDUs。接收到的多个MSDUs中的信息位合并起来以恢复发送的图像。这个图表显示了接收器的处理过程。

或者,生成的WLAN波形可以通过空中传输,并使用这些支持的sdr接收。金宝app

模拟设备通信工具箱支持包金宝app®ADALM-Pluto广播

USRP的通信工具箱支持包金宝app®嵌入式系列无线电

Xilinx的通信工具箱支持包金宝app®Zynq.®的电台

示例设置

在运行示例之前,请设置渠道变量为以下选项之一:

  • 过度素质:使用SDR收发WLAN波形

  • GaussianNoise:将传输波形通过AWGN通道(默认)

  • 诺瓦斯:无损地通过传输波形

如果你设置渠道过度素质设置设备名称对于所需的特别提款权:

  • 着手冥王星使用adalm-pluto无线电(默认)

  • 着手E3xx使用USRP嵌入式系列无线电

  • 着手AD936X.FMCOMMS5使用Xilinx Zynq-Based Radio

频道=“GaussianNoise”如果频道= =“OverTheAir”设备名称=“冥王星”结尾

为示例配置所有范围和图形。

用于图像绘图的安装句柄如果~ (“imFig”,'var')||〜ishandle(imfig)% #好< SUSENS >imFig=图;imFig.NumberTitle=“关闭”;imFig。Name ='图像plot';imFig。可见=“关闭”别的clf (imFig);%清晰的图imFig。可见=“关闭”结尾%设置频谱查看器spectrumScope = dsp。简介(...“SpectrumType”,的功率密度,...“SpectralAverages”10...'ylimits'(-90 -30),...“标题”,“接收基带无线局域网信号频谱”,...“YLabel”,'功率谱密度',...“位置”,[69 376 800 450]);为WLAN符号设置星座图查看器refQAM = wlanReferenceSymbols (“64QAM”);constellation = comm.constellationdiagram(...“标题”,“平衡的WLAN符号”,...“ShowReferenceConstellation”,真的,...“ReferenceConstellation”refQAM,...“位置”[878 376 460 460]);

发射机设计

这些步骤描述了WLAN发射机的一般流程。

  1. 导入图像文件并将其转换为十进制字节流

  2. 使用WLAN工具箱生成基带WLAN信号

  3. 将数据流打包成多个802.11a包

如果使用SDR,这些步骤描述SDR发射器的设置。

  1. 使用SDR硬件准备用于传输的基带信号

  2. 将基带数据发送到SDR硬件,以便在所需的中心频率进行上采样和连续传输

准备图像文件

从图像文件中读取数据,对其进行缩放以进行传输,并将其转换为十进制字节流。图像的缩放通过减小二进制数据流的大小来降低质量。

二进制数据流的大小会影响传输图像数据所需的WLAN数据包数量。无线局域网的报文数量取决于这些因素。

  1. 导入图像文件时的图像缩放

  2. 数据包中所携带的数据的长度,由Msdulthength.变量

  3. 发送报文的调制和编码方案(MCS)值

比例因子和MSDU长度的组合决定了传输所需的WLAN无线数据包的数量。背景规模0.2Msdulthength.2304要求能传输11个WLAN无线报文。增加缩放因子或减小MSDU长度将导致传输更多的数据包。

%输入图像文件并转换为二进制流filetx =.“peppers.png”%图像文件名fData = imread (fileTx);%从文件中读取图像数据规模= 0.2;%图像缩放因子OrigSize =尺寸(FDATA);%原始输入图像大小scaledsize = max(楼层(比例)* origsize(1:2)),1);计算新的图像大小heightIx = min(圆(((1:scaledSize(1)) -0.5)。/规模+ 0.5),origSize (1));widthIx = min(圆(((1:scaledSize(2)) -0.5)。/规模+ 0.5),origSize (2));fData = fData (heightIx、widthIx:);%调整图像imsize =大小(fData);%存储新的图像大小txImage = fData (:);绘制发送图像imFig。可见='在';次要情节(211);imshow (fData);标题(“传播形象”);次要情节(212);标题(“收到的图像出现在这里……”);集(gca),“可见”,“关闭”);

图图像绘图包含轴对象。具有标题发送图像的轴对象包含类型图像的对象。

甘氨胆酸组(findall (,'类型',“文本”),“可见”,'在');

片段传输数据

分割数据流(最大值)放入尺寸较小的传输单元(MSDU)Msdulthength..然后,为每个传输单元创建一个MPDUwlanmacframe.函数。每次调用这个函数都会创建一个对应于给定MSDU和帧配置对象的MPDU。接下来,使用wlanMACFrameConfig,配置MPDU的序列号。然后,所有的mpdu依次传递到物理层进行传输。

要确保传输的MSDU大小不超过标准指定的最大值,请设置Msdulthength.字段2304字节。若要使所有MPDU的大小相同,请在最后一个MPDU中添加零。

msduLength=2304;MSDU的字节长度numMSDUs =装天花板(长度(txImage) / msduLength);padZeros = msduLength-mod(长度(txImage), msduLength);txData = [txImage; 0 (padZeros 1)];txDataBits = double(重塑(de2bi(txData, 8)',[],1));%将输入数据流划分为片段Bitsperoctet = 8;数据=零(0,1);为了我= 0:numMSDUs-1%提取每个MPDU的图像数据(八位元)frameBody = txData(我* msduLength + 1: msduLength * (i + 1):);%创建MAC帧配置对象并配置序号cfgMAC=wlanMACFrameConfig(“FrameType”,“数据”,“序列号”,我);%生成MPDU[psdu,lengthmpdu] = wlanmacframe(Framebody,CFGMAC,“OutputFormat”,“比特”);波形生成%Condateate PSDUdata =[数据;psdu];%#OK 结尾

产生802.11a基带WLAN信号

合成一个非ht波形使用wlanWaveformGenerator函数创建的非ht格式配置对象Wlannonhtconfig函数。本例中,配置对象的带宽为20mhz,有一个发送天线,64QAM速率为2/3 (MCS 6)。

nonHTcfg = wlanNonHTConfig;%创建数据包配置nonHTcfg。MCS = 6;%调制:64QAM速率:2/3nonHTcfg.NumTransmitAntennas=1;%发射天线数量chanBW = nonHTcfg.ChannelBandwidth;nonHTcfg。PSDULength = lengthMPDU;%设置PSDU长度

用每个包的随机整数初始化扰码器。

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

将过采样因子设置为1.5以30 MHz的频率生成波形以进行传输。

osf = 1.5;sampleRate = wlanSampleRate (nonHTcfg);%以Hz为单位的标称采样率%生成以空闲时间分隔的基带NonHT报文txWaveform = wlanWaveformGenerator(数据、nonHTcfg...“NumPackets”numMSDUs,“IdleTime”,20e-6,...'Sclamblerinitialization'scramblerInitialization,...“过度采样物料”(osf);

配置SDR用于传输

如果使用SDR,则设置变送器增益参数(txGain)降低传输质量并损害接收的波形。

创建一个sdrTransmitter使用sdrtx函数。将中心频率、采样率和增益设置为相应的属性sdrTransmitter目标。对于信道5上2.4 GHz频带内的802.11a信号,相应的中心频率为2.432 GHz,如IEEE标准802.11-2016第16.3.6.3节所定义。

这个sdrTransmitter对象使用传输重复功能从SDR上的双数据速率(DDR)存储器以环路方式传输基带WLAN波形。

如果频道= =“OverTheAir”txGain =-10%发射机性能sdrTransmitter = sdrtx(设备名称);sdrTransmitter。BasebandSampleRate = sampleRate * osf;sdrTransmitter。CenterFrequency = 2.432 e9;%通道5.sdrtransmitter.gain = txgain;fprintf('\ ngenerating wlan传输波形:\ n')%缩放标准化信号以避免RF阶段的饱和度功率标度系数=0.8;TX波形=TX波形。*(1/max(abs(TX波形))*功率标度系数);%发送RF波形transmitRepeat (sdrTransmitter txWaveform);结尾

这个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进行排序序列号属性中恢复的MAC帧配置对象

  12. 将所有发送的数据包解码后的MSDUs组合成接收到的图像

这个示例绘制接收波形的功率谱密度(PSD),并显示均衡化数据符号和接收图像的可视化。

接收方设置

如果使用SDR,请创建SDRReceiver.使用SDRRX.函数。将中心频率、采样率和输出数据类型设置为对应的属性SDRReceiver.对象。

否则,应用高斯噪声txwaveform.使用情况下函数或传递txwaveform.直接到接收器处理。

如果频道= =“OverTheAir”SDReceiver=sdrrx(deviceName);SDReceiver.BasebandSampleRate=sdrTransmitter.BasebandSampleRate;SDReceiver.CenterFrequency=SDRTransmiter.CenterFrequency;SDReceiver.OutputDataType='双倍的'%将捕获长度配置为捕获长度的两倍%传输信号,这是为了确保按顺序接收PSDU。%接收时,删除重复的MAC片段。sdrReceiver。SamplesPerFrame = 2 *长度(txWaveform);fprintf('\ nstarting一个新的rf捕获。\ n')rxwaveform = capture(sdreceiver,sdreceiver.samplesperframe,“样本”);elseif频道= =“GaussianNoise”信噪比= 20;% dBrxWaveform=awgn(txWaveform,SNR,“测量”);别的百分比没有损伤rxwaveform = txwaveform;结尾

显示接收波形的功率谱密度。

spectrumScope。SampleRate = SampleRate * osf;spectrumScope (rxWaveform);

图频谱分析仪包含一个轴对象和其他类型的对象uiflowcontainer, uimenu, uitoolbar。标题为“接收基带WLAN信号频谱”的轴对象包含一个类型为line的对象。这个对象表示通道1。

接收器处理

设计一个速率转换滤波器,将波形重新采样到标称基带速率,用于接收机处理设计多速率函数。

aStop = 40;%阻带衰减ofdmInfo=wlanNonHTOFDMInfo(“NonHT-Data”, nonHTcfg);%OFDM参数SCS=取样器/ofdmInfo.fft长度;%子载波间隔txbw = max (abs (ofdmInfo.ActiveFrequencyIndices)) * 2 * SCS;%占有带宽[L,M]=大鼠(1/osf);maxLM=最大值([L M]);R=(采样器txbw)/采样器;TW=2*R/maxLM;%过渡宽度B = DesignMultirateFIR(L,M,TW,ASTOP);

重新采样过采样的波形回20兆赫兹处理使用dsp。FIRRateConverter系统对象和上面设计的过滤器。

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

如果使用SDR,则SDR连续地将802.11波形在循环中传输。由此收到的第一个数据包SDRReceiver.可能不是第一个传输的包。这意味着数据包可能会被打乱顺序解码。为了使接收到的报文能够按照正确的顺序重新组合,必须确定它们的序列号。这个wlanmpdudecode.功能从每个包的解码PSDU位解码MPDU,输出MSDU和恢复的MAC帧配置对象wlanMACFrameConfig.这个序列号属性可用于在传输序列中对msdu进行排序。

要显示每个数据包解码的L-SIG内容,EVM测量和序列号,请检查displayflag.盒子。

displayFlag =错误的

设置接收器处理所需的变量。

rxWaveformLen=大小(rxWaveform,1);searchOffset=0;%采样中波形开始的偏移量

在PSDU中获取所需的字段索引。

IND = WLANFIELDINDICES(非HTCFG);ns = ind.lsig(2)-ind.lsig(1)+1;% OFDM符号中采样的个数%最小分组长度为10个OFDM符号lstfLen =双(ind.LSTF (2));% L-STF样本数minPktLen = lstfLen * 5;pktInd = 1;fineTimingOffset = [];packetSeq = [];rxBit = [];%执行EVM计算evmCalculator=comm.EVM(“AveragingDimensions”(1 2 3));evmCalculator。MaximumEVMOutputPort = true;

使用一个尽管循环处理收到的无序数据包。

尽管(SearchOffset + Minpktlen)<= rxwaveformlen%数据包检测pktOffset=wlanPacketDetect(rxWaveform,chanBW,searchOffset,0.5);%调整数据包偏移量pktOffset = searchOffset + pktOffset;如果isempty(pktoffset)||(pktoffset + double(ind.lsig(2))> rxwaveformlen)如果pktind == 1 disp('**没有检测到包**');结尾休息结尾%提取非HT字段并执行粗略频率偏移校正%以保证可靠的符号定时NONRT=RX波形(pKTOFSET+(ind.LSTF(1):ind.LSIG(2)),:;粗略频率偏移=WLANCOARSECFEFESTIMATE(NONRT,chanBW);NONRT=助手频率偏移(NONRT,采样器,-粗略频率偏移);%符号定时同步fineTimingOffset=wlanSymbolTimingEstimate(非HT,chanBW);%调整数据包偏移量pktOffset=pktOffset+fineTimingOffset;%定时同步完成:检测到数据包并同步%在同步后提取非HT前导字段,然后频率校正%如果(pktOffset<0) || ((pktOffset+minPktLen)>rxWaveformLen) searchOffset = pktOffset+1.5*lstfLen;继续结尾fprintf('\nPacket-%d检测到索引%d\n'、pktInd pktOffset + 1);%提取数据的前7个OFDM符号值,用于格式检测和% L-SIG解码nonHT = rxWaveform (pktOffset + (1:7 * Ns):);nonHT = helperFrequencyOffset (nonHT sampleRate -coarseFreqOffset);%对同步的和进行精细的频率偏移校正%粗校正前导码字段lltf = nonHT (ind.LLTF (1): ind.LLTF (2):);%提取L-LTFfineFreqOffset = wlanFineCFOEstimate (lltf chanBW);nonHT = helperFrequencyOffset (nonHT sampleRate -fineFreqOffset);cfoCorrection = coarseFreqOffset + fineFreqOffset;%总首席财务官使用L-LTF%信道估计lltf=nonHT(ind.lltf(1):ind.lltf(2),:);demolltf=wlanlltfdemomodate(lltf,chanBW);chanEstLLTF=wlanllfcchannelestimate(demolltf,chanBW);%噪声估计noiseVarNonHT = helperNoiseEstimate (demodLLTF);立即使用3个OFDM符号的包格式检测%跟随L-LTF格式= wlanFormatDetect (nonHT (ind.LLTF (2) + (1:3 * Ns):),...chanEstLLTF、noiseVarNonHT chanBW);disp ([' '格式“格式检测”]);如果~ strcmp(格式,“Non-HT”)流('已检测到非HT以外的格式\ n');searchOffset = pktOffset + 1.5 * lstfLen;继续结尾%恢复L-SIG字段位[recLSIGBits, failCheck] = wlanLSIGRecover (...nonHT (ind.LSIG (1): ind.LSIG (2):),...chanEstLLTF、noiseVarNonHT chanBW);如果故障检查fprintf(' L-SIG检查失败\n');searchOffset = pktOffset + 1.5 * lstfLen;继续别的fprintf('l-sig check pass \ n');结尾%基于解码的L-SIG检索数据包参数[lsigMCS、lsigLen、rxSamples]=帮助器解释信号(recLSIGBits、采样器);如果(rxSamples + pktOffset) > (rxWaveform) disp(长度“**没有足够的样本来解码数据包**”);休息结尾%对整个数据包应用CFO修正rxWaveform (pktOffset + (1: rxSamples):) = helperFrequencyOffset (...rxWaveform (pktOffset + (1: rxSamples):), sampleRate, -cfoCorrection);创建一个接收非ht配置对象rxNonHTcfg=wlanNonHTConfig;rxNonHTcfg.MCS=lsigMCS;rxNonHTcfg.PSDULength=lsiglent;%获取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,维生素。峰]= evmCalculator (refSym eqSym);%解码MPDU并提取MSDU[cfgMACRx msduList {pktInd},状态]= wlanMPDUDecode (rxPSDU rxNonHTcfg);%#OK <* SAGROW>如果比较字符串(状态,“成功”)disp(“MAC FCS检查通过”);%商店排序信息packetSeq (pktInd) = cfgMACRx.SequenceNumber;%将MSDU转换为二进制数据流rxBit {pktInd} =重塑(de2bi (hex2dec (cell2mat (msduList {pktInd})), 8)”,[],1);别的%解码失败如果比较字符串(状态,“FCSFailed”)% FCS失败disp (“MAC FCS检查失败”);别的%FCS通过,但遇到其他解码故障disp (“MAC FCS检查通过”);结尾由于在这个例子中没有重传模型,我们%从MPDU中提取图像数据(MSDU)和序列号,%即使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二进制数据流双(msduList rxBit {pktInd} = {pktInd});结尾%显示解码信息如果显示标志fprintf(“预计CFO: %5.1f Hz\n\n”,cfocorrection);% #好< * UNRCH >disp ('解码的L-SIG内容:');fprintf('MCS:%d\n', lsigMCS);fprintf(“长度:% d \ n”,格伦);fprintf('包中的样本数量:%d\n\n',rxsamples);fprintf(“维生素:\ n”);fprintf(RMS: %0.3f%%\n\n',...evm.Peak evm.RMS);fprintf('解码MAC序列控制字段内容:\ n');fprintf('序列号:%d\n\n',packetSeq(pktInd));结尾%更新搜索索引searchOffset=pktOffset+double(indNonHTData(2));%当检测到重复数据包时,完成处理恢复的数据包括来自重复帧的位从重复的帧中删除数据位如果长度(唯一(packetseq))休息结尾pktInd = pktInd + 1;结尾
在索引7处检测到的数据包1
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引8647检测到数据包-2
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引17287检测到报文-3
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引25927中检测到数据包4
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引34567处检测到Packet-5
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引43207处检测到报文-6
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引51847检测到数据包7
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引60487中检测到数据包8
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引69127处检测到数据包-9
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引77767处检测到数据包-10
检测到非HT格式
L-SIG检查通过
Mac FCS检查通过
在索引86407处检测到数据包11
检测到非HT格式
L-SIG检查通过

Mac FCS检查通过

如果使用SDR,请释放sdrTransmitterSDRReceiver.对象停止802.11波形的连续传输,允许对SDR对象属性进行任何修改。

如果频道= =“OverTheAir”释放(sdrTransmitter);释放(sdrReceiver);结尾释放(spectrumScope);

图频谱分析仪包含一个轴对象和其他类型的对象uiflowcontainer, uimenu, uitoolbar。标题为“接收基带WLAN信号频谱”的轴对象包含一个类型为line的对象。这个对象表示通道1。

重建图像

使用接收到的MAC帧重建图像。

如果~(is空(fineTimingOffset) || is空(pktOffset)) rxData = cell2mat(rxBit);startSeq =找到(packetSeq = = 0);rxData = circshift(rxData,[0 -(startSeq(1)-1)]);%订单MAC碎片%执行误码率(BER)计算bitErrorRate = comm.ErrorRate;呃= bitErrorRate(双(rxData (:)),...TxDatabits(1:长度(Rehape(rxdata,[],1))))));fprintf(' \nBit误码率(BER):\n');fprintf('误码率(BER) = %0.5f\n',犯错(1));fprintf('位错误=%d \ n'犯错(2));fprintf('传输比特数=%d\n\n',长度(txdatabits));试一试Decdata = Bi2De(Rehape(RxData(1:Length(TxImage)* Bitsperoctet),8,[]);从接收的数据重新创建映像fprintf('\ n从接收的数据构造图像'\n ');receivedImage = uint8(重塑(decdata imsize));%打印接收图像如果存在(“imFig”,'var') & & ishandle (imFig)如果TX图是打开的%图(imFig);次要情节(212);别的数字;次要情节(212);结尾imshow(收纳);标题(Sprintf(收到图片的));错误(“**没有足够的收到数据来重建图像。**”)结尾结尾
误码率(BER):
误码率(BER)=0.00000
比特错误数= 0
传输位数= 202752
从接收到的数据构造图像。

Figure Image Plot包含2个轴对象。标题为传输图像的轴对象1包含一个类型为图像的对象。标题为Received Image的轴对象2包含一个类型为Image的对象。

进一步的探索

  • 如果使用SDR,请修改txGain观察信号接收和处理后的EVM和BER的差异。您可能会在显示的接收图像中看到错误。

  • 如果在没有SDR的情况下运行示例,请修改SNR.观察信号接收和处理后的EVM和BER的差异。

  • 增加缩放因子(规模),以产生更多的发送位元,以改善接收图像的质量。这也增加了传输PPDUs的数量。

特别提款权故障排除

  • adalm-pluto收音机常见问题及修复(模拟设备通信工具箱支持包ADALM-Pluto金宝app无线电)

  • USRP嵌入式系列无线电常见问题及修复(USRP嵌入式系列无线电通信工具箱支持包)金宝app

  • 基于Xilinx Zynq的无线电常见问题及修复(Xilinx Zynq-Based Radio金宝app通信工具箱支持包)