使用802.11波形和SDR的图像传输和接收
本示例演示如何将图像文件编码并打包到无线局域网数据包中进行传输,然后解码数据包以检索图像。该示例还展示了如何使用软件定义无线电(SDR)进行无线传输和无线局域网数据包的接收。
简介
本例将一个镜像文件导入并分割成多个MAC服务数据单元(msdu)。它将每个MSDU传递给wlanMACFrame
函数来创建MAC协议数据单元(MPDU)。这个函数还利用了awlanMACFrameConfig
对象作为输入,它通过SequenceNumber
财产。然后,该示例将mpdu作为PHY层服务数据单元(psdu)传递给物理层。每个PSDU数据使用单个非高吞吐量(nonHT) 802.11a™WLAN数据包进行传输。创建WLAN基带波形wlanWaveformGenerator
函数。该功能利用多个psdu,并对每个psdu进行处理,形成一系列物理层收敛过程(PLCP)协议数据单元(ppdu),准备传输。
生成的波形然后通过加性高斯白噪声(AWGN)通道来模拟空中传输。随后,wlanMPDUDecode
函数获取噪声波形并将其解码。然后,SequenceNumber
恢复的MAC帧配置对象中的属性允许示例按顺序对提取的msdu进行排序。多个接收到的msdu中的信息位结合起来恢复传输的图像。这个图显示了接收器的处理过程。
或者,生成的WLAN波形可以通过空气传输,并使用这些支持的sdr接收。金宝app
模拟设备通信工具箱支持包金宝app®ADALM-Pluto广播
安装和设置(模拟设备ADALM-Pluto无线电通信工具箱金宝app支持包)
金宝app支持的硬件(模拟设备ADALM-Pluto无线电通信工具箱金宝app支持包)
USRP的通信工具箱支持包金宝app®嵌入式系列无线电
Xilinx的通信工具箱支持包金宝app®Zynq®的电台
示例设置
在运行示例之前,请设置通道
变量为以下选项之一:
OverTheAir
:使用SDR收发WLAN波形GaussianNoise
:传输波形通过AWGN通道传递(默认)NoImpairments
:传输波形无损伤通过
如果你设置通道
来OverTheAir
,设置设备名称
兑换为所需的特别提款权:
设置为
冥王星
使用ADALM-Pluto Radio(默认)设置为
E3xx
使用USRP嵌入式系列无线电设置为
AD936x
或FMCOMMS5
使用Xilinx zynq无线电
频道=“GaussianNoise”;如果频道= =“OverTheAir”设备名称=“冥王星”;结束
配置示例的所有作用域和图。
%图像绘图的设置句柄如果~ (“imFig”,“var”|| ~把手(imFig)% #好< SUSENS >imFig =数字;imFig。NumberTitle =“关闭”;imFig。Name =“形象策划”;imFig。可见=“关闭”;其他的clf (imFig);%清晰数字imFig。可见=“关闭”;结束%设置频谱查看器spectrumScope = dsp。简介(...“SpectrumType”,的功率密度,...“SpectralAverages”10...“YLimits”(-90 -30),...“标题”,'接收基带无线局域网信号频谱',...“YLabel”,“功率谱密度”,...“位置”,[69 376 800 450]);为均衡WLAN符号设置星座图查看器refQAM = wlanreferencesymbs (64 qam);星座图(...“标题”,“均衡WLAN符号”,...“ShowReferenceConstellation”,真的,...“ReferenceConstellation”refQAM,...“位置”,[878 376 460 460]);
发射机的设计
介绍WLAN发射机的一般流程。
导入图像文件并将其转换为十进制字节流
使用WLAN工具箱生成基带WLAN信号
将数据流打包成多个802.11a报文
如果使用SDR,这些步骤描述了SDR发送器的设置。
使用SDR硬件准备传输的基带信号
将基带数据发送到SDR硬件进行上采样并以所需的中心频率连续传输
准备镜像文件
从图像文件读取数据,将其缩放以进行传输,并将其转换为十进制字节流。图像的缩放通过减小二进制数据流的大小来降低质量。
二进制数据流的大小影响传输图像数据所需的WLAN包的数量。产生的无线局域网数据包的数量取决于这些因素。
图像缩放,在导入图像文件时设置
数据包中所携带的数据的长度,由
msduLength
变量传输数据包的调制和编码方案(MCS)值
缩放因子和MSDU长度的组合决定了传输所需的无线数据包的数量。设置规模
来0.2
而且msduLength
来2304
需要传输11个无线分组。增大缩放因子或减小MSDU长度会导致报文传输量增加。
输入图像文件并转换为二进制流fileTx =“peppers.png”;%镜像文件名fData = imread(fileTx);从文件中读取映像数据量表= 0.2;%图像缩放因子origSize = size(fData);%原始输入图像大小scaledSize = max(floor(scale.*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(height,widthIx,:);调整图像大小imsize = size(fData);存储新的图像大小txImage = fData(:);%绘图传输图像imFig。可见=“上”;次要情节(211);imshow (fData);标题(“传播形象”);次要情节(212);标题(“接收到的图像出现在这里……”);集(gca),“可见”,“关闭”);
甘氨胆酸组(findall (,“类型”,“文本”),“可见”,“上”);
分片传输数据
拆分数据流(txImage
)转换成更小的传送单元msduLength
.然后,为每个传输单元创建一个MPDUwlanMACFrame
函数。每次调用这个函数都会创建一个与给定MSDU和帧配置对象相对应的MPDU。接下来,使用创建框架配置对象wlanMACFrameConfig
命令,配置MPDU序列号。然后依次将所有mpdu传递到物理层进行传输。
为了保证传输的MSDU尺寸不超过标准设置的最大值,可以设置msduLength
字段2304
字节。为了使所有MPDU的大小相同,在最后一个MPDU的数据中附加0。
msduLength = 2304;% MSDU长度,以字节为单位numMSDUs = ceil(length(txImage)/msduLength);padZeros = msduLength-mod(长度(txImage),msduLength);txData = [txImage;zero (padZeros,1)];txDataBits = double(重塑(de2bi(txData, 8)',[],1)));将输入数据流划分为片段bitsPerOctet = 8;数据= 0 (0,1);为我= 0:numMSDUs-1为每个MPDU提取图像数据(以字节为单位)frameBody = txData(i*msduLength+1:msduLength*(i+1),:);创建MAC帧配置对象并配置序列号cfgMAC = wlanMACFrameConfig(“FrameType”,“数据”,“SequenceNumber”,我);生成MPDU[psdu, lengthMPDU]= wlanMACFrame(frameBody,cfgMAC,“OutputFormat”,“位”);连接psdu用于波形生成数据=[数据;psdu];% #好< AGROW >结束
生成802.11a基带无线局域网信号
合成一个非ht波形使用wlanWaveformGenerator
函数创建的非ht格式配置对象wlanNonHTConfig
函数。在本例中,配置对象的带宽为20mhz,一个发射天线,64QAM速率为2/3 (MCS 6)。
nonHTcfg = wlanNonHTConfig;创建包配置nonHTcfg。MCS = 6;调制:64QAM速率:2/3nonHTcfg。numtransmitantenna = 1;%发射天线个数chanBW = nonHTcfg.ChannelBandwidth;nonHTcfg。mpdu长度=长度;设置PSDU长度
用每个包的随机整数初始化扰频器。
初始化= randi([1 127],numMSDUs,1);
设置过采样因子为1.5
以产生30兆赫的波形进行传输。
Osf = 1.5;sampleRate = wlanSampleRate(nonHTcfg);%以Hz为单位的标称采样率生成按空闲时间分隔的基带NonHT报文tx波形= wlanWaveformGenerator(data,nonHTcfg,...“NumPackets”numMSDUs,“IdleTime”, 20 e-6,...“ScramblerInitialization”scramblerInitialization,...“OversamplingFactor”(osf);
配置SDR传输
如果使用SDR,请设置发射器增益参数(txGain
)以降低传输质量并损害接收到的波形。
创建一个sdrTransmitter
对象使用sdrtx
函数。设置中心频率,采样率,增益到相应的属性sdrTransmitter
对象。对于2.4 GHz频段的通道5上的802.11a信号,其中心频率为IEEE标准802.11-2016第16.3.6.3节中定义的2.432 GHz。
的sdrTransmitter
对象使用传输重复功能从SDR上的双数据速率(DDR)存储器在环路中传输基带WLAN波形。
如果频道= =“OverTheAir”txGain =-10;发射机属性sdrTransmitter = sdrtx(deviceName);sdrTransmitter。BasebandSampleRate = sampleRate*osf;sdrTransmitter。CenterFrequency = 2.432e9;%渠道5sdrTransmitter。增益= tx增益;流(\n生成WLAN传输波形:\n')缩放归一化信号以避免RF级饱和powerScaleFactor = 0.8;tx波形= tx波形.*(1/max(abs(tx波形))*powerScaleFactor);发射射频波形transmitRepeat (sdrTransmitter txWaveform);结束
的transmitRepeat
功能将空闲时间的基带WLAN报文传输到SDR,并将信号样本存储在硬件存储器中。然后,该示例在空中连续传输波形,直到传输对象释放为止。
接收机的设计
下面介绍WLAN接收机的总体结构。
如果使用SDR硬件,则捕获传输的WLAN信号的多个数据包
检测数据包
对粗载波频偏进行了估计和校正
建立了良好的定时同步。提供了L-STF、L-LTF和L-SIG样本,以便在L-STF的开始或结束时调整包检测
估计并校正了较细的载波频偏
使用L-LTF对接收到的信号进行信道估计
检测报文的格式
解码L-SIG字段以恢复MCS值和数据部分的长度
解码数据字段以获得每个包中的传输数据
解码收到的PSDU,检查帧检查序列(FCS)是否通过PSDU
顺序解码的msdu基于
SequenceNumber
属性恢复的MAC帧配置对象将所有传输数据包的解码后的msdu组合成接收到的图像
本例绘制了接收波形的功率谱密度(PSD),并显示了均衡数据符号和接收图像的可视化。
接收方设置
如果使用SDR,请创建一个sdrReceiver
对象使用sdrrx
函数。的相应属性设置中心频率、采样率和输出数据类型sdrReceiver
对象。
否则,应用高斯噪声txWaveform
使用情况下
函数或传递txWaveform
直接进入接收器处理。
如果频道= =“OverTheAir”sdrReceiver = sdrrx(deviceName);sdrReceiver。BasebandSampleRate = sdrTransmitter.BasebandSampleRate;sdrReceiver。CenterFrequency = sdrTransmitter.CenterFrequency;sdrReceiver。OutputDataType =“双”;捕获长度配置为捕获长度的两倍%的传输信号,这是为了保证psdu被有序接收。在接收时删除重复的MAC片段。sdrReceiver。SamplesPerFrame = 2*length(tx波形);流(\n开始一个新的射频捕获。\n) rx波形=捕获(srdrreceiver, srdrreceiver .)SamplesPerFrame,“样本”);elseif频道= =“GaussianNoise”信噪比= 20;% dBrx波形= awgn(tx波形,信噪比,“测量”);其他的%无损伤rx波形= tx波形;结束
显示接收波形的功率谱密度。
spectrumScope。SampleRate *osf;spectrumScope (rxWaveform);
接收处理
设计一个速率转换滤波器,将波形重新采样到标称基带速率,用于接收机处理designMultirateFIR
函数。
stop = 40;阻带衰减%ofdmInfo = wlanonhttofdminfo (“NonHT-Data”, nonHTcfg);OFDM参数SCS = sampleRate/ofdmInfo.FFTLength;子载波间距%txbw = max(abs(ofdmInfo.ActiveFrequencyIndices))*2*SCS;已占用带宽百分比[L,M] =鼠(1/osf);maxLM = max([L M]);R = (sampleRate-txbw)/sampleRate;TW = 2*R/maxLM;%过渡宽度b = designMultirateFIR(L,M,TW, stopp);
将过采样波形重新采样到20mhz,以便使用dsp。FIRRateConverter
系统对象和上面设计的滤波器。
firrc = dsp.FIRRateConverter(L,M,b);rx波形= firrc(rx波形);
如果使用SDR,则SDR在空中循环中连续传输802.11波形。接收到的第一个包sdrReceiver
可能不是第一个发送的数据包。这意味着数据包可能会按顺序解码。为了使接收到的数据包能够按照正确的顺序重新组合,必须确定它们的序列号。的wlanMPDUDecode
函数将每个包的PSDU位解码为MPDU,并输出MSDU和恢复的MAC帧配置对象wlanMACFrameConfig
.的SequenceNumber
可以使用恢复的MAC帧配置对象中的属性对msdu进行传输顺序排序。
要显示每个包的解码L-SIG内容、EVM测量值和序列号,请检查displayFlag
盒子。
displayFlag =假;
设置接收器处理所需的变量。
rxWaveformLen = size(rx波形,1);searchOffset = 0;%样本中波形开始的偏移量
在PSDU中获取所需的字段索引。
ind = wlanFieldIndices(nonHTcfg);Ns = ind.LSIG(2)-ind.LSIG(1)+1;OFDM符号中的采样数最小包长度为10个OFDM符号lstfLen = double(ind.LSTF(2));% L-STF中的样本数minPktLen = lstfLen*5;pktInd = 1;fineTimingOffset = [];packetSeq = [];rxBit = [];%执行EVM计算evmCalculator = com . evm (“AveragingDimensions”,[1 2 3]);evmCalculator。MaximumEVMOutputPort = true;
使用一个而
循环处理收到的乱序包。
而(searchOffset + minPktLen) < = rxWaveformLen包检测pktOffset = wlanPacketDetect(rx波形,chanBW,searchOffset,0.5);调整数据包偏移量pktOffset = searchOffset+pktOffset;如果isempty(pktOffset) || (pktOffset+double(ind.LSIG(2))>rxWaveformLen)如果pktInd = = 1 disp ('**未检测到数据包**');结束打破;结束提取非ht字段并进行粗频偏校正允许可靠的符号计时nonHT = rx波形(pktOffset+(ind.LSTF(1):ind.LSIG(2)),:);coarseFreqOffset = wlanCoarseCFOEstimate(nonHT,chanBW);nonHT = helperFrequencyOffset(nonHT,sampleRate,-粗频偏移);符号定时同步fineTimingOffset = wlanSymbolTimingEstimate(nonHT,chanBW);调整数据包偏移量pktOffset = pktOffset+fineTimingOffset;%定时同步完成:检测到数据包并已同步同步和后提取非ht前缀字段%执行频率校正如果(pktOffset<0) || ((pktOffset+minPktLen)>rxWaveformLen) searchOffset = pktOffset+1.5*lstfLen;继续;结束流(在索引%d\n处检测到%d、pktInd pktOffset + 1);提取前7个OFDM符号值的数据进行格式检测和% L-SIG解码nonHT = rx波形(pktOffset+(1:7*Ns),:);nonHT = helperFrequencyOffset(nonHT,sampleRate,-粗频偏移);%执行精细的频率偏移校正同步和%粗更正的前导字段lltf = nonHT(ind.LLTF(1):ind.LLTF(2),:);提取L-LTFfineFreqOffset = wlanFineCFOEstimate(lltf,chanBW);nonHT = helperFrequencyOffset(nonHT,sampleRate,-fineFreqOffset);cfoCorrection =粗freqoffset +细frereqoffset;CFO总数使用L-LTF的信道估计lltf = nonHT(ind.LLTF(1):ind.LLTF(2),:);demodLLTF = wlanLLTFDemodulate(lltf,chanBW);chanEstLLTF = wlanLLTFChannelEstimate(demodLLTF,chanBW);噪声估计noiseVarNonHT = helperNoiseEstimate(demodLLTF);立即使用3个OFDM符号进行数据包格式检测%跟随L-LTFformat = 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);如果failCheck流(L-SIG检查失败\n);searchOffset = pktOffset+1.5*lstfLen;继续;其他的流(L-SIG check pass \n);结束根据解码后的L-SIG提取报文参数[lsigMCS,lsigLen,rxSamples] = helperInterpretLSIG(recLSIGBits,sampleRate);如果(rxSamples + pktOffset) > (rxWaveform) disp(长度'**没有足够的样本来解码数据包**');打破;结束对整个数据包应用CFO校正rx波形(pktOffset+(1:rxSamples),:) = helperFrequencyOffset(...rxWaveform (pktOffset + (1: rxSamples):), sampleRate, -cfoCorrection);创建一个接收非ht配置对象rxNonHTcfg = wlanNonHTConfig;rxNonHTcfg。MCS = lsigMCS;rxNonHTcfg。PSDULength = lsigLen;获取PPDU内的数据字段索引indNonHTData = wlanFieldIndices(rxNonHTcfg,“NonHT-Data”);使用传输的数据包参数和通道恢复PSDU位%估计来自L-LTF[rxPSDU,eqSym] = wlanNonHTDataRecover(rx波形(pktOffset+...(indNonHTData (1): indNonHTData (2)),:),...chanEstLLTF、noiseVarNonHT rxNonHTcfg);星座(重塑(eqSym [], 1));当前星座暂停(0);允许星座重绘释放(星座);释放先前的星座图refSym = wlanClosestReferenceSymbol(eqSym,rxNonHTcfg);[evm.RMS,维生素。Peak] = evmCalculator(refSym,eqSym);解码MPDU并提取MSDU[cfgMACRx,msduList{pktInd},status] = wlanMPDUDecode(rxPSDU,rxNonHTcfg);% #好< * 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二进制数据流rxBit{pktInd} = double(msduList{pktInd});结束显示解码后的信息如果displayFlag流('估计CFO: %5.1f Hz\n\n', cfoCorrection);% #好< * UNRCH >disp (解码的L-SIG内容:);流(' MCS: %d\n', lsigMCS);流(长度:%d\n, lsigLen);流('包中的样本数:%d\n\n', rxSamples);流(“维生素:\ n”);流(' EVM峰值:%0.3f%% EVM RMS: %0.3f%%\n\n',...evm.Peak evm.RMS);流(已解码的MAC序列控制字段内容:\n);流('序列号:%d\n\n'packetSeq (pktInd));结束%更新搜索索引searchOffset = pktOffset+double(indNonHTData(2));检测到重复数据包时结束处理。的%恢复的数据包括来自重复帧的位从重复帧中移除数据位如果length(unique(packetSeq)) < length(packetSeq) rxBit = rxBit(1:length(unique(packetSeq)));打破结束pktInd = pktInd+1;结束
在索引7处检测到数据包1
检测到非ht格式
L-SIG检查通过
MAC FCS检查通过
在索引8647处检测到Packet-2
检测到非ht格式
L-SIG检查通过
MAC FCS检查通过
在索引17287处检测到数据包-3
检测到非ht格式
L-SIG检查通过
MAC FCS检查通过
在索引25927处检测到数据包4
检测到非ht格式
L-SIG检查通过
MAC FCS检查通过
在索引34567处检测到数据包-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检查通过
如果使用特别提款权,释放sdrTransmitter
而且sdrReceiver
对象,以停止802.11波形的连续传输,并允许对SDR对象属性进行任何修改。
如果频道= =“OverTheAir”释放(sdrTransmitter);释放(sdrReceiver);结束释放(spectrumScope);
重建图像
使用接收到的MAC帧重建图像。
如果~(isempty(fineTimingOffset) || isempty(pktOffset)) rxData = cell2mat(rxBit);startSeq = find(packetSeq==0);rxData = circshift(rxData,[0 -(startSeq(1)-1)]);订购MAC片段%进行误码率(BER)计算bitErrorRate = com . errorrate;err = bitErrorRate(double(rxData(:))),...txDataBits(1:长度(重塑(rxData [], 1))));流(误码率(BER):\n');流(误码率(BER) = %0.5f\n',犯错(1));流('误码数= %d\n'犯错(2));流('传输比特数= %d\n\n'长度(txDataBits));试一试decdata = bi2de(重塑(rxData(1:length(txImage)*bitsPerOctet),8,[])');从接收到的数据重新创建映像流(从接收到的数据构造图像。\n);receivedImage = uint8(重塑(decdata,imsize));图像接收百分比如果存在(“imFig”,“var”&&把手(imFig)%如果Tx图形打开图(imFig);次要情节(212);其他的图;次要情节(212);结束imshow (receivedImage);标题(sprintf (收到图片的));抓错误("**接收到的数据不足以重建图像。**")结束结束
误码率(BER):
误码率(BER) = 0.00000
误码数= 0
传输比特数= 202752
从接收到的数据构造图像。