主要内容

LTE数字下变频的HDL实现

此示例显示如何为诸如LTE的无线电通信应用程序设计数字下变频器(DDC),并使用HDL Coder™生成HDL码。

介绍

ddc广泛应用于数字通信接收机中,用于将射频(RF)或中频(IF)信号转换为基带。DDC操作将信号转移到一个较低的频率,并降低其采样率,以方便后续处理阶段。这里提出的DDC执行复杂的频率变换,然后使用一个4级滤波器链进行采样率转换。本示例首先使用浮点型DSP系统工具箱™函数设计DDC。然后将每个阶段转换为定点,然后在Simulink®模型中使用,生成可合成的HDL代码。万博1manbetx使用两个测试信号来演示和验证DDC操作:

  1. 如果载体调制到32MHz上的正弦曲线。

  2. LTE下行链路信号,带宽为1.4 MHz,如果载波调制到32 MHz。

本示例测量浮点DDCs和定点DDCs输出的信号质量,并对两者进行比较。最后给出了FPGA实现结果。

注意:这个例子使用DDCTestUtils,一个包含用于生成刺激功能的辅助类和分析DDC输出的功能。看看ddctestutils.m.文件更多信息。

监护系统结构

DDC由一个数控振荡器(NCO),一个混频器和一个抽取滤波器链组成。该滤波器链由一个CIC抽取器、CIC增益校正器、CIC补偿抽取器(FIR)、半带FIR抽取器和最后FIR抽取器组成。该滤波器链的整体响应与相同规格的单个抽取滤波器的响应相当,但是,将滤波器分成多个抽取级可以使用更少的硬件资源,从而实现更高效的设计。CIC抽取器提供了一个大的初始抽取因子,这使得后续过滤器能够以较低的速率工作。CIC补偿decimator通过补偿CIC的下降而提高频谱响应,同时抽取2。半频带是一个中间小数,而最终小数实现精确成就FstopDDC特性。由于较低的采样率,靠近链末端的滤波器可以通过共享乘数来优化资源使用。DDC的框图如下所示。

DDC的输入在122.88 MSPS上采样,而输出采样率为1.92 MSP。因此,整体抽取因子为64. 1.92 MSP是LTE接收器使用的典型采样率来执行小区搜索和MIB(主信息块)恢复。因此,DDC滤波器旨在适合此应用。DDC经过优化,以122.88 MHz的时钟速率运行。

监护系统设计

本节介绍如何在MATLAB®中使用浮点运算和滤波器设计函数来设计DDC。

监护系统参数

所需的DDC响应由输入采样率、载波频率和滤波器特性定义。修改这个期望的滤波器响应可能需要更改Simulink模型中滤波器块的HDL块属性。万博1manbetx稍后将在示例中讨论HDL块属性。

fsin = 122.88e6;输入到DDC的%采样率FC = 32E6;% 载频成就= 540年e3;%通带频率,相当于36x15khz lte子载波fstop = 700E3;%阻带频率美联社= 0.1;%通带波纹AST = 60;%停滞衰减

本节的其余部分将依次展示如何设计每个过滤器。

级联积分器-梳式(CIC)抽取器

第一级滤波器是作为CIC抽取器实现的,因为它能够有效地实现大的抽取因子。CIC滤波器的响应类似于移动平均滤波器的级联,但是不使用乘法或除法。因此,CIC滤波器具有较大的直流增益。

cicparams.decimationfactor = 8;cicparams.differensedDelay = 1;cicparams.numsections = 3;cicparams.fsout = fsin / cicParams.decimationFactor;cicfilt = dsp.cicDecimator(CICParams.DecimationFactor,......CICPARAMS.DIFFERALYDELAY,CICPARAMS.NUMSections)%#OK <* NOPTS>cicgain = gain(cicfilt)
CICFILT = DSP.cicDecimator具有属性:DetimationFactor:8差异:1 NUMPERIONS:3 FINDITPOINTDATYPE:'全精密'Cicgain = 512

CIC增益是2的幂,因此可以很容易地用移位操作在硬件中进行校正。为了便于分析,增益校正在MATLAB中用一键式表示dsp。FIRFilter系统对象。

cicGainCorr = dsp。FIRFilter (“分子”,1 / cicgain)
cicGainCorr = dsp。FIRFilterwith properties: Structure: 'Direct form' NumeratorSource: 'Property' Numerator: 0.0020 InitialConditions: 0 Use get to show all properties

