主要内容

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

本例展示了如何使用LTE波形和软件定义无线电(SDR)传输和接收图像。本例生成单天线或多天线LTE波形,用于在单个SDR平台上同时传输和接收。在波形生成过程中,示例将图像编码并打包到无线电帧中。然后,在接收时,本例从接收到的LTE波形解码图像。

简介

LTE工具箱™生成符合标准的基带IQ下行和上行参考测量通道(RMC)波形和下行测试模型(E-TM)波形。使用SDR,如基于Xilinx®Zynq®的无线电,您可以调制这些波形进行射频传输和接收。

本示例导入一个图像文件,并将其打包到使用LTE工具箱生成的基带RMC波形的多个无线电帧中。该示例通过使用受支持SDR的重复传输功能来创建连续的RF LTE波形。金宝app重复传输功能将基带RMC波形传输到SDR上的硬件存储器,并在空中无间隙连续传输波形。如果您使用能够多通道传输和接收的SDR设备,本示例将使用LTE传输分集生成并传输多天线LTE波形。

该示例通过使用相同的SDR捕获结果波形。如果您有适当的硬件,本例将在接收机中使用多通道接收。

本例支持这些sdr。金宝app

  • ADALM-Pluto来自模拟设备通信工具箱支持包ADALM-Pluto无线电金宝app

  • USRP™嵌入式系列无线电的通信工具箱支持包中的USRP™E310/E312金宝app

  • Xilinx®Zynq®基于无线电的通信工具箱支持包中的AD936x/FMCOMMS5金宝app

或者,如果SDR不可用,本例支持模拟加性高斯白噪声(AWGN)信道或将波形直接传递到解码阶段而不受损害。金宝app

示例设置

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

  • OverTheAir:使用SDR收发LTE波形

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

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

频道=“GaussianNoise”

如果你设置通道OverTheAir,配置发射增益和中心频率,并设置设备名称兑换为所需的特别提款权:

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

  • 设置为E3xx使用USRP嵌入式系列无线电

  • 设置为AD936xFMCOMMS5使用Xilinx zynq无线电

如果你设置频道为GaussianNoise,设置接收波形的信噪比。

如果频道= =“OverTheAir”设备名称=“冥王星”;centerFrequency =2200000000;txGain =-10elseif频道= =“GaussianNoise”指定模拟信道接收信号的信噪比信噪比=20.结束

为LTE波形生成配置这些参数。

txsim。RC =“R.7”%基本RMC配置,10mhz带宽txsim。NCellID =88细胞标识txsim。NFrame =700初始帧数txsim。NumAntennas =1发送和接收天线数量%

配置示例的所有作用域和图。

为图像图设置一个句柄。

如果~ (“imFig”“var”) || ~把手(imFig) imFig =图;imFig。NumberTitle =“关闭”;imFig。Name =“阴谋”形象;imFig。可见=“关闭”其他的clf (imFig);%清晰数字imFig。可见=“关闭”结束

为通道估计图设置一个句柄。

