主要内容

用HDL语言实现数字下变频器的滤波器链

这个例子展示了如何使用DSP System Toolbox™和Fixed-Point Designer™来设计一个三级,多速率,定点滤波器,实现一个数字下变频器(DDC)的滤波器链,以满足全球移动系统(GSM)的规范。

使用Filter Design HDL Coder™,我们将为相同的三级、多速率、定点滤波器生成可合成的HDL代码。最后,使用Simulink®和万博1manbetxHDL Verifier™MS,我们将共同模拟定点过滤器,以验证生成的HDL代码产生的结果与等效的Simulink行为模型相同。

数字变频技术

数字下变频(DDC)是数字收音机的重要组成部分。DDC执行必要的频率转换,将数字无线电中的高输入采样率转换为更低的采样率,以便进一步和更容易的处理。在本例中,DDC工作在大约70 MHz,必须将速率降低到270 KHz。

为了进一步限制我们的问题,我们将对Graychip的GC4016多标准四倍DDC芯片中的一个DDC进行建模。GC4016,在其他特性中,提供以下滤波器:一个具有可编程抽取因子(8-4096)的五级CIC滤波器;21分频FIR滤波器,抽取2和可编程16位系数;和一个63抽头FIR滤波器,也抽取2和可编程16位系数。

DDC由数字控制振荡器(NCO)和混频器组成,与正交转换为基带的输入信号。然后,基带信号通过级联积分器 - 梳子(CIC)过滤器过滤,然后进行两个冷却抽取滤波器,以实现约270kHz的低采样率以进行进一步处理。最终阶段通常包括重置器,其根据应用程序插值或抽取信号以实现所需的采样率。还可以通过重试器实现进一步的滤波。典型DDC的框图如下所示。

这个例子集中在三级多速率抽取滤波器,它由CIC和两个抽取FIR滤波器组成。

GSM规范

GSM的带宽是160khz。因此,DDC的三级多速率滤波器响应必须在此带宽内平坦到通带纹波范围内,该通带纹波的峰值必须小于0.1 dB。看GSM的带外抑制掩模如下所示,我们看到滤波器也必须达到18分贝的衰减在100 KHz。

此外,GSM需要符号率为270.833 ksps。由于Graychip的输入采样率与其时钟速率相同,因此必须将输入的输入降至270.833 kHz。这要求三阶段多型过滤器减少256。

级联积分器梳状滤波器

CIC滤波器是非常有用的多速率滤波器,因为它们可以实现高抽取(或插值)率,而且不需要乘法器。CICs只是用上采样器或下采样器递归级联实现的箱-车过滤器。这些特性使得CICs对于高速运行的数字系统非常有用,特别是当这些系统是用asic或fpga实现时。

尽管CICs具有令人满意的特性,但它们也有一些缺点,最明显的是,由于它们的自相似响应,在通带区域会引起衰减。由于这个原因,CICs后面通常必须有一个补偿滤波器。补偿滤波器必须在通带区域具有逆sinc响应,以消除由CIC引起的下垂。

这三个过滤器的设计和级联可以通过图形用户界面Filter Designer来执行,

但我们将使用命令行功能。

我们对CIC的定义如下:

R = 64;%大量毁灭的因素D = 1;%微分延迟nsecs = 5;%分段数猫头鹰= 20;%输出字长度中投= dsp。CICDecimator (“DecimationFactor”R“NumSections”Nsecs,“FixedPointDataType”“最小节字长”“OutputWordLength”OWL);

我们可以通过调用info方法查看CIC的详细信息。

信息(cic)
ans = 9x56 char array '离散时间FIR多速率滤波器(real)“-----------------------------------------”滤波器结构:级联积分器-梳状抽取器“抽取因子:64”“差分延迟:1”“分段数:5”“稳定:是”“线性相位:是”(类型2)' ' '

让我们绘制并分析CIC滤波器的理论幅度响应,其将以69.333MHz的输入速率运行。

fs_in = 69.333e6;fvt = fvtool(cic,“Fs”, Fs_in);fvt。颜色=“白色”

首先要注意的是CIC滤波器具有巨大的通带增益,这是由于结构内的添加和反馈。我们可以通过使用FVTool中的相应设置来规范CIC的幅度响应。归一化CIC滤波器响应在DC处具有0 dB增益,使得更容易分析下一阶段滤波器的覆盖滤波器响应。

fvt。NormalizeMagnitudeto1 =“上”

另一件需要注意的事情是,在通带区域放大,我们看到CIC在80 KHz有大约-0.4 dB的衰减(下垂),这是在感兴趣的带宽内。一个CIC滤波器本质上是一个级联的箱-车滤波器,因此有一个自相似的响应,导致下垂。这个下垂需要在下一阶段的FIR滤波器补偿。

轴([0 .1 -0.8 0]);

