图像传输和接收使用802.11波形和特别提款权
这个例子展示了如何编码和包一个图像文件随后为传输和无线局域网数据包解码数据包来检索图像。示例还展示了如何使用一个软件定义无线电(SDR) WLAN的无线传输和接收数据包。
介绍
这个例子和部分图像文件导入多个介质访问控制(MAC)服务数据单元(MSDUs)。它通过每个MSDUwlanMACFrame
函数创建一个MAC协议数据单元(MPDU)。这个函数也利用wlanMACFrameConfig
对象作为输入,MPDUs通过的顺序编号SequenceNumber
财产。这个例子然后通过MPDUs和物理层(体育)层作为层服务数据单元(PSDUs)。每个PSDU数据使用单个non-high-throughput (nonHT)™802.11 WLAN传输的数据包。这个例子创建了一个无线局域网使用的基带波形wlanWaveformGenerator
函数。这个函数使用多个PSDUs和流程每个形成一系列的物理层收敛过程(PLCP)协议数据单元(PPDUs)准备传播。
生成的波形然后穿过一个加性高斯白噪声(AWGN)信道模拟无线传输。随后,wlanMPDUDecode
函数的波形和解码。然后,SequenceNumber
属性在恢复MAC帧配置对象允许例子顺序提取的MSDUs秩序。接收到的信息比特的多个MSDUs结合恢复传输图像。这个图表显示了接收机处理。
另外,生成的WLAN波形可以通过空气传播和接收使用这些支持sdr。金宝app
为模拟设备通信工具箱支持包金宝app®ADALM-Pluto广播
安装和设置为模拟设备(通信工具箱支持包ADALM-Plut金宝appo广播)
金宝app支持的硬件为模拟设备(通信工具箱支持包ADALM-Plut金宝appo广播)
为USRP通信工具箱支持包金宝app®嵌入式系列广播
为Xilinx通信工具箱支持包金宝app®Zynq®的电台
示例设置
在运行示例之前,设置通道
变量是其中一个选项:
OverTheAir
:使用一个特别提款权来发送和接收WLAN波形GaussianNoise
:通过传输波形通过AWGN信道(默认)NoImpairments
:传输波形通过没有障碍
如果你设置通道
来OverTheAir
,设置设备名称
所需的特别提款权:
设置为
冥王星
使用ADALM-Pluto电台(默认)设置为
E3xx
使用USRP嵌入式系列广播设置为
AD936x
或FMCOMMS5
使用Xilinx Zynq-Based收音机
频道=“GaussianNoise”;如果频道= =“OverTheAir”设备名称=“冥王星”;结束
配置所有的范围和数据的例子。
%设置处理图像的阴谋如果~ (“imFig”,“var”)| | ~ ishandle (imFig)% #好< SUSENS >imFig =图;imFig。NumberTitle =“关闭”;imFig。Name =“形象策划”;imFig。可见=“关闭”;其他的clf (imFig);%清晰的图imFig。可见=“关闭”;结束%设置频谱查看器spectrumScope = dsp.SpectrumAnalyzer (…“SpectrumType”,的功率密度,…“SpectralAverages”10…“YLimits”(-90 -30),…“标题”,收到了基带WLAN信号频谱的,…“YLabel”,的功率谱密度,…“位置”,(69 376 800 450));%设置的星座图查看器平衡的WLAN符号refQAM = wlanReferenceSymbols (64 qam);星座= comm.ConstellationDiagram (…“标题”,“平衡的WLAN符号”,…“ShowReferenceConstellation”,真的,…“ReferenceConstellation”refQAM,…“位置”,(878 376 460 460));
发射机的设计
这些步骤描述WLAN发射机的一般程序。
导入一个图像文件,并把它转换成十进制流字节
生成一个基带WLAN信号使用WLAN工具箱
802.11数据流分成多个数据包
如果使用特别提款权,这些步骤描述的设置特别提款权发射机。
准备使用特别提款权硬件传输的基带信号
基带数据发送到SDR硬件upsampling和连续传输所需的中心频率
准备图像文件
从图像读取数据文件,传播,规模,将其转换为十进制流字节。图像的缩放比例降低了质量减少二进制数据流的大小。
二进制数据流的大小影响无线局域网数据包的数量需要传输的图像数据。WLAN生成数据包传输的数量取决于这些因素。
图像缩放,在导入图像文件
数据的长度进行分组,指定的
msduLength
变量调制和编码方案(MCS)传输包的价值
比例因子的结合和MSDU长度决定了WLAN无线数据包传输所需的数量。设置规模
来0.2
和msduLength
来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 (,“类型”,“文本”),“可见”,“上”);
片段传输数据
将数据流(txImage
)为较小的传输单位(MSDUs)的大小msduLength
。然后,创建一个为每个传输MPDU单位使用wlanMACFrame
函数。每次调用这个函数创建一个对应于给定MPDU MSDU和框架配置对象。接下来,创建框架配置对象使用wlanMACFrameConfig
配置MPDU的序列号。所有MPDUs然后按顺序传递到物理层传输。
确保传输的MSDU大小不超过工程记载最大,设置msduLength
字段2304年
字节。所有MPDUs相同的尺寸,附加的数据在过去MPDU 0。
msduLength = 2304;% MSDU长度字节numMSDUs =装天花板(长度(txImage) / msduLength);padZeros = msduLength-mod(长度(txImage), msduLength);txData = [txImage; 0 (padZeros 1)];txDataBits =双(重塑(de2bi (txData 8)”[], 1));%将输入数据流分成碎片bitsPerOctet = 8;data = 0 (0,1);为我= 0:numMSDUs-1%提取图像数据为每个MPDU(八位字节)frameBody = txData(我* msduLength + 1: msduLength * (i + 1):);%创建MAC帧配置对象和配置序列号cfgMAC = wlanMACFrameConfig (“FrameType”,“数据”,“SequenceNumber”,我);%生成MPDU[psdu, lengthMPDU] = wlanMACFrame (frameBody cfgMAC,“OutputFormat”,“位”);%连接PSDUs波形生成data =[数据;psdu];% #好< AGROW >结束
802.11生成基带WLAN的信号
合成non-HT波形使用wlanWaveformGenerator
函数与一个non-HT格式创建的配置对象wlanNonHTConfig
函数。在这个例子中,配置对象有一个20 MHz带宽,传输天线和64 qam 2/3 (MCS 6)。
nonHTcfg = wlanNonHTConfig;%创建包配置nonHTcfg。MCS = 6;%调制:64 qam率:2/3nonHTcfg。NumTransmitAntennas = 1;%的发送天线数量chanBW = nonHTcfg.ChannelBandwidth;nonHTcfg。PSDULength = lengthMPDU;%设置PSDU长度
初始化每个数据包的扰频器与一个随机整数。
scramblerInitialization =兰迪([127]numMSDUs 1);
设置采样过密的因素1.5
生成的波形30 MHz传播。
osf = 1.5;sampleRate = wlanSampleRate (nonHTcfg);%的名义在赫兹采样率%生成基带NonHT数据包由空闲时间txWaveform = wlanWaveformGenerator(数据、nonHTcfg…“NumPackets”numMSDUs,“IdleTime”,20 e-6,…“ScramblerInitialization”scramblerInitialization,…“OversamplingFactor”(osf);
为传输配置特别提款权
如果使用特别提款权,设置发射机获得参数(txGain
),以减少传输质量和影响接收到的波形。
创建一个sdrTransmitter
对象使用sdrtx
函数。设置中心频率,采样率,并获得相应的属性sdrTransmitter
对象。802.11在5频道的信号的频率为2.4 GHz,相应的中心频率为2.432 GHz 16.3.6.3 IEEE Std 802.11节定义-2016。
的sdrTransmitter
对象使用重复功能传输基带WLAN传输波形的一个循环双数据速率(DDR)内存SDR。
如果频道= =“OverTheAir”txGain =-10年;%发射机性能sdrTransmitter = sdrtx(设备名称);sdrTransmitter。BasebandSampleRate = sampleRate * osf;sdrTransmitter。CenterFrequency = 2.432 e9;% 5频道sdrTransmitter。获得= txGain;流(“\ nGenerating WLAN传输波形:\ n”)%规模标准化信号避免射频的饱和阶段powerScaleFactor = 0.8;txWaveform = txWaveform。* (1 / max (abs (txWaveform)) * powerScaleFactor);%射频传输波形transmitRepeat (sdrTransmitter txWaveform);结束
的transmitRepeat
函数传输基带WLAN数据包空闲时间特别提款权,和硬件信号样本存储在内存中。然后传输波形的例子不断空气,直到传输对象的释放。
接收机的设计
下面列出的步骤描述WLAN接收机的一般结构。
如果使用特别提款权硬件,捕捉WLAN传输信号的多个数据包
检测包
粗糙的载波频率偏移估计和修正
好时机建立同步。L-STF, L-LTF L-SIG样品提供了良好时机允许调整数据包检测L-STF的开始或结束
载波频率偏移估计和修正
进行信道估计的使用L-LTF接收信号
检测数据包的格式
解码L-SIG场恢复MCS价值和数据部分的长度
解码数据字段获得在每个数据包的传输数据
解码收到PSDU并检查如果帧校验序列(FCS) PSDU传递
解码MSDUs基于顺序
SequenceNumber
财产的恢复MAC帧配置对象把解码MSDUs传播形成了接收数据包的形象
这个例子中情节功率谱密度(PSD)接收的波形,并展示了平衡的数据的可视化符号和接收到的图像。
接收方设置
如果使用特别提款权,创建一个sdrReceiver
对象使用sdrrx
函数。设置中心频率、采样率和输出数据类型的对应属性sdrReceiver
对象。
否则,应用高斯噪声txWaveform
使用情况下
函数或通过txWaveform
直接通过接收机处理。
如果频道= =“OverTheAir”sdrReceiver = sdrrx(设备名称);sdrReceiver。BasebandSampleRate = sdrTransmitter.BasebandSampleRate;sdrReceiver。CenterFrequency = sdrTransmitter.CenterFrequency;sdrReceiver。OutputDataType =“双”;%配置捕获长度相当于两倍的长度%传输信号,这是为了确保PSDUs为了接收。%在接待重复MAC碎片移除。sdrReceiver。SamplesPerFrame = 2 *长度(txWaveform);流(“\ nStarting新的射频捕获。\ n”)rxWaveform =捕获(sdrReceiver sdrReceiver.SamplesPerFrame,“样本”);elseif频道= =“GaussianNoise”信噪比= 20;% dBrxWaveform = awgn (txWaveform,信噪比,“测量”);其他的%没有障碍rxWaveform = txWaveform;结束
显示接收到的波形的功率谱密度。
spectrumScope。SampleRate = SampleRate * osf;spectrumScope (rxWaveform);
接收处理
设计为重新采样率转换过滤器波形的名义基带接收机处理使用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 = designMultirateFIR (L, M, TW aStop);
重新取样采样过量波形回到20 MHz加工使用dsp.FIRRateConverter
系统对象和上面的滤波器设计。
firrc = dsp.FIRRateConverter (L, M, b);rxWaveform = firrc (rxWaveform);
如果使用一个特别提款权,特别提款权不断循环中802.11波形无线传输。第一个收到的数据包sdrReceiver
可能不是第一个数据包传输。这意味着包可能是解码序列。使接收到的数据包重组以正确的顺序,他们的序列号必须确定。的wlanMPDUDecode
从解码函数解码MPDU PSDU的每个数据包和输出MSDU以及恢复的MAC帧配置对象wlanMACFrameConfig
。的SequenceNumber
属性在恢复MAC帧配置对象可用于排序的MSDUs传播序列。
显示每个数据包解码L-SIG内容,维生素与测量,和序列号,检查displayFlag
盒子。
displayFlag =假;
设置所需的变量进行接收处理。
rxWaveformLen =大小(rxWaveform, 1);searchOffset = 0;%抵消从开始的波形样本
指数在PSDU得到所需的字段。
印第安纳州= wlanFieldIndices (nonHTcfg);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 = [];%进行维生素与计算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 +双(ind.LSIG (2)) > rxWaveformLen)如果pktInd = = 1 disp (“* *没有包发现* *”);结束打破;结束%提取non-HT字段和执行粗频率偏移校正%时间允许可靠的象征nonHT = rxWaveform (pktOffset + (ind.LSTF (1): ind.LSIG (2)),:);coarseFreqOffset = wlanCoarseCFOEstimate (nonHT chanBW);nonHT = frequencyOffset (nonHT sampleRate -coarseFreqOffset);%符号定时同步fineTimingOffset = wlanSymbolTimingEstimate (nonHT chanBW);%调整包抵消pktOffset = pktOffset + fineTimingOffset;%的时间同步完成:包检测和同步%提取non-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 = frequencyOffset (nonHT sampleRate -coarseFreqOffset);%对同步和执行好频率偏移校正%粗校正序言字段lltf = nonHT (ind.LLTF (1): ind.LLTF (2):);%提取L-LTFfineFreqOffset = wlanFineCFOEstimate (lltf chanBW);nonHT = frequencyOffset (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”)流(”除了Non-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):) = frequencyOffset (…rxWaveform (pktOffset + (1: rxSamples):), sampleRate, -cfoCorrection);%创建一个接收Non-HT配置对象rxNonHTcfg = wlanNonHTConfig;rxNonHTcfg。MCS = lsigMCS;rxNonHTcfg。PSDULength = lsigLen;%得到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);% #好< * 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流('估计首席财务官:% 5.1 f赫兹\ n \ n”,cfoCorrection);% #好< * UNRCH >disp (“解码L-SIG内容:”);流(“MCS: % d \ n”,lsigMCS);流(“长度:% d \ n”,lsigLen);流(包的样品数量:% d \ n \ n ',rxSamples);流(“维生素:\ n”);流('维生素与峰:% 0.3 f % %维生素与RMS: % 0.3 f % % \ n \ n ',…evm.Peak evm.RMS);流(“解码MAC顺序控制字段内容:\ n”);流(序号:% d \ n \ n 'packetSeq (pktInd));结束%更新搜索索引searchOffset = pktOffset +双(indNonHTData (2));%完成处理当检测到重复的包。的%恢复数据包括从复制帧比特%删除复制帧的数据位如果长度(独特(packetSeq)) <长度(packetSeq) rxBit = rxBit(1:长度(独特(packetSeq)));打破结束pktInd = pktInd + 1;结束
包1发现指数7
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
包2发现指数8647
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-3发现指数17287
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-4发现指数25927
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-5发现指数34567
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-6发现指数43207
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-7发现指数51847
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-8发现指数60487
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-9发现指数69127
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-10发现指数77767
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
Packet-11发现指数86407
Non-HT格式检测
L-SIG检查通过
MAC FCS检查通过
如果使用特别提款权,释放sdrTransmitter
和sdrReceiver
对象停止802.11的连续传输波形,并允许SDR对象属性的任何修改。
如果频道= =“OverTheAir”释放(sdrTransmitter);释放(sdrReceiver);结束释放(spectrumScope);
重建图像
使用了MAC帧重建图像。
如果~ (isempty (fineTimingOffset) | | isempty (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))));流(' \ nBit错误率(BER): \ n”);流(的误比特率(BER) = % 0.5 f \ n ',犯错(1));流(“有些错误的数量= % d \ n '犯错(2));流(的传输比特数= % d \ n \ n '长度(txDataBits));试一试decdata = bi2de(重塑(rxData(1:长度(txImage) * bitsPerOctet), 8日,[])');%从接收的数据重建图像流(“\ nConstructing形象从接收的数据。\ n”);receivedImage = uint8(重塑(decdata imsize));%情节收到图片如果存在(“imFig”,“var”)& & ishandle (imFig)%如果Tx图是开放的图(imFig);次要情节(212);其他的图;次要情节(212);结束imshow (receivedImage);标题(sprintf (收到图片的));抓错误(“* *不够接收的数据来重建图像。* *”)结束结束
误比特率(BER):
误比特率(BER) = 0.00000
一些错误的数量= 0
传输的比特数= 202752
从接收的数据构造图像。