如果~ (“hh”“var”|| ~把手(hest) hest =数字(“可见”“关闭”);hh。NumberTitle =“关闭”;hh。Name =“信道估计”其他的clf (hh);%清晰数字hh。可见=“关闭”结束

在后面的示例中设置一个频谱范围以查看接收到的波形。

光谱分析仪(...SpectrumType =“能量密度”...Title =“接收基带LTE信号频谱”...YLabel =“功率谱密度”...ShowLegend = true);

为均衡物理下行链路共享信道(PDSCH)符号设置星座图查看器。

星座= com . constellationdiagram(标题=均衡PDSCH符号...ShowReferenceConstellation = false);

确定并设置本例中所有图形的位置。

[positionsValid,positions] = hPlotPositions;如果positionsValid imFig。位置=位置(5,:);hh。位置=位置(1,:);spectrumScope。位置=位置(6,:);星座。位置=位置(3,:);结束

发射机设计:系统架构

LTE发射机的总体结构由以下步骤组成:

  1. 导入并将图像转换为二进制数据流。

  2. 使用LTE工具箱生成基带LTE信号,将二进制数据流打包到下行共享信道(DL-SCH)的传输块中。

  3. 如果使用SDR,请使用SDR硬件准备用于传输的基带信号,并将基带数据发送到SDR,以便在所需的中心频率上连续传输。

准备镜像文件

该示例从图像文件读取数据,将其缩放以进行传输,并将其转换为二进制数据流。传输图像的大小直接影响传输图像数据所需的LTE无线电帧数。的比例因子0.5需要5次LTE无线电帧传输。增加缩放因子会产生更多的帧传输。减小缩放因子可以减少帧数。

指定映像文件名称及其缩放因子。

fileTx =“peppers.png”%镜像文件名规模=0.5%图像缩放因子

导入指定的图像文件并将其转换为二进制流。

fData = imread(fileTx);从文件中读取映像数据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);存储新的图像大小binData = dec2bin(fData(:),8);转换为8位无符号二进制trData =重塑((binData- .' 0 ')。1[])。”;%创建二进制流

使用先前为图像图创建的句柄,显示传输图像。在本例后面,如果LTE波形被成功解码,则接收图像显示在传输图像下方。

%绘图传输图像图(imFig);imFig。可见=“上”;次要情节(211);imshow (fData);标题(“传播形象”);次要情节(212);标题(“接收到的图像将出现在这里……”);集(gca),“可见”“关闭”);%隐藏轴

