主要内容

5G NR波形采集与分析

此示例显示了如何使用5G波形发生器(5 g工具箱)应用程序并将生成的波形下载到Keysight™矢量信号发生器,用于使用仪器控制工具箱™软件过空中传输。该示例然后使用Keysight信号分析器捕获发送的过空中信号,并分析MATLAB®中的信号。

介绍

本例使用5G波形发生器app,下载波形并将其传输到击键矢量信号发生器,然后使用击键信号分析仪接收波形,以便在MATLAB中进行波形分析。此图显示了一般工作流程。

要求

要运行此示例,您需要以下工具:

  • Keysight E4438C ESG矢量信号发生器

  • Keysight N9030A PXA信号分析仪

使用5G波形发生器App生成基带波形

在MATLAB中,在应用选项卡,单击5G波形发生器应用程序。

波形类型部分,单击NR测试模型。在应用程序的最左边窗格中,您可以设置所选波形的参数。对于这个示例:

  • 频率范围作为FR1 (410 MHz - 7.125 GHz)

  • 测试模型作为NR-FR1-TM3.1(全频带、均匀64QAM)

  • 信道带宽(MHz)作为10.

  • 子载波间隔(kHz)作为30.

  • 双工模式作为FDD

在应用程序工具条上,单击产生

%设置接收器的NR-TM参数nrtm =“NR-FR1-TM3.1”%参考信道BW =“10 mhz”%通道带宽scs=“30khz”%副载波间距DM =“FDD”%双工模式

此图显示了在基带可见的10 MHz 5G NR波形。

发射无线信号

通过一个支持的通信接口(需要仪表控制工具箱)将生成的信号下载到RF信号发生器。应用程序会自动查找通过TCP/IP接口连接的信号发生器。在金宝app发射机在应用程序的选项卡上,选择安捷伦/按键信号发生器SCPI司机列表。设置中心频率(GHz)参数到3.4输出功率(dBm)参数到-15.该应用自动从生成的波形获取基带采样率。要启动传输,请单击发送在工具条中。

通过TCP/IP从信号分析仪读取IQ数据

要将同相和正交(IQ)数据读入MATLAB进行分析,使用Instrument Control Toolbox软件配置Keysight N9030A信号分析仪。

根据测量的信号定义仪器配置参数。

%设置频谱分析仪参数centerFrequency = 3.4 e9;sampleRate = 15.36 e6;measurementTime = 20 e - 3;mechanicalAttenuation = 0;% dBstartFrequency = 3.39 e9;stopFrequency = 3.41 e9;resolutionBandwidth = 220年e3;videoBandwidth = 220000;

在连接频谱分析仪之前,请执行这些步骤。

  • 找到Keysight N9030A信号分析器的资源ID。

  • 使用虚拟仪器软件架构(VISA)接口连接仪器。

  • 调整输入缓冲区大小以保存仪器返回的数据。

  • 设置超时时间,以便有足够的时间进行测量和数据传输。

foundVISA = visadevlist;resourceID = foundVISA (foundVISA。模型= =“N9030A”、:).ResourceName;resourceID = resourceID(包含(resourceID,“N9030A”));%提取resourceID,其中包含“N9030A”sigAnalyzerObj = visadev (resourceID);sigAnalyzerObj。ByteOrder =“Big-Endian”;configurecallback(siganalyzerobj,“字节”85 e6, sigAnalyzerObj @callbackFcn)。超时= 20;

使用适当的可编程仪器(SCPI)标准命令将仪器复位到已知状态。查询仪器标识,确保正确连接仪器。

写道(Siganalyzerobj,“*RST”);instrumentInfo = writeread (sigAnalyzerObj,“* IDN ?”); fprintf(“仪器识别信息:%s”, instrumentInfo);
仪器识别信息:Agilent Technologies,N9030A,US00071181,A.14.16

X系列信号和频谱分析仪执行IQ测量和频谱测量。在本例中,您将获取时域IQ数据,使用MATLAB可视化数据,并对获取的数据执行信号分析。测量完成后,SCPI命令配置仪器并定义数据传输的格式。

