主要内容

基于802.11波形和SDR的图像传输和接收

本示例演示如何将图像文件编码并打包到WLAN数据包中进行传输,然后解码数据包以检索图像。该示例还展示了如何使用软件定义无线电(SDR)进行无线局域网包的无线传输和接收。

简介

这个示例导入一个映像文件并将其分割到多个介质访问控制(MAC)服务数据单元(msdu)中。它将每个MSDU传递给wlanMACFrame函数创建MAC协议数据单元MPDU。这个函数还利用了awlanMACFrameConfig对象作为输入,它通过SequenceNumber财产。然后,该示例将MPDUs作为PHY层服务数据单元(PSDUs)传递给物理层。每个PSDU数据使用单个非高吞吐量(nonHT) 802.11a™WLAN数据包进行传输。控件创建WLAN基带波形wlanWaveformGenerator函数。该功能利用多个psdu,对每个psdu进行处理,形成一系列准备传输的物理层收敛过程(PLCP)协议数据单元(PPDUs)。

然后生成的波形通过加性高斯白噪声(AWGN)通道来模拟空中传输。随后,wlanMPDUDecode函数获取噪声波形并对其进行解码。然后,SequenceNumber在恢复的MAC帧配置对象中的属性允许示例按顺序对提取的msdu排序。多个接收的msdu中的信息位组合起来恢复传输的图像。此图表显示了接收器的处理过程。

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

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

USRP通信工具箱支持包金宝app®嵌入式系列收音机

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

示例设置

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

  • OverTheAir:使用SDR收发WLAN波形

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

  • NoImpairments:传输波形无损伤通过

如果你设置通道OverTheAir,设置设备名称指定的特别提款权:

  • 设置为冥王星使用ADALM-Pluto无线电(默认)

  • 设置为E3xx使用USRP嵌入式系列收音机

  • 设置为AD936xFMCOMMS5使用Xilinx Zynq-Based Radio

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

配置示例的所有范围和图。

为图像绘制设置句柄如果~ (“imFig”“var”|| ~ishandle(imFig)% #好< SUSENS >imFig =图;imFig。NumberTitle =“关闭”;imFig。Name =“形象策划”;imFig。可见=“关闭”其他的clf (imFig);%清晰数字imFig。可见=“关闭”结束%设置频谱查看器spectrumScope = dsp。简介(...“SpectrumType”的功率密度...“SpectralAverages”10...“YLimits”(-90 -30),...“标题”“接收基带WLAN信号频谱”...“YLabel”“功率谱密度”...“位置”,[69 376 800 450]);为均衡WLAN符号设置星座图查看器refQAM = wlanreferencesymbles (64 qam);星座图(...“标题”“均衡无线局域网符号”...“ShowReferenceConstellation”,真的,...“ReferenceConstellation”refQAM,...“位置”,[878 376 460 460]);

发射机的设计

本步骤介绍了WLAN发射机的一般过程。

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

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

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

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

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

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

准备图像文件

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

二进制数据流的大小会影响传输图像数据所需的WLAN报文数。产生用于传输的WLAN报文的数量取决于这些因素。

  1. 图像缩放,在导入图像文件时设置

  2. 报文中所携带的数据的长度,由msduLength变量

  3. 所传输报文的调制编码方案值

缩放系数和MSDU长度的组合决定了WLAN传输所需的无线数据包数量。设置规模0.2而且msduLength2304需要传输11个WLAN无线数据包。增大缩放系数或减小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),“可见”“关闭”);

图图像Plot包含一个axes对象。标题为“传输图像”的axis对象包含一个类型为Image的对象。

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

分片传输数据

拆分数据流(txImage)转换成更小的传输单元(msdu)msduLength.然后,为每个传输单元创建MPDUwlanMACFrame函数。每次调用此函数都会创建一个MPDU,对应于给定的MSDU和帧配置对象。接下来,使用创建框架配置对象wlanMACFrameConfig命令,配置MPDU序列号。然后依次将所有MPDUs传递到物理层进行传输。

为确保传输的MSDU大小不超过标准规定的最大值,请设置msduLength字段2304字节。为了使所有MPDU的大小相同,在最后一个MPDU的数据中添加0。

