主要内容

LTE数字下变频的HDL实现

这个例子展示了如何为无线通信应用(如LTE)设计一个数字下变频器(DDC),并使用HDL Coder™生成HDL代码。

介绍

DDC广泛用于数字通信接收器中,以将射频(RF)或中频(IF)信号转换为基带。DDC操作将信号移至较低频率并降低其采样率以便于随后的处理阶段。这里呈现的DDC执行复杂的频率转换,然后使用4级滤光链进行采样率转换。该示例首先在浮点设计DDC中使用DSP系统工具箱™功能开始。然后将每个阶段转换为固定点,然后在Simulink®模型中使用,该模型生成可合成的HDL代码。金宝app使用两个测试信号来演示和验证DDC操作:

  1. 调制到32兆赫中频载波上的一种正弦波。

  2. 一种LTE下行信号,带宽为1.4 MHz,调制到32 MHz中频载波上。

该示例测量浮点和定点DDC的输出处的信号质量,并比较两者。最后,提出了FPGA实现结果。

注意:这个例子使用DDCTestUtils,一个helper类,包含生成刺激和分析DDC输出的函数。看到DDCTestUtils.m文件以获取更多信息。

监护系统结构

DDC由数控振荡器(NCO),混频器和抽取滤波链组成。滤波链包括CIC Deetimator,CIC增益校正,CIC补偿Detimator(FIR),半带FIR DECIMID和最终的FIR DECIMATOR。滤波链的整体响应相当于具有相同规格的单个抽取滤波器的整体响应,然而,将滤波器分成多个抽取级导致使用更少的硬件资源的更有效的设计。CIC DECIMATOR提供了大的初始抽取因子,其使后续过滤器能够以较低的速率工作。CIC补偿Detimator通过补偿CIC Droop来提高光谱响应,同时抽取两个。半频段是中间排列器,而最终的抽档器实现精确成就FstopDDC特性。由于较低的采样率,靠近链末端的滤波器可以通过共享乘数来优化资源使用。DDC的框图如下所示。

DDC的输入采样速率为122.88 Msps,输出采样速率为1.92 Msps。因此,总抽取因子是64。LTE接收机用于cell搜索和MIB(主信息块)恢复的典型采样率为1.92 Msps。因此,DDC滤波器的设计就是为了适应这种应用。DDC被优化为以122.88 MHz的时钟速率运行。

监护系统设计

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

监护系统参数

所需的DDC响应由输入采样率,载波频率和滤波器特性定义。修改该所需的滤波器响应可能需要更改Simulink模型中的过滤器块的HDL块属性。金宝appHDL块属性在示例稍后讨论。

傅氏国际= 122.88 e6;%输入到DDC时的采样率Fc = 32 e6;%载波频率成就= 540年e3;%通频带频率,相当于36x15kHz LTE子载波Fstop = 700年e3;%阻带频率美联社= 0.1;%通带纹波Ast = 60;%阻带衰减

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

Cascade Integrator-Comb(CIC)Defimator

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

cicParams。DecimationFactor = 8;cicParams。DifferentialDelay = 1;cicParams。NumSections = 3;cicParams。FsOut =国际/ cicParams.DecimationFactor;cicFilt = dsp.CICDecimator (cicParams.DecimationFactor,...cicParams.DifferentialDelay cicParams.NumSections)% #好< * NOPTS >cicGain =获得(cicFilt)
cicFilt = dsp。CICDecimator的属性:DecimationFactor: 8 DifferentialDelay: 1 NumSections: 3 FixedPointDataType: 'Full precision' cicGain = 512

CIC增益是两个的功率,因此它可以通过换档操作在硬件中容易地校正。出于分析目的,通过单次采用MATLAB在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”,国际,国际);ddctestutils.setplotnameandtitle(“中投杀害多人者”);传奇(...“CIC未修正:量化”...“CIC无更正:参考资料”...“收益修正CIC:量化”...“CIC与增益修正:参考”);

CIC下垂补偿过滤器

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