补偿冷杉杀害多人者

我们的DDC过滤器链的第二阶段需要补偿由CIC和Difimate引起的通带下垂。由于CIC具有SIND样的响应,我们可以通过具有逆基金的低通滤波器来弥补下垂通带中的响应。该过滤器将以1/64的输入采样率运行,输入采样率为69.333MHz,因此其速率为1.0833MHz。除了从划痕中设计具有反向敏能通带响应的低通滤波器,我们将使用罐头函数,该功能可让我们直接设计带有CIC补偿(反向SINC)响应的DECIMATOR。

%过滤器规格Fs = 1.0833 e6;%采样频率69.333MHz / 64apas = 0.01;% dBAstop = 70;% dB成就= 80年e3;% Hz通带边缘频率Fstop = 293年e3;%Hz Stopbend边缘频率%设计抽取滤波器。D和nsec已在上面定义为%微分延迟和分段数。Compentar = dsp.ciccompensationDecimator(“SampleRate”Fs,“CICRateChangeFactor”R“CICNumSections”Nsecs,'cicdifferencedelay'D“PassbandFrequency”,馈送,“StopbandFrequency”Fstop,“PassbandRipple”apas,'stopbandattenuation', Astop);现在我们必须定义多速率过滤器的定点属性。%默认情况下,累加器和乘数的定点属性%设置以确保使用全精度算术,即no%量子化发生。缺省情况下,用16位表示%滤波器系数。既然这是我们想要的,就不要改变从默认值中需要%。

利用info命令可以得到FIR补偿滤波器的综合报告,包括累加器的字长和乘积,这些都是自动确定的。

信息(补偿器)
ans = 10x56 char array 'Discrete-Time FIR Multirate Filter (real)“-----------------------------------------”滤波器结构:直接形式FIR多相抽取器“抽取因子:2”“多相长度:11”“滤波器长度:21”“稳定:是”“线性相位:是”(类型1)' ' ' '算术:double '

将CIC与逆sinc滤波器级联,我们可以看到我们是否消除了CIC引起的通带下降。

cicCompCascade =级联(中投,补偿器);fvt = fvtool (cicCompCascade中投,补偿器,“Fs”(Fs_in Fs_in / 64, Fs_in]);fvt。颜色=“白色”;fvt。NormalizeMagnitudeto1 =“上”;轴([0.1 -0.8 0.8]);传奇(FVT,'cic'“补偿”“级联”);

从两个滤波器级联的滤波器响应中可以看出,在CIC响应和补偿FIR响应之间的滤波器响应,通带下垂被消除了。

第三级FIR小数

如前所述,GSM频谱掩模在100 KHz时需要衰减18 dB。所以,在我们的第三阶段,也是最后一个阶段,我们可以尝试一个简单的等波纹低通滤波器。我们再次需要将系数量化为16位(默认)。这个过滤器还需要抽取2。

N = 62;% 63水龙头Fs = 541666;% 541.666千赫成就= 80年e3;Fstop = 100年e3;规范= fdesign.decimator (2低通滤波器的“N, Fp,置”、N、成就、Fstop, Fs);%给予超过通带的重量杀害多人者=设计规范,“equiripple”“Wpass”2,“SystemObject”,真正的);

在默认情况下定义多速率过滤器时,累加器的字长将自动确定以保持完全精度。但是,由于输出只有20位,我们将输出格式设置为20位的单词长度和-12的分数长度。首先,我们必须将FullPrecisionOverride属性的默认值从true更改为false。

杀害多人者。FullPrecisionOverride = false;杀害多人者。OutputDataType =“自定义”;杀害多人者。RoundingMethod =“最近的”;杀害多人者。OverflowAction =“饱和”;杀害多人者。CustomOutputDataType = numerictype ([], -12);

我们可以使用info方法查看过滤器的详细信息。

信息(杀害多人者)
ans = 10x56 char array 'Discrete-Time FIR Multirate Filter (real)“-----------------------------------------”滤波器结构:直接形式FIR多相抽取器“抽取因子:2”“多相长度:32”“滤波器长度:63”“稳定:是”“线性相位:是”(类型1)' ' ' '算术:double '

多级多速率DDC滤波器链

现在我们已经设计并量化了三个滤波器,我们可以通过级联归一化CIC和两个FIR滤波器得到整个滤波器的响应。同样,我们使用归一化幅度来确保级联滤波器响应归一化为0 dB。

如ddc =级联(中投、补偿器、杀害多人者);fvt = fvtool(监护系统“Fs”, Fs_in);fvt。颜色=“白色”;fvt。NormalizeMagnitudeto1 =“上”;fvt。NumberofPoints = 8192 * 3;轴([0 1 -200 10]);%的放大

为了查看整个滤波器响应是否符合GSM规范,我们可以在滤波器响应上覆盖GSM光谱掩模。