使用FVTool.显示有增益校正和没有增益校正的CIC滤波器的幅值响应。为了进行分析,将CIC滤波器和增益校正滤波器组合成一个dsp。FilterCascade系统对象。CIC滤波器内部总是使用定点算法,所以FVTool.绘制量化和非量化响应。

ddcPlots。cicDecim = fvtool (......CICFILT,......dsp.FilterCascade (cicFilt cicGainCorr),......'FS',[fsin,fsin]);DDCTestUtils.setPlotNameAndTitle (“中投杀害多人者”);传奇(......'CIC没有纠正:量化'......'CIC没有更正:参考'......“收益修正CIC:量化”......“CIC与增益修正:参考”);

CIC下垂补偿滤波器

CIC滤波器的幅度响应具有重要意义下垂在通带范围内,因此使用基于fir的下垂补偿滤波器来平坦通带响应。下垂补偿器的配置参数与CIC抽取器相同。该滤波器还实现了2倍的抽取,因此规定了其限带特性。指定筛选器要求,然后使用设计函数返回具有这些特征的筛选器系统对象。

compParams。R = 2;%CIC补偿抽取因子compParams。成就= Fstop;%CIC COMP通带频率compparams.fsout = cicparams.fsout / compparams.r;%新的抽样率compParams。Fstop= compParams.FsOut - Fstop;%CIC COMP停止频率compParams。美联社=美联社;%相同的Ap作为整体过滤器compParams。Ast = Ast;%与整体过滤器相同的AstcompSpec = fdesign.decimator (compParams.R,“ciccomp”......cicParams。DifferentialDelay,......cicParams。NumSections,......cicParams。DecimationFactor,......'FP,FST,AP,AST'......compparams.fpass,comparams.fstop,comparams.ap,compparams.ast,......cicParams.FsOut);compFilt =设计(compSpec,“SystemObject”,真正的)
compFilt = dsp。firdecimationfactor with properties: NumeratorSource: 'Property' Numerator: [-0.0398 -0.0126 0.2901 0.5258 0.2901 -0.0126 -0.0398] DecimationFactor: 2 Structure: 'Direct form'使用get显示所有属性

绘制CIC滤波器(具有增益校正)和下垂补偿的组合响应。

ddcplots.ciccomp = fvtool(......dsp.FilterCascade (cicFilt cicGainCorr compFilt),......'FS'傅氏国际,'传奇''离开');DDCTestUtils.setPlotNameAndTitle ('CIC DECIM + DROOP COMP');

Halfband杀害多人者

半带滤波器通过两个提供有效的抽取。半带滤波器是有效的,因为大约一半的系数等于零。

hbParams。FsOut = compParams.FsOut / 2;hbParams。TransitionWidth = hbParams。FsOut - 2 * Fstop;hbParams。StopbandAttenuation = Ast;hbSpec = fdesign.decimator (2'halfband'......“Tw, Ast”......hbParams。TransitionWidth,......hbParams。StopbandAttenuation,......compParams.FsOut);hbFilt =设计(hbSpec,“SystemObject”,真正的)
hbfilt = dsp.firdecimator具有属性:NumeratorSource:'property'dumerator:[1x11 double] decimationfactor:2结构:'直接表格'使用可以显示所有属性

将DDC的响应绘制到半带滤波器输出。

ddcPlots。halfbandFIR = fvtool (......dsp.FilterCascade (cicFilt cicGainCorr、compFilt hbFilt),......'FS'傅氏国际,'传奇''离开');DDCTestUtils.setPlotNameAndTitle ('CIC Decim + drop Comp + HB FIR');

最后冷杉杀害多人者

最后的FIR实现了DDC的详细通带和阻带特性。该滤波器比之前的FIR滤波器具有更多的系数,但它的采样率更低,在硬件上实现了更多的资源共享。

%在阻带衰减上增加3dB的净空,使DDC仍然满足%规格后定点量化。这个值是通过反复试验确定的%with | fvtool |。finalspec = fdesign.decimator(2,低通滤波器的......'FP,FST,AP,AST'成就,Fstop,美联社,Ast + 3, hbParams.FsOut);finalFilt =设计(finalSpec,“equiripple”“SystemObject”,真正的)
finalFilt = dsp。FIRDecimator与属性:NumeratorSource: 'Property' Numerator: [1x70 double] DecimationFactor: 2结构:'Direct form'使用get显示所有属性