compparams.r = 2;% CIC补偿抽取系数compParams。成就= Fstop;% CIC通频带频率compParams。FsOut = cicParams.FsOut / compParams.R;新抽样率compParams。Fstop= compParams.FsOut - Fstop;CIC补偿阻带频率%compparams.ap = ap;%相同的Ap作为整体过滤器compParams。Ast = Ast;与整体过滤器相同compSpec = fdesign.decimator (compParams.R,“ciccomp”...cicParams。DifferentialDelay,...cicParams。NumSections,...cicparams.decimationFactor,...“Fp,置,美联社,Ast”...compParams.Fpass、compParams.Fstop compParams.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 +下垂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' Numerator: [1x11 double] DecimationFactor: 2结构:'Direct form'使用get显示所有属性

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

ddcPlots。halfbandFIR = fvtool (...dsp.filtercascade(Cicfilt,Cicgaincorr,Compfilt,Hbfilt),...“Fs”傅氏国际,“传奇”“关闭”);ddctestutils.setplotnameandtitle('CIC Decim + drop Comp + HB FIR');

最后冷杉杀害多人者

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

%在阻带衰减上增加3dB的净空,使DDC仍然满足%规格后定点量化。这个值是通过反复试验确定的%与| fvtool |。finalSpec = fdesign.decimator (2低通滤波器的...“Fp,置,美联社,Ast”成就,Fstop,美联社,Ast + 3, hbParams.FsOut);finalFilt =设计(finalSpec,'平静'“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对象的定点参数。虽然没有显式显示,但该对象使用默认值RoundingMethodOverflowAction设置(地板上分别)。

增益修正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(15)[], 16日;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(15)[], 16日;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优化的Simulink金宝app模型

设计流程的下一步是在Simulink中使用HDL Coder兼容块实现DDC。金宝app

模型配置

该模型依赖于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 Simulink模型的顶级。金宝app模型进口ddcIn从Matlab工作区使用a信号从工作区块,将其转换为16位,然后应用于DDC。HDL代码可以从HDL_DDC子系统。

modelName =“DDCHDLImplementation”;open_system (modelName);set_param (modelName“SimulationCommand”“更新”);set_param (modelName'打开'“上”);

DDC实现在HDL_DDC子系统。的NCO HDL优化块在载波频率处产生一个复相量。这个信号进入混频器,混频器将它与输入信号相乘。混合器的输出被送入过滤链,在那里它被抽取到1.92 Msps。

set_param ([modelName' / HDL_DDC '],'打开'“上”);

以区域块参数

NCO块配置有所定义的参数以区域结构。显示块参数对话框的两个选项卡。

CIC抽取和增益校正

第一滤波器级是用CIC抽取HDL优化块实现的级联集成器 - 梳理(CIC)DECIMIDATOR。块参数设置为cicparams.结构的值。增益校正是通过选择增益校正参数。

过滤块参数

通过使用相应的系统对象的属性来配置过滤器。CIC补偿,半频带抽取和最终抽取滤波器以低于时钟速率的有效采样率运行(Fclk),分别为8、16和32。这些抽样率是通过使用有效的信号来指示在特定速率下哪些样本是有效的。滤波器链中的信号具有相同的Simulink采样时间。金宝app

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.系数过滤器。上subfilter,美元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模型来解调测试信号。金宝app= 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 (results.sfdrNCO)“数据库”]);DISP([“优化定点DDC SFDR:”,num2str(结果.sfdrfixeddc)“数据库”]);流(换行符);%绘制NCO和定点DDC输出的SFDR图。ddcPlots。以区域OutSDFR = figure; sfdr(real(out.ncoOut),FsIn/64); DDCTestUtils.setPlotNameAndTitle([“甲”get (gca),“标题”) .String]);ddcPlots。OptddcOutSFDR =图;sfdr(真正的(out.ddcOut),国际/ 64);DDCTestUtils.setPlotNameAndTitle ([“优化定点DDC Out”get (gca),“标题”) .String]);
伪自由动态范围(SFDR)测量浮点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模型向下转换金宝appddcIn = [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 (results.evmFloat.Peak * 100, 3)“%”]);DISP([“定点HDL优化DDC RMS EVM”num2str (results.evmFixed.RMS * 100, 3)“%”]);DISP([“定点HDL优化DDC峰值EVM:”num2str (results.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™产品。使用makehdlmakehdltb命令来生成HDL代码和HDL测试台HDL_DDC子系统。DDC在Xilinx®Zynq®-7000 ZC706评估板上合成。岗位地点和路线资源利用结果如表所示。该设计满足了313mhz的时钟频率。

t =表(...分类({'lut'“LUTRAM”“FF”“布莱姆。”“DSP”}),...分类({“2660”'318'“5951”“1.0”“18”}),...“VariableNames”, {“资源”“使用”})
T = 5x2表资源使用________ _____ lut 2660 lutram 318 ff 5951 bram 1.0 dsp 18