主要内容

在HDL中实现数字下变频器的滤波器链

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

使用过滤器设计HDL Coder™,我们将为同一三级,多管,定点过滤器生成合成的HDL代码。最后,使用的Simulink和金宝appHDL验证™MS,我们将共同模拟定点滤波器,以验证所生成的HDL代码产生相同的结果等效的Simulink行为模型。

数字下变频器

数字下变频器(DDC)是数字无线电的关键组成部分。DDC执行将在数字无线电中的高输入采样率转换为更低的采样率,以进一步更轻松地进行频率转换。在该示例中,DDC在大约70MHz下运行,并且必须将速率降低到270 kHz。

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

DDC由一个数字控制振荡器(NCO)和一个混频器组成,用于将输入信号向下正交转换到基带。然后,基带信号通过一个级联积分器梳(CIC)滤波器和两个FIR抽取滤波器进行低通滤波,以达到约270khz的低采样率,为进一步处理做好准备。最后阶段通常包括一个再采样器,它根据应用程序对信号进行插值或抽取,以达到所需的采样率。进一步的滤波也可以用再采样器实现。典型DDC的框图如下所示。

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

GSM规格

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

此外,GSM要求符号速率为270.833 Ksps。由于Graychip的输入采样率与其69.333 MHz的时钟率相同,我们必须将输入采样降低到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.333 MHz输入速率下的理论幅度响应。

Fs_in = 69.333 e6;fvt = fvtool(中投,“Fs”, Fs_in);fvt.Color =.“白色”

首先要注意的是,CIC滤波器有一个巨大的通带增益,这是由于结构内的添加和反馈。我们可以使用FVTool中的相应设置来规范CIC的幅度响应。将CIC滤波器响应归一化,使其在直流有0 dB增益,将使分析下一级滤波器的叠加滤波器响应更容易。

fvt.normalizemagnitudeto1 ='在'

另一件事是,在通带区域中放大,我们看到CIC在80 kHz处具有约-0.4 dB的衰减(下垂),这在感兴趣的带宽范围内。CIC滤波器基本上是杂角过滤器的级联,因此具有SIST的响应,导致下垂。此下垂需要通过FIR滤波器在下一个阶段进行补偿。

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

补偿冷杉杀害多人者

我们的DDC滤波器链的第二阶段需要补偿由CIC和抽取2引起的通带下降。由于CIC具有类正弦响应,我们可以用通带内具有逆正弦响应的低通滤波器来补偿下降。该滤波器将以69.333 MHz的输入采样率的1/64工作,因此它的采样率为1.0833MHz。我们不再从头开始设计具有逆sinc通带响应的低通滤波器,而是使用一个封闭函数,让我们直接设计具有CIC补偿(逆sinc)响应的小数部分。

%过滤器规格FS = 1.0833E6;%采样频率69.333MHz/64Apass = 0.01;% D bAstop = 70;% D b成就= 80年e3;% Hz通带边缘频率Fstop = 293年e3;% Hz阻带边频率%设计抽取滤波器。D和nsec已在上面定义为%微分延迟和分段数。补偿器= dsp。CICCompensationDecimator (“SampleRate”Fs,......'cicratechangefactor'R'cicnumsections'Nsecs,......“CICDifferentialDelay”D“PassbandFrequency”成就,......'stopband职业',fstop,'passbandropple'apas,......“StopbandAttenuation”, Astop);%现在我们必须定义多速率过滤器的固定点属性。%默认情况下,累加器和乘数的定点属性%设置为确保使用完全精确算术,即No.%量子化发生。缺省情况下,用16位表示%滤波器系数。因为这就是在这种情况下我们想要的,没有变化%是必需的。

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

信息(补偿器)
ans = 10x56 char array'离散时间fir multioriles filter(real)''--------------------------------------- ' 'Filter Structure : Direct-Form FIR Polyphase Decimator' 'Decimation Factor : 2 ' 'Polyphase Length : 11 ' 'Filter Length : 21 ' 'Stable : Yes ' 'Linear Phase : Yes (Type 1) ' ' ' 'Arithmetic : double '

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

cicCompCascade =级联(中投,补偿器);fvt = fvtool (cicCompCascade中投,补偿器,“Fs”,[fs_in,fs_in / 64,fs_in]);fvt.Color =.“白色”;fvt.normalizemagnitudeto1 ='在';轴([0 .1 -0.8 .8]);传奇(fvt“中投”“补偿者”'级联');