可视化DDC的整体幅度响应。

ddcfilterchain = dsp.filtercascade(cicfilt,cicgaincorr,compfilt,hbfilt,finalfilt);ddcplots.overallresponse = fvtool(ddcfilterchain,'FS'傅氏国际,'传奇''离开');DDCTestUtils.setPlotNameAndTitle ('整体DDC滤光链');

定点转换

浮点DDC滤波器链的频率响应现在符合规范。然后对每个过滤阶段进行量化,采用定点类型进行分析,确认过滤链仍然满足规范。

过滤量化

本例使用16位系数,这足以满足规范。使用小于18位的系数最小化了FPGA实现所需的DSP块数量。DDC滤波器链的输入是带有15个小数位的16位数据。滤波器输出是18位值,这在中间信号中提供了额外的净空和精度。

对于CIC的抽取器,选择最小节字长定点数据类型选项根据输出字长和其他CIC参数自动优化内部字长。

cicfilt.fixedPointDatatype ='最小部分字长度';cicfilt.outputwordlength = 18;

配置增益校正和基于fir的System对象的定点参数。虽然没有显式显示,但该对象使用默认值RoundingMethod溢出设置(地面包装分别)。

增益修正cicGainCorr。FullPrecisionOverride = false;cicGainCorr。CoefficientsDataType =“自定义”;cicgaincorr.customcoefficientsdatatype = numerictype(fi(cicgaincorr.numerator,1,16));cicgaincorr.outputdatatype =.“自定义”;cicgaincorr.customoutputdatatype = numerictype(1,18,16);%CIC下垂补偿compFilt。FullPrecisionOverride = false;compFilt。CoefficientsDataType =“自定义”;compfilt.customcoefficientsdatatype = numerictype([],16,15);compfilt.productDatatype ='完整精度';compFilt。AccumulatorDataType ='完整精度';compfilt.outputdatatype =.“自定义”;compFilt。CustomOutputDataType = numerictype([]、18、16);% HalfbandhbFilt。FullPrecisionOverride = false;hbFilt。CoefficientsDataType =“自定义”;hbFilt。CustomCoefficientsDataType = numerictype(15)[], 16日;hbFilt。ProductDataType ='完整精度';hbfilt.accumulatordataType ='完整精度';hbfilt.outputdatatype =.“自定义”;hbFilt。CustomOutputDataType = numerictype([]、18、16);%冷杉finalfilt.fullprecisionoverride = false;FinalFilt.coefficientSdatatype =.“自定义”;FinalFilt.CustomCoefficientsDatatype = Numerictype([],16,15);FinalFilt.ProductDatatype =.'完整精度';finalFilt。AccumulatorDataType ='完整精度';finalfilt.outputdatatype =.“自定义”;finalFilt。CustomOutputDataType = numerictype([]、18、16);

定点分析

检查量化效果FVTool..可以单独分析过滤器,或者在级联中进行分析。FVTool.显示覆盖的量化和非量化(参考)响应。举例说明了量化最后一级FIR滤波器的效果。

ddcPlots。quantizedFIR = fvtool (finalFilt,'FS',hbparams.fsout,“算术”“固定”);DDCTestUtils.setPlotNameAndTitle (“量化最终过滤”);

重新定义ddcFilterChain级联对象,以包含各个过滤器的定点属性。然后使用FVTool.对整个滤波器链进行分析,确认量化后的DDC仍然满足规范要求。

ddcfilterchain = dsp.filtercascade(cicfilt,cicgaincorr,compfilt,hbfilt,finalfilt);ddcplots.quantizedddcresponse = fvtool(ddcfilterchain,'FS'傅氏国际,“算术”“固定”);DDCTestUtils.setPlotNameAndTitle ('量化DDC滤波链');传奇(......'DDC滤波链:量化'......'DDC滤光链:参考');

HDL-Optimized仿万博1manbetx真软件模型

设计流程的下一步是在Simulink中使用HDL Coder兼容块实现DDC。万博1manbetx

模型配置

该模型依赖于MATLAB工作区中的变量来配置块和设置。它使用已定义的滤波链变量。接下来,定义数字控制振荡器(NCO)参数和输入信号。这些参数用于配置NCO块。