msduLength = 2304;MSDU长度(以字节为单位)numMSDUs = celll (length(txImage)/msduLength);padzero = msduLength-mod(length(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基带WLAN信号

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

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

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

ramblerinitialization = randi([1 127], nummsus,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对象。对于通道5的802.11a信号,在2.4 GHz频段内,对应的中心频率为IEEE Std 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。Gain = txGain;流(\n生成WLAN传输波形:\n'缩放归一化信号以避免射频级饱和powerScaleFactor = 0.8;tx波形= tx波形.*(1/max(abs(tx波形))*powerScaleFactor);%发射射频波形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. 顺序解码的msdu基于SequenceNumber属性在恢复的MAC帧配置对象中

  12. 从所有传输的包中合并解码的msdu以形成接收到的图像

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

接收方设置

如果使用SDR,则创建一个sdrReceiver对象使用sdrrx函数。的相应属性设置中心频率、采样率和输出数据类型sdrReceiver对象。

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

如果频道= =“OverTheAir”sdrReceiver = sdrrx(deviceName);sdrReceiver。BasebandSampleRate = sdrtransmit .BasebandSampleRate;sdrReceiver。CenterFrequency = sdrTransmitter.CenterFrequency;sdrReceiver。OutputDataType =“双”的长度的两倍配置捕获长度%的传输信号,这是为了确保psdu按顺序接收。%在接收时,重复的MAC片段被删除。sdrReceiver。SamplesPerFrame = 2*length(tx波形);流(\n开始新的射频捕获。\n'rx波形= capture(sdrReceiver,sdrReceiver.)SamplesPerFrame,“样本”);elseif频道= =“GaussianNoise”信噪比= 20;% dBrx波形= awgn(tx波形,信噪比,“测量”);其他的%无减损rx波形= tx波形;结束

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

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

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

接收处理

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

stop = 40;%阻带衰减ofdmInfo = wlanonhtofdminfo (“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, stop);

将过采样波形重新采样到20兆赫,以便使用dsp。FIRRateConverter上面设计的系统对象和滤波器。

firrc = dsp.FIRRateConverter(L,M,b);rx波形= firrc(rx波形);

如果使用SDR,则SDR以循环的方式连续传输802.11波形。接收到的第一个数据包sdrReceiver可能不是第一个传输的数据包。这意味着数据包可能会被打乱顺序解码。为了使接收到的数据包能够按照正确的顺序重新组合,必须确定它们的序列号。的wlanMPDUDecode函数从每个包的解码的PSDU位解码MPDU,并输出MSDU和恢复的MAC帧配置对象wlanMACFrameConfig.的SequenceNumber属性可用于按传输顺序对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 = frequencyOffset(nonHT,sampleRate,-粗频率偏移);%符号定时同步fineTimingOffset = wlanSymbolTimingEstimate(nonHT,chanBW);%调整数据包偏移量pktOffset = pktOffset+fineTimingOffset;%定时同步完成:检测到并同步数据包%在同步和之后提取非ht前导字段%执行频率校正如果(pktOffset+minPktLen)>rxWaveformLen) searchOffset = pktOffset+1.5*lstfLen;继续结束流('\nPacket-在索引%d\n处检测到%d '、pktInd pktOffset + 1);提取前7个OFDM符号值的数据进行格式检测和% L-SIG解码nonHT = rx波形(pktOffset+(1:7*Ns),:);nonHT = frequencyOffset(nonHT,sampleRate,-粗频率偏移);执行精确的频率偏移校正同步和%粗修正的序言字段lltf = nonHT(ind.LLTF(1):ind.LLTF(2),:);%提取L-LTFfineFreqOffset = wlanFineCFOEstimate(lltf,chanBW);nonHT = frequencyOffset(nonHT,sampleRate,-fineFreqOffset);cfoCorrection = coarseFreqOffset+fineFreqOffset;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-LTFwlanFormatDetect(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检查失败');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),:) = frequencyOffset(...rxWaveform (pktOffset + (1: rxSamples):), sampleRate, -cfoCorrection);创建一个接收非ht配置对象rxNonHTcfg = wlanNonHTConfig;rxNonHTcfg。MCS = lsigMCS;rxNonHTcfg。PSDULength = lsigLen;获取PPDU内的数据字段索引(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,维生素。= 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 peak: %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处检测到数据包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检查通过

如果使用SDR,则释放sdrTransmitter而且sdrReceiver对象来停止802.11波形的连续传输,并允许对SDR对象属性进行任何修改。

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

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

重建图像

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

如果~(isempty(fineTimingOffset) || isempty(pktOffset)) rxData = cell2mat(rxBit);startSeq = find(packetSeq==0);rxData = circshift(rxData,[0 -(startSeq(1)-1)]);%订购MAC片段%进行误码率计算bitErrorRate = com . errorrate;err = bitErrorRate(double(rxData(:))),...txDataBits(1:长度(重塑(rxData [], 1))));流(\n误码率(BER):\n');流('误码率(BER) = %0.5f\n',犯错(1));流('误码数= %d\n'犯错(2));流('传输比特数= %d\n\n'长度(txDataBits));试一试decdata = bi2de(重塑(rxData(1:length(txImage)*bitsPerOctet),8,[])');从接收到的数据重新创建映像流(\n从接收到的数据构建图像。\n');receivedImage = uint8(重塑(decdata,imsize));% Plot received image如果存在(“imFig”“var”) && handle(imFig)如果Tx图是打开的图(imFig);次要情节(212);其他的图;次要情节(212);结束imshow (receivedImage);标题(sprintf (收到图片的));错误("**接收到的数据不足以重建图像。**"结束结束
误码率(BER):
误码率(BER) = 0.00000
误码率= 0
传输比特数= 202752
根据接收到的数据构造图像。

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

进一步的探索

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

  • 如果不使用SDR运行示例,请修改信噪比观察信号接收和处理后EVM和BER的差异。

  • 增加比例系数(规模)以产生更多的传送位,以改善接收图像的质素。这也增加了传输的PPDUs的数量。

特别提款权故障排除