%将信号分析仪模式设置为基本IQ模式写道(Siganalyzerobj,“:仪器:选择基本”);%设置中心频率writeline (sigAnalyzerObj strcat (“:感觉:频率:中心”num2str (centerFrequency)));%设置捕获采样率writeline (sigAnalyzerObj strcat (”:意义:波形:SRATe”,num2str(samplege))));%关闭平均值写道(Siganalyzerobj,”:意义:波形:断言“);%设置频谱分析仪在触发线走高后进行一次测量写道(Siganalyzerobj,“:init:cout”);%使用正斜率触发将触发器设置为外部源1写道(Siganalyzerobj,“:触发:波形:源即时”);写道(Siganalyzerobj,“:触发:线路:斜坡正面”);%设置需要进行测量的时间writeline (sigAnalyzerObj strcat (”:波形:理念:时间”,num2str(measurementTime));%关闭电气衰减写道(Siganalyzerobj,“:感测:电源:射频:电状态:关闭”);设置机械衰减等级writeline (sigAnalyzerObj strcat (”:意义:力量:射频:衰减”num2str (mechanicalAttenuation)));将IQ信号调至自动写道(Siganalyzerobj,”:意义:电压:智商:范围:汽车”);%设置返回数据的结尾写道(Siganalyzerobj,“:格式:边框正常”);%设置返回数据的格式写道(Siganalyzerobj,:格式:数据实数,64);

触发仪器进行测量。等待测量操作完成,然后读取波形。在处理数据之前,将I和Q分量与从仪器接收的交错数据分开并在MATLAB中创建复杂向量。

触发仪器并启动测量写道(Siganalyzerobj,“*丹”);写道(Siganalyzerobj,“:发起:波形”);%等待度量操作完成measureComplete = writeread (sigAnalyzerObj,“* OPC ?”);%读取IQ数据写道(Siganalyzerobj,“:读:Wav0?”);data = readbinblock(siganalyzerobj,“双倍”);%单独的数据并构建复杂的IQ向量inphase =数据(1:2:结束);quadrature =数据(2:2:结束);rxwaveform = inphase + 1i *正交;

捕获并显示有关最近获取的数据的信息。

写道(Siganalyzerobj,“:获取:WAV1?”);signalSpec = readbinblock (sigAnalyzerObj,“双倍”);%显示测量信息captureSampleRate=1/信号规格(1);fprintf(“采样率(Hz)=%s”,num2str(捕获量));
采样率(Hz)= 15360000
流(“点数读数=%s”,num2str(signalpec(4)));
读数= 307201的点数
流(“信号的最大值(dBm)=%s”num2str (signalSpec (6)));
信号最大值(dBm)=-39.0019
流(“信号的最小值(dBm)=%s”num2str (signalSpec (7)));
MIN值的信号(DBM)= -107.9755

绘制采集波形的频谱,以确认接收信号的带宽。

%确保rx波形是列向量如果~iscolumn(rxWaveform)rxWaveform=rxWaveform';结束%绘制采集信号的功率谱密度(PSD)spectrumPlotRx = dsp.SpectrumAnalyzer;spectrumPlotRx。SampleRate = captureSampleRate;spectrumPlotRx。SpectrumType =“功率密度”;spectrumPlotRx。PowerUnits =“dBm”;spectrumPlotRx.Window=“哈明”;spectrumPlotRx。SpectralAverages = 10;spectrumPlotRx。YLimits = [-140 -90];spectrumPlotRx。YLabel =“PSD”;spectumplotrx.showlegend = false;spectumplotrx.title =“接收信号频谱:10 MHz 5G NR-TM波形”;SpectRumplotrx(rxwaveform);

将仪器切换到Spectrum Analyzer模式,并在信号分析仪上的视图比较Matlab中生成的频谱视图。使用其他SCPI命令配置仪器测量和显示设置。

%切换回频谱分析仪视图写道(Siganalyzerobj,“:仪器:选择SA”);设置机械衰减等级writeline (sigAnalyzerObj strcat (”:意义:力量:射频:衰减”num2str (mechanicalAttenuation)));%设置中心频率、RBW、VBWwriteline (sigAnalyzerObj strcat (“:感觉:频率:中心”num2str (centerFrequency)));writeline (sigAnalyzerObj strcat (”:意义:频率:开始”,num2str(Startfice))));writeline (sigAnalyzerObj strcat (“:感觉:频率:停止”,num2str(stopfrequency))));writeline (sigAnalyzerObj strcat (”:意义:带宽:决议”num2str (resolutionBandwidth)));writeline (sigAnalyzerObj strcat (“:感觉:带宽:视频”,num2str(视频带宽);%在频谱分析仪上允许连续测量写道(Siganalyzerobj,“:init:cont”);开始接收无线信号写道(Siganalyzerobj,“*丹”);

对于仪器清理,清除仪器连接:

清晰的sigAnalyzerObj

要停止5G NR-TM波形传输,请在仪器在App ToolStrip上的部分,单击停止传输

对接收的5G波形进行测量

使用generateWaveform的函数HNReferenceWaveFormGenerator帮助文件,用于提取特定TM的波形信息。

tmwavegen = hNRReferenceWaveformGenerator (scs nrtm, bw, dm);[~, tmwaveinfo resourcesInfo] = generateWaveform (tmwavegen);

基于解调参考符号(DM-RS)的粗频偏补偿

在1 kHz到100 kHz的增量中寻找偏移。

频率校正范围=-100e3:1e3:100e3;[RX波形,粗略偏移]=DMRS频率校正(RX波形,captureSampleRate,频率校正范围,tmwavegen,resourcesInfo);fprintf(“粗略频率偏移=%.0f Hz”coarseOffset)
粗频偏= 0hz

基于DM-RS的精细频偏补偿

寻找以5hz到100hz为增量的偏移量

频率校准= -100:5:100;[rxwaveform,fineoffset] = dmrsfrequencycorrection(rxwaveform,capturesamplerate,surforcorectrange,tmwavegen,resourcesinfo);流("精细频率偏移= %。1 f赫兹”,fineoffset)
精细频率偏移= -30.0 Hz

维生素与测量

使用hNRPDSCHEVM函数分析波形。该函数执行这些步骤。

  • 通过一帧频分双工(FDD)同步DM-RS (TDD)

  • 解调接收的波形

  • 估计通道

  • 均衡符号

  • 常见相位误差(CPE)的估计和补偿

的配置设置hNRPDSCHEVM函数。

cfg = struct();cfg.plotevm = true;%绘图EVM统计数据cfg.DisplayEVM=true;%打印EVM统计数据cfg。标签= nrtm;%设置为捕获波形的TM名称cfg。SampleRate = captureSampleRate;捕获期间使用采样率[evminfo,eqsym,recsym] = hnrpdschevm(tmwavegen.config,rxwaveform,cfg);
RMS维生素,维生素,峰值位置0:2.848 - 19.257% RMS维生素,维生素,峰值位置1:2.829 - 15.633% RMS维生素,维生素,槽2:2.812 - 15.226% RMS维生素,维生素,峰值位置3:2.864 - 14.929% RMS维生素,维生素,槽4:2.932 - 14.695% RMS维生素,维生素,槽5:2.934 - 16.210% RMS维生素,维生素,槽6:2.835 - 17.239% RMS维生素,维生素,槽7:2.897 - 16.520% RMS维生素,维生素,槽8:2.924 - 16.450% RMS维生素,维生素,槽9:2.883 - 16.497% RMS维生素,维生素,槽10:2.889 - 17.794% RMS维生素,维生素,槽11:2.853 - 16.835% RMS维生素,维生素,槽12:2.860 - 19.586% RMS维生素,维生素,插槽13:2.908 - 16.476% RMS维生素,维生素,插槽14:2.947 - 17.077% RMS维生素,维生素,槽15:2.950 15.162% RMS EVM,峰值EVM,槽位16:2.940 20.989% RMS EVM,峰值EVM,槽位17:2.927 16.974% RMS EVM,峰值EVM,槽位18:2.876 14.606% RMS EVM,峰值EVM,槽位19:2.860 19.478%平均RMS EVM帧0:2.889%平均总体RMS EVM: 2.889%总体峰值EVM = 20.9891%

测试结果表明,对接收波形的解调是成功的。频谱分析仪的直流分量对直流副载波的干扰导致测量中的高EVM值。

局部函数

这些功能有助于处理所接收的5G波形。

作用[correctedWaveform, appliedFrequencyCorrection] = DMRSFrequencyCorrection(波形、sampleRate frequencyCorrectionRange, tmwavegen, resourcesInfo)%波形-要校正的波形。需要是Nx1列向量。% sampleRate -波形的采样率% frequencyCorrectioRange -频率的范围和粒度检查修正百分比%tmwavegen和generationswaveform方法的输出[pdschArray, ~,航母]= hListTargetPDSCHs (tmwavegen.Config resourcesInfo.WaveformResources);bwpCfg = tmwavegen.Config.BandwidthParts {1};nSlots = carrier.SlotsPerFrame;%生成一个跨越10毫秒(一帧)的参考网格。此网格%只包含DM-RS,用于同步。refrovrid =参考奖励(载波,bwpcfg,pdscharray,nslots);按规定对波形施加频率偏移%FREUQNECY校正范围。nSamples =(0:长度(波形)1)';frequencyShift =(2 *π* frequencyCorrectionRange。* nSamples)。/ sampleRate;%每个列表示偏移波形。offsetWaveforms =波形。* exp (1 j * frequencyShift);(~, mag) = nrTimingEstimate (offsetWaveforms载体。NSizeGrid,......母舰。SubcarrierSpacing、nSlots refGrid,......“SampleRate”,取样器);%找到DM-RS相关的频率在最大值。[~,指数]=max(max(mag));appliedFrequencyCorrection=频率校正范围(索引);校正波形=偏移波形(:,索引);结束作用refrovrid =参考奖励(载波,bwpcfg,pdscharray,nslots)%创建所需插槽数量的参考网格。网格%包含pdscharray中指定的DM-RS符号。功能%返回尺寸K-by-S-by-L的参照网格,其中K是大小载波的子载波%。NSizeGrid,S is the number of symbols%跨越nslots,l是图层的数量。nsubcarriers = carrier.nsizegrid * 12;l = carrier.symbolsperslot * nslots;%参考网格中的OFDM符号数nlayers = size(pdscharray(1).resources(1).channelindices,2);bwpstart = bwpcfg.nstartbwp;bwplen = bwpcfg.nsizebwp;refrovrid =零(nsubcarriers,l,nlayers);%空网格BwpGrid =零(BWPLEN * 12,L,NLayers);rbsperslot = bwplen * 12 * carrier.symbolsperslot;%在所有插槽的参考网格中填充DM-RS符号。放置在运营商网格(在适当位置)中的%BWPGrid% BWP大小与载波网格不相同slotidx = carrier.nslot +(0:nslots-1)[〜,〜,dmrsindices,dmrssymbols] = hslotresources(pdscharray,slotidx);如果~ isempty (dmrsIndices)layerIdx=1:nLayers如果layerIdx<=大小(dmrsIndices,2)dmrsIndices(:,layerIdx)=dmrsIndices(:,layerIdx)-rbsPerSlot*(layerIdx-1)+(L*bwpLen*12*(layerIdx-1));bwpGrid(dmrsIndices(:,layerIdx)+(slotIdx carrier.NSlot)*rbsPerSlot)=dmrsSymbols(:,layerIdx);结束结束refrovrid(12 * bwpstart + 1:12 *(bwpstart + bwpplen),:,:) = bwpgrid;结束结束结束