指定所需的频率分辨率。计算实现所需分辨率所需的累加器比特数,并定义量化累加器比特的数量。累加器的量化输出用于在NCO内部解决正弦查找表。还计算生成指定载波频率所需的相位增量。相位抖动应用于在量化期间除去的那些蓄电池位。

以区域。Fd = 1;以区域。AccWL = nextpow2(FsIn/n . fd) + 1;以区域。QuantAccWL = 12;以区域。PhaseInc = round(((-Fc * 2^n . accwl)/FsIn);以区域。NumDitherBits =甲。AccWL - nco.QuantAccWL;

对DDC的输入来自ddcIn.现在,为指定一个虚拟值ddcIn因此,该模型可以计算其数据类型。在测试期间,ddcIn为模型提供输入数据。

ddcin = 0;% #好< NASGU >

模型结构

给出了DDC仿真模型的顶层设计。万博1manbetx模型导入ddcIn从MATLAB工作空间使用来自工作区的信号块,将其转换为16位,然后应用于DDC。HDL代码可以从HDL_DDC子系统。

modelname =.“DDCHDLImplementation”;open_system (modelName);set_param (modelName'simulationcommand''更新');set_param (modelName“开放”“上”);

DDC实现位于HDL_DDC子系统。这NCO HDL优化块以载波频率生成复数相相。该信号进入混频器,该混频器将其乘以输入信号。然后将混频器的输出送入过滤器链,其中将其抽取至1.92 MSP。

set_param ([modelName'/ hdl_ddc'],“开放”“上”);

NCO块参数

方法中定义的参数配置了NCO块以区域结构体。显示了块参数对话框的两个选项卡。

CIC抽取和增益修正

第一级滤波器是级联积分器梳级(CIC)抽取器,采用CIC抽取HDL优化块实现。块参数设置为cicParams结构的值。增益校正是通过选择增益校正范围。

过滤器块参数

通过使用相应System对象的属性配置过滤器。CIC补偿、半带抽取和最终抽取滤波器在低于时钟率的有效采样率下工作(FCLK.),分别为8、16和32。这些抽样率是通过使用有效的信号来指示在特定速率下哪些样本是有效的。滤波器链中的信号具有相同的Simulink采样时间。万博1manbetx

CIC补偿滤波器、半带抽取滤波器和最终抽取滤波器分别由一个MATLAB函数块和两个离散FIR滤波器HDL优化块在多相分解中实现。多相分解实现了转换功能$H(z) = H_{0}(z) + z^{-1}H_{1}(z)$, 在哪里H (z) =美元现代{0}+现代z ^{1}{1} +现代z ^{2}{2} +现代z ^{3}{3} +…美元$ h_ {0}(z)= a_ {0} + a_ {2} z ^ { -  2} + ... $$H_{1}(z) = a_{1} + a_{3}z^{-3} +.多相分解是实现抽取过滤器的资源有效的方法。MATLAB功能块每两个周期保持两个输入样本,并同时通过它们到并行对离散FIR滤波器HDL优化块的同时美元H_ {0} (z)美元$ h_ {1}(z)$.较低的subfilter$ h_ {1}(z)$和上部子滤器美元H_ {0} (z)美元每个都包含一半的滤波器系数和输入数据的一半。

例如,CIC补偿抽取子系统实现了一个7-Cofifore过滤器。上次级滤器,美元H_ {0} (z)美元, 拥有4系数和下子滤波器,$ h_ {1}(z)$, 拥有3.系数。每个过滤器接收样本并每次生成输出16周期。由于每个过滤器每16个周期处理一个样本,子过滤器块可以及时共享硬件资源。为了以这种方式优化硬件资源,两个子过滤器都具有滤波器结构参数设置为部分串行收缩

图中显示了CIC补偿抽取子系统。半带抽取和最终抽取子系统使用相同的结构。

所有滤波器块都配置了在相应的结构中定义的参数。例如,图像显示了CIC补偿抽取块的块参数。这数量的周期参数为输入样本之间的最小循环次数。对CIC补偿抽取块的输入进行采样cicparams.decimationFactor * compparams.r.,这是16两个子滤波器的周期。

串行筛选器实现在指定的时钟周期数内重用乘数。如果没有这种优化,具有复杂输入数据的CIC补偿抽取滤波器将使用14个乘数。经过优化,每个美元H_ {0} (z)美元$ h_ {1}(z)$用途2乘数的总和4.同样,半频带抽取和最终抽取子系统使用4乘数。

载体测试和验证的正弦曲线

为了测试DDC,将40kHz正弦曲线调制到载波频率上并通过DDC。然后测量产生的音调的虚假自由动态范围(SFDR)和NCO输出的SFDR。

%在执行任何模拟之前初始化随机种子。RNG(0);生成40kHz测试音,调制到载波上。ddcIn = DDCTestUtils.GenerateTestTone (40 e3, Fc);%用浮点DDC解调测试信号。ddcOut = DDCTestUtils.DownConvert (ddcIn、国际俱乐部、ddcFilterChain);释放(ddcFilterChain);%通过执行带有sim功能的修改后的Simulink模型来解调测试信号。万博1manbetx= sim (modelName);%测量NCO,浮点DDC和固定点DDC输出的SFDR。结果。sfdrNCO = sfdr(真实(out.ncoOut),国际/ 64);结果。sfdrFloatDDC = sfdr(真实(ddcOut),国际/ 64);结果。sfdrFixedDDC = sfdr(真实(out.ddcOut),国际/ 64);disp ('虚假的自由动态范围(SFDR)测量');disp ([浮点DDC SFDR:num2str (results.sfdrFloatDDC)“数据库”]);disp ([“定点NCO SFDR:”,num2str(结果.sfdrnco)“数据库”]);disp (['优化的固定点DDC SFDR:'num2str (results.sfdrFixedDDC)“数据库”]);流(换行符);%绘制NCO和定点DDC输出的SFDR。ddcPlots。以区域OutSDFR = figure; sfdr(real(out.ncoOut),FsIn/64); DDCTestUtils.setPlotNameAndTitle(['nco'得到(GCA,'标题') .String]);ddcPlots。OptddcOutSFDR =图;sfdr(真正的(out.ddcOut),国际/ 64);DDCTestUtils.setPlotNameAndTitle ([“优化定点DDC Out”得到(GCA,'标题') .String]);
浮动点DDC SFDR:291.3483 DB定点NCO SFDR:83.0249 DB优化定点DDC SFDR:108.8419 dB

LTE信号测试

RNG(0);如果许可证('测试'“LTE_Toolbox”%使用LTE工具箱生成调制的LTE测试信号[ddcIn, sigInfo] = DDCTestUtils.GenerateLTETestSignal(Fc);使用MATLAB浮点模型下转换%ddcOut = DDCTestUtils.DownConvert (ddcIn、国际俱乐部、ddcFilterChain);释放(ddcFilterChain);使用Simulink Model%Dow万博1manbetxnConvertddcIn = [ddcIn; 0 (320 1)];%添加零以弥补输出完成结果的传播延迟= sim (modelName);结果。evmFloat = DDCTestUtils.MeasureEVM (sigInfo ddcOut);结果。evmFixed = DDCTestUtils.MeasureEVM (sigInfo out.ddcOut);disp (LTE误差矢量大小(EVM)测量);disp ([浮点DDC RMS EVM:num2str (results.evmFloat.RMS * 100, 3)'%']);disp (['浮点DDC峰值EVM:'num2str(结果.evmfloat.peak * 100,3)'%']);disp ([“定点HDL优化DDC RMS EVM”num2str(结果.Evmfixed.rms * 100,3)'%']);disp ([“定点HDL优化DDC峰值EVM:”num2str(结果.Evmfixed.peak * 100,3)'%']);流(换行符);结束
LTE误差矢量幅值(EVM)测量浮点DDC RMS EVM: 0.633%浮点DDC峰值EVM: 2.44%定点HDL优化DDC RMS EVM: 0.731%定点HDL优化DDC峰值EVM: 2.69%

HDL代码生成与FPGA实现

要为此示例生成HDL代码,您必须具有HDL Coder™产品。使用makehdl.makehdltb.命令来生成HDL代码和HDL测试台HDL_DDC子系统。DDC在Xilinx®Zynq®-7000 ZC706评估板上合成。邮政局和路由资源利用率结果显示在表中。该设计满足时钟频率为313 MHz的时序。

T =表(......分类({附近地区的“LUTRAM”“FF”“布莱姆。”“DSP”}),......分类({“2660”“318”“5951”'1.0'“18”}),......'variablenames',{“资源”'用法'})
资源使用________ _____ LUT 2660 LUTRAM 318 FF 5951 BRAM 1.0 DSP 18