正如我们在两个过滤器的级联的滤波器响应的滤波器响应中看到,这在CIC响应和补偿冷却响应之间,已经消除了通带下降。

第三级FIR小数

如前所述,GSM光谱掩模需要在100kHz时衰减18dB。因此,对于我们的第三阶段和最后阶段,我们可以尝试一个简单的平均低通滤波器。我们再次需要将系数量化为16位(默认)。此过滤器还需要减少2。

n = 62;%63水龙头Fs = 541666;% 541.666千赫成就= 80年e3;Fstop = 100年e3;规范= fdesign.decimator (2'低通'“N, Fp,置”,n,fpass,fstop,fs);给通频带更多的权重杀害多人者=设计规范,'平静'“Wpass”2,“SystemObject”,真的);

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

decimator.fullprecisoverride = false;decimator.outputdatatype =.'风俗';杀害多人者。RoundingMethod =“最近的”;杀害多人者。OverflowAction =“饱和”;杀害多人者。CustomOutputDataType = numerictype ([], -12);

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

信息(杀害多人者)
ans = 10x56 char array'离散时间fir multioriles filter(real)''---------------------------------------'过滤器结构:直接形成FIR多相排列器'抽取因子:2''多相长度:32''滤波器长度:63'稳定:是''线阶段:是(类型1)''''算术:双'

多级多型DDC滤波链

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

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

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

drawgsmmask;

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

轴([0 .09 -0.08 0.08]);

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

生成硬件描述语言(VHDL)代码

Filter Designer还支持从下面金宝app所示的对话框生成HDL代码。

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

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

现在我们有了满足规格的定点、三级、多速率过滤器,就可以生成HDL代码了。

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

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

%HCAS =级联(HCIC,HCFIR,HPFIR);WorkingDir = TempName;int = numerictype(1,20,18);generatehdl(DDC,“InputDataType”inT,......'姓名'“过滤”'目标语言'硬件描述语言(VHDL)的......'targetdirectory',fullfile(workingdir,'hdlsrc'));
### # start VHDL code generation process for filter: filter ### ##< a href = " matlab:编辑(“/ tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter_stage1.vhd ') " > / tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 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 / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter_stage2.vhd ') " > / tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter_stage2。vhd ### #开始生成filter_stage2 VHDL实体### #开始生成filter_stage2 VHDL架构### ##成功完成filter的VHDL代码生成过程:filter_stage2 ### ### ### ###< a href = " matlab:编辑(“/ tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter_stage3.vhd ') " > / tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter_stage3。vhd ###开始生成filter_stage3 VHDL实体### #开始生成filter_stage3 VHDL架构### #成功完成filter的VHDL代码生成过程:filter_stage3 ### #< a href = " matlab:编辑(“/ tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 hdlsrc / filter.vhd ') " > / tmp / Bdoc21a_1606923_234308 / tp4e2110c0_b9d4_41ad_9eb1_3fc2c664ec16 / hdlsrc /过滤器。VHDL  ###开始生成filter VHDL entity ###开始生成filter VHDL架构### #成功完成filter VHDL代码生成过程:filter ### # HDL时延是2个样本

使用Simulink中的Modelsim与Modelsim共同仿真金宝app

要验证生成的HDL代码是否与我们的Simulink模型产生相同的结果,我们将使用HDL验证程序MS共同模拟Simulink中的HDL代码。金宝app我们有一个预构建的Simulink模型,金宝app包括两个信号路径。一个信号路径产生三级多速率过滤器的Simulink金宝app的行为模型结果。另一条路径产生模拟结果,使用ModelsIm®,我们生成的VHDL代码。

open_system ('ddcfilterchaindemo_cosim');

双击Simulink模型中的按钮启动ModelSim。金宝app注意,ModelSim必须安装在系统路径上。ModelSim将自动编译HDL代码,初始化模拟并打开Wave查看器。

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

使用逻辑分析器查看结果。

验证结果

顶部的轨迹是激励啁啾信号。下一个标记为ref的信号是由三阶多速率滤波器的Simulink行为模型产生的参考信号。金宝app范围上标注为“cosim”的底部trace为三级多速率滤波器生成的HDL代码的ModelSim仿真结果。最后一个跟踪显示了Simulink的行为模型结果和ModelSim对HDL代码金宝app的仿真之间的错误。

总结

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