主要内容

LTE数字下变频的HDL实现

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

介绍

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

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

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

这个例子比较了浮点DDC输出的信号质量和定点DDC输出的信号质量。

最后给出了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 Msps。这些比率给出了总的抽取系数为64。LTE接收器使用1.92 Msps作为cell search和master information block (MIB)恢复的典型采样率。DDC滤波器就是为适应这种应用而设计的。DDC被优化为以122.88 MHz的时钟速率运行。

监护系统设计

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

监护系统参数

本例设计了DDC滤波器特性,以满足给定输入采样率和载波频率下的期望响应值。

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

中投杀害多人者

第一级滤波器是CIC抽取器,因为它能够有效地实现大的抽取因子。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增益是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

显示CIC滤波器在有增益校正和没有增益校正时的幅值响应fvtool.为了进行分析,将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。美联社=美联社;%与整体滤波器相同的通带纹波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。firdecimationator with properties: DecimationFactor: 2 NumeratorSource: 'Property' Numerator:[-0.0398 -0.0126 0.2901 0.5258 0.2901 -0.0126 -0.0398]结构:'直接形式'使用get显示所有属性

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

ddcPlots。cicComp = fvtool (...dsp.FilterCascade (cicFilt cicGainCorr compFilt),...“Fs”傅氏国际,“传奇”“关闭”);DDCTestUtils.setPlotNameAndTitle (“CIC抽取和下垂补偿”);

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。[0.0089 0 -0.0565 0 0.2977 0.5000 0.2977 0 -0.0565…]结构:'直接形式'使用get显示所有属性

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

ddcPlots。halfbandFIR = fvtool (...dsp.FilterCascade (cicFilt cicGainCorr、compFilt hbFilt),...“Fs”傅氏国际,“传奇”“关闭”);DDCTestUtils.setPlotNameAndTitle (CIC抽取、下垂补偿和半带FIR);

最后冷杉杀害多人者

最后的FIR实现了DDC的详细通带和阻带特性。这个滤波器比以前的FIR滤波器有更多的系数,但因为它在较低的采样率下工作,它可以使用资源共享有效的硬件实现。

在阻带衰减上增加3db的净空,使DDC经定点量化后仍然满足规范要求。这个值是通过使用经验发现的fvtool

finalSpec = fdesign.decimator (2低通滤波器的...“Fp,置,美联社,Ast”成就,Fstop,美联社,Ast + 3, hbParams.FsOut);finalFilt =设计(finalSpec,“equiripple”“SystemObject”,真正的)
finalFilt = dsp。firdecimationator with properties: DecimationFactor: 2 NumeratorSource: 'Property' Numerator: [9.3365e-04 0.0013 9.3466e-04 -5.3189e-04 -0.0022…结构:'直接形式'使用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滤波器链”);传奇(“量化”“参考”);

HDL-Optimized仿金宝app真软件模型

设计流程的下一步是在Simulink中使用支持HDL代码生成的块来实现DDC。金宝app金宝app

模型配置

该模型依赖于MATLAB工作空间中的变量来配置块和设置。它使用前面示例中定义的过滤器链变量。接下来,定义NCO特性和输入信号。本示例使用这些特征来配置NCO块。

指定所需的频率分辨率。计算需要达到所需分辨率的累加器比特数,然后定义量化累加器比特数。NCO使用累加器的量化输出来寻址正弦查找表。还要计算NCO必须使用的相位增量来产生指定的载频。NCO将相位抖动应用于量子化过程中被删除的累加器位。

以区域。Fd = 1;以区域。AccWL = nextpow2(国际/ nco.Fd) + 1;以区域。QuantAccWL = 12;以区域。PhaseInc =圆((fc * 2 ^ nco.AccWL) /国际);以区域。NumDitherBits = nco.AccWL-nco.QuantAccWL;

DDC的输入来自于ddcIn变量。现在,为指定一个虚拟值ddcIn这样模型就可以计算它的数据类型。在测试过程中,ddcIn为模型提供输入数据。

ddcIn = 0;% #好< NASGU >

模型结构

图中显示了DDC Simulink模型的顶层。金宝app模型导入ddcIn通过使用Signal from workspace块从MATLAB工作空间变量,将输入信号转换为16位值,并将信号应用到DDC。您可以从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块以区域结构。该图显示了NCO HDL优化块参数对话框的两个选项卡。

CIC抽取和增益校正

第一级过滤器是CIC抽取器,它是用CIC抽取HDL优化块实现的。块参数设置为cicParams结构的值。为了实现增益校正,模型选择增益校正参数。

模型通过使用相应System对象的属性来配置过滤器。CIC补偿、半带抽取和最终cecimation滤波器在有效采样率下工作,有效采样率分别比时钟率低8、16和32倍。模型通过使用有效的输入信号来指示在每个速率下哪些样本是有效的。滤波器链中的信号具有相同的Simulink采样时间。金宝app

