主要内容

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

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

介绍

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

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

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

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

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

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

示例设置

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

  • 过热:使用SDR收发WLAN波形

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

  • 无影响:无损地通过传输波形

如果你设置频道过热,设置设备名称到期望的SDR:

  • 设置为冥王星使用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),...“标题”“接收基带无线局域网信号频谱”...“YLabel”“功率谱密度”...“位置”,[69 376 800 450]);为WLAN符号设置星座图查看器refQAM = wlanReferenceSymbols (64 qam);星座图=通信星座图(...“标题”“平衡的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. 数据包中所携带的数据的长度,由msduLength变量

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

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

%输入图像文件并转换为二进制流文件传送=“peppers.png”%图像文件名fData = imread (fileTx);从文件中读取图像数据规模= 0.2;%图像比例因子origSize=大小(fData);%原始输入图像大小scaledSize=最大值(地板(比例。*原始尺寸(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),“可见”“关闭”);

Figure Image Plot包含一个axes对象。带有标题传输图像的axes对象包含一个Image类型的对象。

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

片段传输数据

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

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

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(0,1);对于我= 0:numMSDUs-1%提取每个MPDU的图像数据(八位元)frameBody = txData(我* msduLength + 1: msduLength * (i + 1):);%创建MAC帧配置对象并配置序号cfgMAC = wlanMACFrameConfig (“FrameType”“数据”“SequenceNumber”,我);%生成MPDU[psdu,lengthMPDU]=wlanMACFrame(框体,cfgMAC,“OutputFormat”“位”);%连接PSDU以生成波形data =[数据;psdu];%#好的终止

产生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兆赫兹的波形以供传输。

osf = 1.5;sampleRate = wlanSampleRate (nonHTcfg);%以Hz表示的名义采样率%生成以空闲时间分隔的基带NonHT报文txWaveform = wlanWaveformGenerator(数据、nonHTcfg...“NumPackets”numMSDUs,“IdleTime”, 20 e-6,...“加扰初始化”scramblerInitialization,...“过采样因子”(osf);

配置SDR用于传输

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

创建一个sdrTransmitter对象使用sdrtx函数。将中心频率、采样率和增益设置为相应的属性sdrTransmitter对象。对于2.4 GHz频段5通道上的802.11a信号,其中心频率为IEEE Std 802.11-2016 16.3.6.3节定义的2.432 GHz。

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

如果频道= =“OverTheAir”txGain =-10%发射机性能sdrTransmitter = sdrtx(设备名称);sdrTransmitter。BasebandSampleRate = sampleRate * osf;sdrTransmitter。CenterFrequency = 2.432 e9;%第五频道SDR变送器。增益=txGain;fprintf(“\n正在生成WLAN传输波形:\n”%缩放标准化信号以避免射频级饱和powerScaleFactor = 0.8;txWaveform = txWaveform。* (1 / max (abs (txWaveform)) * 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. 对已解码MSDUs进行排序序列号属性中恢复的MAC帧配置对象

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

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

接收方设置

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

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

如果频道= =“OverTheAir”sdrReceiver = sdrrx(设备名称);sdrReceiver。BasebandSampleRate = sdrTransmitter.BasebandSampleRate;sdrReceiver。CenterFrequency = sdrTransmitter.CenterFrequency;sdrReceiver。OutputDataType =“双人”将捕获长度配置为文件长度的两倍%发送信号,这是为了确保按顺序接收PSDU。%接收到重复的MAC分片时会被删除。sdrReceiver。SamplesPerFrame = 2 *长度(txWaveform);流(“\n正在开始新的射频捕获。\n”)rxWaveform=捕获(SDRCeiver,SDRCeiver.SamplesPerFrame,“样本”);elseif频道= =“GaussianNoise”信噪比= 20;% dBrxWaveform = awgn (txWaveform,信噪比,“测量”);其他的%无损伤rxWaveform=txWaveform;终止

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

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

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

接收机处理

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

aStop = 40;%阻带衰减ofdmInfo = wlanNonHTOFDMInfo (“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=设计多速率FIR(L、M、TW、aStop);

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

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

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

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

displayFlag =错误的

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

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

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

ind=WLANFIELDICES(非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显示('**没有检测到包**');终止打破终止%提取非HT字段并执行粗略频率偏移校正%以保证可靠的符号定时nonHT = rxWaveform (pktOffset + (ind.LSTF (1): ind.LSIG (2)),:);coarseFreqOffset = wlanCoarseCFOEstimate (nonHT chanBW);nonHT = helperFrequencyOffset (nonHT sampleRate -coarseFreqOffset);%符号定时同步fineTimingOffset = wlanSymbolTimingEstimate (nonHT chanBW);%调整数据包偏移量pktOffset = pktOffset + fineTimingOffset;%定时同步完成:检测到数据包并同步%同步后提取非ht前导字段频率校正%如果(pktOffset<0) || ((pktOffset+minPktLen)>rxWaveformLen) searchOffset = pktOffset+1.5*lstfLen;继续终止流('\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):);demodLLTF = wlanLLTFDemodulate (lltf chanBW);chanEstLLTF = wlanLLTFChannelEstimate (demodLLTF 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);如果failCheck流(' L-SIG检查失败\n');searchOffset = pktOffset + 1.5 * lstfLen;继续其他的流('L-SIG检查通过\n');终止%基于解码的L-SIG检索数据包参数[lsigMCS, lsigLen rxSamples] = helperInterpretLSIG (recLSIGBits sampleRate);如果(rxSamples + pktOffset) > (rxWaveform) disp(长度'**没有足够的样本来解码包**');打破终止%对整个数据包应用CFO修正rxWaveform (pktOffset + (1: rxSamples):) = helperFrequencyOffset (...rxWaveform (pktOffset + (1: rxSamples):), sampleRate, -cfoCorrection);创建一个接收非ht配置对象rxNonHTcfg = wlanNonHTConfig;rxNonHTcfg。MCS = lsigMCS;rxNonHTcfg。PSDULength = lsigLen;%获取PPDU中的数据字段索引indNonHTData=WLANFIELDICES(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);%#好的<*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});终止%显示解码信息如果displayFlag流(“预计CFO: %5.1f Hz\n\n”,CFO校正);% #好< * UNRCH >disp ('解码的L-SIG内容:'); fprintf(“MCS: % d \ n”, lsigMCS);流(“长度:% d \ n”, lsigLen);流('包中的样本数量:%d\n\n',Rx样本);fprintf(“维生素:\ n”); fprintf(RMS: %0.3f%%\n\n'...evm.Peak evm.RMS);流('解码的MAC序列控制字段内容:\n'); fprintf('序列号:%d\n\n'packetSeq (pktInd));终止%更新搜索索引searchOffset = pktOffset +双(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,则释放sdrTransmitterSDR接收器对象停止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:长度(重塑(rxData,[],1)));fprintf(' \nBit误码率(BER):\n'); fprintf('误码率(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));图接收图像如果存在(“imFig”“var”) & & ishandle (imFig)%如果Tx数字为开图(imFig);次要情节(212);其他的图;子地块(212);终止imshow(receivedImage);title(sprintf)(收到图片的));错误(“**接收的数据不足,无法重建图像。**终止终止
误码率(BER):
比特误码率(BER) = 0.00000
位错误数=0
传输位数= 202752
从接收的数据构造图像。

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

进一步的探索

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

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

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

特别提款权故障排除

  • 阿达姆-冥王星无线电常见问题及修复(模拟设备通信工具箱支持包ADALM-Pluto金宝app无线电)

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

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