{

甘氨胆酸组(findall (,“类型”“文本”),“可见”“上”);%取消隐藏标题

生成基带LTE信号

使用lteRMCDL(LTE工具箱)函数生成TS36.101附录A.3中定义的RMC的默认配置参数[1].配置结构中的参数rmc允许根据需要进行定制。

rmc = lteRMCDL(txsim.RC);

根据图像数据的大小计算所需的LTE帧数。

trBlkSize = rmc.PDSCH.TrBlkSizes;txsim。TotFrames = ceil(numel(trData)/sum(trBlkSize(:)));

自定义RMC参数

rmc。NCellID = txsim.NCellID;rmc。NFrame = txsim.NFrame;rmc。TotSubframes = txsim.TotFrames*10;每帧10个子帧rmc。CellRefP = txsim.NumAntennas;配置单元参考端口数rmc.PDSCH.RVSeq = 0;

用虚拟数据填充子帧5。

rmc。OCNGPDSCHEnable =“上”;rmc。OCNGPDCCHEnable =“上”

如果在两个或多个通道上传输,启用发送分集。

如果rmc。CellRefP >= 2 rmc.PDSCH.TxScheme =“TxDiversity”;rmc.OCNGPDSCH.TxScheme =“TxDiversity”其他的rmc.PDSCH.TxScheme =“Port0”;rmc.OCNGPDSCH.TxScheme =“Port0”结束rmc.PDSCH.NLayers = txsim.NumAntennas;流(“\n生成LTE传输波形:\n”+...“将图像数据打包到%d帧(s).\n\n”, txsim.TotFrames);
生成LTE传输波形:将图像数据打包成5帧(s)。

使用lteRMCDLTool(LTE工具箱)为了产生基带波形,eNodeBOutput,一个完整的资源网格,txGrid,以及RMC的完整配置。该工具获取二进制流,trData,从输入图像文件创建,并将其打包到PDSCH中的多个传输块中。

将图像数据打包到一个LTE帧中。[eNodeBOutput,txGrid,rmc] = lteRMCDLTool(rmc,trData);

传输LTE波形

如果使用SDR,请创建一个sdrTransmitter对象使用sdrtx函数。将中心频率、采样率、增益和信道配置设置为相应的属性sdrTransmitter对象。然后,使用transmitRepeat将基带LTE传输传输到SDR平台进行连续传输。

如果频道= =“OverTheAir”发射机属性sdrTransmitter = sdrtx(deviceName);sdrTransmitter。BasebandSampleRate = rmc.SamplingRate;% 15.36 MHz为默认RMC (R.7),带宽为10 MHzsdrTransmitter。中心频率=中心频率;sdrTransmitter。增益= tx增益;sdrTransmitter。ChannelMapping = 1:txsim.NumAntennas;将SDR I/O直接传递给Zynq Radio或USRP上的主机跳过FPGA嵌入式系列无线电如果设备名称~ =“冥王星”sdrTransmitter。ShowAdvancedProperties = true;sdrTransmitter。BypassUserLogic = true;结束流(“\n生成LTE传输波形:\n”缩放归一化信号以避免RF级饱和powerScaleFactor = 0.8;eNodeBOutput = eNodeBOutput.*(1./max(abs(eNodeBOutput))*powerScaleFactor);发射射频波形transmitRepeat (sdrTransmitter eNodeBOutput);结束

接收机设计:系统架构

LTE接收机的总体结构由以下步骤组成:

  1. 如果使用SDR,则捕获传输的LTE信号的适当帧数。否则,应用AWGN到eNodeBOutput或不适用减值。

  2. 确定并修正接收信号的频率偏移。

  3. 将捕获的信号同步到LTE帧的开始。

  4. OFDM对接收到的信号进行解调,得到LTE资源网格。

  5. 对接收到的信号进行信道估计。

  6. 解码PDSCH和DL-SCH,从每个无线电帧的传输块中获得传输数据。

  7. 重新组合接收到的传输块数据,形成接收到的图像。

这个示例绘制了捕获波形的功率谱密度,并显示了估计通道、均衡的PDSCH符号和接收到的图像的可视化。

设立SDR接收器

捕获比传输多一个LTE帧,以允许接收机处理中的时序偏移环绕。

framesPerCapture = txsim.TotFrames+1;要捕获的LTE帧数。captureTime = framesPerCapture * 10e-3;捕获时间(秒)

为用于图像传输的设备创建具有指定属性的SDR接收器系统对象。接收机的采样率为15.36MHz,这是LTE带宽为50个资源块时的标准采样率。50rbs相当于10mhz的信号带宽。

如果频道= =“OverTheAir”sdrReceiver = sdrrx(deviceName);sdrReceiver。BasebandSampleRate = sdrTransmitter.BasebandSampleRate;sdrReceiver。CenterFrequency = sdrTransmitter.CenterFrequency;sdrReceiver。OutputDataType =“替身”;sdrReceiver。ChannelMapping = 1:txsim.NumAntennas;如果设备名称~ =“冥王星”sdrReceiver。ShowAdvancedProperties = true;sdrReceiver。BypassUserLogic = true;结束流(“开始一个新的射频捕获。”) rx波形=捕获(sdrReceiver,captureTime,“秒”);elseif频道= =“GaussianNoise”rx波形= awgn(eNodeBOutput,SNR,“测量”);其他的%无损伤rx波形= eNodeBOutput;结束

显示捕获波形的功率谱密度。

spectrumScope。SampleRate = rmc.SamplingRate;spectrumScope (rxWaveform);发行版(spectrumScope)

设置LTE接收机

该示例通过假设传输的PDSCH属性是已知的来简化LTE信号接收。

假设FDD双工模式和一个正常的循环前缀长度,以及四个单元特定的参考端口(CellRefP)用于主信息块(MIB)解码。MIB提供实际CellRefP的个数。

enb。PDSCH = rmc.PDSCH;enb。DuplexMode =“FDD”;enb。CyclicPrefix =“正常”;enb。CellRefP = 4;

信号的采样率控制捕获的带宽。使用所选的采样率从查找表中获取RBs的数量。

%带宽:{1.4 3 5 10 20}MHzSampleRateLUT = [1.92 3.84 7.68 15.36 30.72]*1e6;Ndlrblut = [6 15 25 50 100];enb。NDLRB = NDLRBLUT(SampleRateLUT==rmc.SamplingRate);如果isempty (enb.NDLRB)错误(“不支持采样率。金宝app金宝app支持的速率是%s。”...“1.92 MHz, 3.84 MHz, 7.68 MHz, 15.36 MHz, 30.72 MHz”);结束

配置信道估计,使用特定于小区的参考信号来执行。一个9乘9的平均窗口将噪声的影响最小化。

信道估计配置结构cec。PilotAverage =“UserDefined”导频符号平均的类型cec。FreqWindow = 9;%频率窗口大小在REscec。TimeWindow = 9;%时间窗口大小在REscec。InterpType =“立方”% 2D插值类型cec。InterpWindow =“中心”插补窗口类型cec。InterpWinSize = 3;插值窗口大小%

过程捕获信号

由于LTE波形以循环的方式在空中连续传输,因此接收器捕获的第一帧不能保证是第一传输帧。这意味着帧可能会按顺序被解码。为了使接收到的帧能够按照正确的顺序重新组合,它们的帧号必须确定。MIB包含当前系统帧号的信息,因此需要对其进行解码。在确定帧号之后,本例解码PDSCH和DL-SCH并显示均衡后的PDSCH符号。在子帧5中不传输数据;因此,解码时忽略子帧捕获的数据。

当LTE帧已成功解码时,该示例将逐帧显示检测到的帧号以及每个子帧的均衡PDSCH符号星座。该示例还显示每帧单元参考点0和接收天线之间的信道幅值频率响应的估计。

对已知单元ID执行频率偏移校正。

frequencyOffset = lteFrequencyOffset(enb, rx波形);rx波形= lteFrequencyCorrect(enb, rx波形,frequencyOffset);流("\n修正了%i Hz的频率偏移。\n"frequencyOffset)
修正了-2.447074e+00 Hz的频率偏移。

执行盲小区搜索以获得小区身份和定时偏移。使用“PostFFT”SSS检测方法提高检测速度。

cellSearch。SSSDetection =“PostFFT”;cellSearch。MaxCellCount = 1;[NCellID,frameOffset] = lteCellSearch(enb, rx波形,cellSearch);enb。NCellID = NCellID;流("检测到单元格标识%i.\n", NCellID);
检测到88的单元格标识。

将捕获的样本同步到LTE帧的开始,并删除不完整帧的任何样本。

rx波形= rx波形(frameOffset+1:end,:);samplesPerFrame = 10e-3*rmc.SamplingRate;% LTE帧周期为10毫秒tailSamples = mod(length(rx波形),samplesPerFrame);rx波形= rx波形(1:end-tailSamples,:);enb。NSubframe = 0;流("修正了%i个样本的时间偏移。\n"frameOffset)
修正了0个样本的定时偏移。

OFDM解调波形并对4个小区特定参考端口进行信道估计,因为eNodeB的小区特定参考端口是未知的。

rxGrid = lteOFDMDemodulate(enb, rx波形);[hest,nest] = lteDLChannelEstimate(enb,cec,rxGrid);sfDims = lteResourceGridSize(enb);Lsf = sfDims(2);每子帧的OFDM符号的百分比LFrame = 10*Lsf;每帧OFDM符号的百分比numFullFrames = length(rx波形)/samplesPerFrame;

初始化这些变量以处理接收到的帧。

rxDataFrame = 0 (sum(enb.PDSCH.TrBlkSizes(:)),numFullFrames);recFrames = 0 (numFullFrames,1);rxSymbols = [];txSymbols = [];

对于每一帧,解码MIB、PDSCH和DL-SCH。

帧= 0:(numFullFrames-1) fprintf(\n对帧%i的帧%i执行DL-SCH解码...框架+ 1,numFullFrames)从接收到的资源网格的每一帧中提取子帧#0%和渠道估算。enb。NSubframe = 0;rxsf = rxGrid(:,frame*LFrame+(1:Lsf),:);hestsf = hest(:,frame*LFrame+(1:Lsf),:,:);% PBCH解调。提取资源元素(REs)%对应于接收网格和通道中的PBCH%估计网格解调。enb。CellRefP = 4;pbchIndices = ltePBCHIndices(enb);[pbchRx,pbchHest] = lteExtractResources(pbchIndices,rxsf,hestsf);[~,~,nfmod4,mib,CellRefP] = ltePBCHDecode(enb,pbchRx, pbchest,nest);%如果PBCH解码成功CellRefP~=0,则更新信息如果~ CellRefP流(“帧未检测到PBCH。\n”);继续结束enb。CellRefP = CellRefP;解码MIB以获得当前帧号enb = ltimib (mib,enb);结合函数输出的nfmod4值% ltePBCHDecode,作为从MIB建立的NFrame值%是系统帧数对4的模。enb。NFrame = enb.NFrame+nfmod4;流(" MIB解码成功。\n")流("帧号:%d.\n", enb.NFrame);存储接收的帧号recFrames(frame+1) = enb.NFrame;处理帧内的子帧(忽略子帧5)Sf = 0:9如果科幻小说~ = 5忽略子帧5提取子帧enb。NSubframe = sf;rxsf = rxGrid(:,frame*LFrame+sf*Lsf+(1:Lsf),:);使用CellRefP的正确数目执行信道估计[hestsf,nestsf] = lteDLChannelEstimate(enb,cec,rxsf);物理控制格式指示通道(PCFICH)%解调。从中提取PCFICH对应的REs%用于解调的接收网格和信道估计。pcfichIndices = ltePCFICHIndices(enb);[pcfichRx, pcfichest] = lteExtractResources(pcfichices,rxsf,hestsf);[cfiBits,recsym] = ltePCFICHDecode(enb,pcfichRx, pcfichest,nestsf);控制格式指示符(CFI)解码enb。CFI = lteCFIDecode(cfiBits);%获取PDSCH指数[pdschIndices,pdschIndicesInfo] = ltePDSCHIndices(enb, enb.)PDSCH enb.PDSCH.PRBSet);[pdschRx, pdschHest] = lteExtractResources(pdschIndices, rxsf, hestsf);%执行解编码,层反映射,解调和%对接收到的数据使用的估计解码器%通道[rxEncodedBits, rxEncodedSymb] = ltePDSCHDecode(enb,enb.)PDSCH pdschRx,...pdschHest nestsf);将解码的符号附加到流rxSymbols = [rxSymbols;rxEncodedSymb {}):;% #好< AGROW >%传输块大小outLen = enb.PDSCH.TrBlkSizes(enb.NSubframe+1);解码下行链路共享信道(DL-SCH)[decbits{sf+1}, blkcrc(sf+1)] = lteDLSCHDecode(enb,enb。PDSCH,...outLen rxEncodedBits);% #好< SAGROW >%重新编码传输的PDSCH符号用于EVM计算%编码传输的DLSCHtxRecode = lttedlsch (enb,enb. pdsch,pdschIndicesInfo.G,decbits{sf+1});调制传输PDSCHtxRemod = ltePDSCH(enb, enb。PDSCH txRecode);解码传输的PDSCH[~,refSymbols] = ltePDSCHDecode(enb, enb.)PDSCH txRemod);将编码符号添加到流中txSymbols = [txSymbols;refSymbols {}):;% #好< AGROW >星座(rxEncodedSymb {:});%图当前星座释放(星座);释放先前的星座图结束结束重新组合已解码的位流(“检索解码传输块数据。\n”);Rxdata = [];I = 1:长度(十位)如果我~ = 6忽略子帧5Rxdata = [Rxdata;decbits{我}{}):;% #好< AGROW >结束结束存储接收帧中的数据rxDataFrame(:,frame+1) = rxdata;绘制cellrefp0和接收天线之间的信道估计focalFrameIdx = frame*LFrame+(1:LFrame);图(hh);hh。可见=“上”;focalFrameIdx冲浪(abs(命令(:,1,1)));阴影;包含(OFDM符号索引);ylabel (“副载波指数”);zlabel (“级”);标题(《信道幅值频率响应估计》);结束
对burst中5帧中的第1帧执行DL-SCH Decode:
成功解码MIB。
帧数:700。
检索已解码的传输块数据。
对burst中5帧中的第2帧执行DL-SCH Decode:
成功解码MIB。
帧号:701。
检索已解码的传输块数据。
对burst中5帧中的第3帧执行DL-SCH Decode:
成功解码MIB。
帧数:702。
检索已解码的传输块数据。
对burst中5帧中的第4帧执行DL-SCH Decode:
成功解码MIB。
帧数:703。
检索已解码的传输块数据。
对burst中5帧中的5帧执行DL-SCH Decode:
成功解码MIB。
帧数:704。

检索已解码的传输块数据。

{

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

结果确认与显示

为了确定接收数据的质量,该示例计算传输数据和接收数据之间的误码率(BER)。接收到的数据转换成图像。

确定第一个传输帧的索引(最低接收帧数)。

[~,frameIdx] = min(recFrames);

初始化这些变量进行图像重建。

decodedRxDataStream = 0 (length(rxDataFrame(:)),1);frameLen = size(rxDataFrame,1);

将接收到的数据块(按正确顺序)重新组合成连续的流。

currFrame = mod(frameIdx-1,numFullFrames)+1;获取当前帧索引decodedRxDataStream((n-1)*frameLen+1:n*frameLen) = rxDataFrame(:,currFrame);frameIdx = frameIdx+1;增量帧索引结束

通过“系统对象”的EVM和误码率,可以计算出解码后数据的EVM和误码率。

如果~isempty(rxSymbols) evmCalculator = com . evm ();evmCalculator。MaximumEVMOutputPort = true;[evm.RMS,维生素。Peak] = evmCalculator(txSymbols, rxSymbols);流(" EVM峰值= %0.3f%%\n", evm.Peak);流(" EVM RMS = %0.3f%%\n", evm.RMS);%进行误码率(BER)计算bitErrorRate = com . errorrate;err = bitErrorRate(decodedRxDataStream(1:length(trData)), trData);流("误码率(BER) = %0.5f.\n",犯错(1));流("误码数= %d.\n"犯错(2));流("传输比特数= %d.\n"长度(trData));其他的流(“未解码传输块。\n”);结束
EVM峰值= 33.306%
Evm RMS = 8.429%
误码率(BER) = 0.00000。
误码数= 0。
传输比特数= 1179648。

根据接收到的数据重新创建映像。

STR =重塑(sprintf(' % d ',decodedRxDataStream(1:length(trData))), 8, []).';Decdata = uint8(bin2dec(str));receivedImage =重塑(decdata,imsize);如果存在(“imFig”“var”&&把手(imFig)%如果TX图形打开图(imFig);次要情节(212);其他的图;次要情节(212);结束imshow (receivedImage);标题(sprintf ("接收图像:%dx%d天线配置", txsim。NumAntennas txsim.NumAntennas));

{

进一步的探索

  • 如果使用SDR,请尝试降低发射器增益以损害接收图像的质量并增加误码的数量。否则,降低信噪比(信噪比).

  • 如果使用受支持的多通道金宝appSDR,请尝试增加天线数量(txsim。NumAntennas),以了解使用多通道传输的好处。

特别提款权故障排除

选定的参考书目

  1. 3gpp ts 36.101。用户设备(UE)无线电发射和接收。第三代伙伴计划;技术规范集团无线接入网;改进的通用地面无线电接入(E-UTRA)。