通过多相分解,用MATLAB函数块和两个离散FIR滤波器HDL优化块分别实现了CIC补偿、半带抽取和最终抽取滤波器。多相分解实现了转换功能$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)美元,每个包含一半的过滤系数和处理一半的输入数据。

例如,中投公司赔偿大量毁灭子系统实现了一个七系数滤波器。上subfilter,美元H_ {0} (z)美元,有四个系数和下子滤波器,美元H_ {1} (z)美元,有三个系数。每个过滤器接收一个样本并每16个周期产生一个输出。由于每个过滤器每16个周期处理一个样本,子过滤器块可以及时共享硬件资源。为了以这种方式优化硬件资源,两个子过滤器都具有滤波器结构参数设置为部分连续收缩

这个图显示了中投公司赔偿大量毁灭子系统。的Halfband大量毁灭最终大量毁灭子系统使用相同的结构。

该模型通过使用在其相应结构中定义的参数来配置所有的过滤器块。例如,这张图显示了CIC补偿抽取块的块参数。的数量的周期参数为输入样本之间的最小循环次数。输入到CIC补偿抽取块的采样率为cicParams.DecimationFactor * compParams.R,即每个子滤波器每16个周期一个样本。

串行筛选器实现在指定的时钟周期数内重用乘数。如果没有这种优化,中投公司赔偿大量毁灭具有复杂输入数据的子系统使用14个乘数。优化后,美元H_ {0} (z)美元美元H_ {1} (z)美元每次使用两个乘数,总共四个乘数。类似地,Halfband大量毁灭最终大量毁灭子系统每个使用四个乘数。

载波正弦信号测试与验证

要测试DDC,将一个40khz的正弦波调制到载波频率上,并将调制的正弦波通过DDC。然后,测量产生的音调的散伪自由动态范围(SFDR)和NCO输出的SFDR。绘制NCO和定点DDC输出的SFDR。

%在执行任何模拟之前初始化随机种子。rng (0);%生成40千赫测试音调,调制到载波上。ddcIn = DDCTestUtils.GenerateTestTone (40 e3, Fc);%用浮点DDC解调测试信号。ddcOut = DDCTestUtils.DownConvert (ddcIn、国际俱乐部、ddcFilterChain);释放(ddcFilterChain);%通过运行Simulink模型解调测试信号。金宝app= sim (modelName);%测量NCO、浮点DDC输出、定点输出的SFDR%, DDC输出。结果。sfdrNCO = sfdr(真正的(out.ncoOut),国际);结果。sfdrFloatDDC = sfdr(真正的(ddcOut), FsOut);结果。sfdrFixedDDC = sfdr(真正的(out.ddcOut), FsOut);disp (“SFDR测量”);disp ([浮点DDC SFDR:num2str (results.sfdrFloatDDC)“数据库”]);disp ([“定点NCO SFDR:”num2str (results.sfdrNCO)“数据库”]);disp ([“优化定点DDC SFDR:”num2str (results.sfdrFixedDDC)“数据库”]);流(换行符);%绘制NCO和定点DDC输出的SFDR图。ddcPlots。以区域OutSDFR = figure; sfdr(real(out.ncoOut),FsIn); DDCTestUtils.setPlotNameAndTitle([NCO输出信号get (gca),“标题”) .String]);ddcPlots。OptddcOutSFDR =图;sfdr(真正的(out.ddcOut), FsOut);DDCTestUtils.setPlotNameAndTitle ([“优化定点DDC输出信号”get (gca),“标题”) .String]);
SFDR测量浮点DDC SFDR: 291.3685 dB定点NCO SFDR: 83.0249 dB优化定点DDC SFDR: 108.8419 dB

LTE信号测试

可以使用LTE测试信号对DDC进行更严格的测试。使用LTE工具箱™功能生成符合标准的LTE波形。然后,用DDC模型向下转换波形。使用LTE工具箱函数测量结果信号的误差矢量大小(EVM)。

rng (0);%只在您有LTE工具箱产品时执行此测试。如果许可证(“测试”“LTE_Toolbox”%使用LTE工具箱功能生成调制的LTE测试信号。[ddcIn, sigInfo] = DDCTestUtils.GenerateLTETestSignal (Fc);%用浮点DDC向下转换信号。ddcOut = DDCTestUtils.DownConvert (ddcIn、国际俱乐部、ddcFilterChain);释放(ddcFilterChain);用Simulink模型向下转换信号。金宝app%用0填充输入以表示传播延迟并返回完整的结果。ddcIn = [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 EVMnum2str (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评估板上合成。表格显示了post place-and-route资源使用结果。该设计满足了313mhz的时钟频率。

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