drawgsmmask;

我们可以看到,我们的整体滤波器响应是在GSM频谱掩模的限制内。我们还需要确保通带纹波满足峰间小于0.1 dB的要求。我们可以通过使用axis命令放大来验证这一点。

轴([0.009 -0.08 0.08]);

事实上,通带纹波远低于0.1 dB的峰值GSM要求。

生成VHDL代码

过滤器设计器还支持从下面所示的对话框中生成万博1manbetxHDL代码。

从过滤器设计器和命令行,您可以生成VHDL或Verilog代码,以及VHDL或Verilog文件中的测试工作台。此外,您还可以通过指定许多选项来定制生成的HDL代码,以满足您的编码标准和指南。

但是,这里我们将使用命令行功能来生成HDL代码。

现在我们有我们的定点,三阶段,多速率过滤器会遇到我们准备好的规格生成HDL代码。

CIC级联和两个FIR滤波器并生成VHDL。

为了避免对来自混合器的定点数据进行量化,混合器的字长为20位,分数长度为18位(S20,18),我们将CIC的输入字长和分数长度设置为相同的值,S20,18。

%杂环胺=级联(hcic、hcfir hpfir);workingdir = tempname;inT = numerictype(1、20、18);generatehdl(监护系统'inputDatatype'inT,“名字”'筛选'“开发”硬件描述语言(VHDL)的“TargetDirectory”fullfile (workingdir“hdlsrc”));
### # start VHDL code generation process for filter: filter ### ##< a href = " matlab:编辑(“/ tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage1.vhd ') " > / tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage1。vhd < / > # # # # # #开始代filter_stage1 VHDL的实体开始代filter_stage1硬件描述语言(VHDL)架构# # # # 1:部分积分器# # # # 2:部分积分器# # # # 3:部分积分器# # # # 4:部分积分器# # # # 5:部分积分器# # # # 6节:梳子# # # # 7节:梳子# # # # 8节filter: filter_stage1 VHDL code generation process for filter: filter_stage2 VHDL code generation process for filter: filter_stage2 VHDL code generation process for filter: filter_stage2< a href = " matlab:编辑(“/ tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage2.vhd ') " > / tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage2。vhd ### #开始生成filter_stage2 VHDL实体### #开始生成filter_stage2 VHDL架构### ##成功完成filter的VHDL代码生成过程:filter_stage2 ### ### ### ###< a href = " matlab:编辑(“/ tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage3.vhd ') " > / tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter_stage3。vhd ###开始生成filter_stage3 VHDL实体### #开始生成filter_stage3 VHDL架构### #成功完成filter的VHDL代码生成过程:filter_stage3 ### #< a href = " matlab:编辑(“/ tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 hdlsrc / filter.vhd ') " > / tmp / Bdoc21b_1757077_58267 / tp92e56bd5_0d38_4cf1_9288_99fd51978240 / hdlsrc /过滤器。VHDL  ###开始生成filter VHDL entity ###开始生成filter VHDL架构### #成功完成filter VHDL代码生成过程:filter ### # HDL时延是2个样本

在Simulink中与ModelSim进行HDL联合仿真万博1manbetx

为了验证生成的HDL代码是否产生与我们的Simulink模型相同的结果,我们将使用HDL Verifier MS在Simulink中共同模拟我们的HD万博1manbetxL代码。我们有一个预先构建的Simulink模型万博1manbetx,其中包括两个信号路径。一个信号路径产生Simulink的三阶多速率滤波器万博1manbetx的行为模型结果。另一条路径使用我们生成的VHDL代码ModelSim®生成模拟结果。

open_system (“ddcfilterchaindemo_cosim”);

双击Simulink模型中的按钮开始模型im.万博1manbetx请注意,必须在系统路径上安装ModelSIM。ModelSim将自动编译HDL代码,初始化模拟并打开Wave Viewer。

当ModelSim就绪时,运行Simulink模型。万博1manbetx这将与ModelSim执行联合仿真,并自动打开Time Scope查看结果。

使用Logic Analyzer查看结果。

验证结果

顶部的迹线是激发啁啾信号。标记为“ref”的下一个信号是由三级多速率滤波器的Simulink行为模型产生的参考信号。万博1manbetx标记为“COSIM”的底部跟踪在范围上是三级多速率滤波器的所生成的HDL码的模型模拟结果。最后一条跟踪显示了Simulink的行为模型结果与ModelSIM模拟HDL代万博1manbetx码的错误。

概括

我们使用了几个MathWorks™产品来设计和分析用于s manbetx 845GSM应用的DDC的三级、多速率、定点滤波器链。然后我们生成HDL代码来实现过滤器,并通过比较Simulink的行为模型和ModelSim中通过HDL Verifier MS模拟的HDL代码来验证生成的代码。万博1manbetx