第6章 FIR数字滤波器设计 6.1 FIR数字滤波器原理 6.2 使用DSP Builder设计FIR数字滤波器 6.3 使用FIR IP Core设计FIR滤波器
6.1 FIR数字滤波器原理 对于一个FIR滤波器系统而言,它的冲激响应总是有限长的,其系统函数可以记为
其中M是FIR滤波器的零点数,即延时节数,为叙述简便,在本章中M被称为FIR滤器的阶数。最基本的FIR滤波器可用下式表示: 其中x(n)是输入采样序列,h(i)是滤波器系数,L是 滤波器的系数长度,y(n)表示滤波器的输出序列。 也可以用卷积来表示输出序列y(n)与x(n)、h(n)的关系。
图6-1中显示了一个典型的直接I型4阶FIR滤波器,其输出序列y(n)满足下列等式:
图6-1 4阶FIR滤波器结构
在这个FIR滤波器中,总共存在3个延时节,4个乘法单元,一个4输入的加法器。如果采用普通的数字信号处理器(DSP Processor)来实现,只能用串行的方式顺序地执行延时、乘加操作,这不可能在一个DSP(指数字信号处理器)指令周期内完成,必须用多个指令周期来完成。 但是,如果采用FPGA来实现,就可以采用并行结构,在一个时钟周期内得到一个FIR滤波器的输出。
6.2 使用DSP Builder设计FIR数字滤波器 使用DSP Builder可以方便地在图形化环境中设计FIR数字滤波器,而且滤波器系数的计算可以借助Matlab强大的计算能力和现成的滤波器设计工具来完成。 6.2.1 3阶常系数FIR滤波器的设计 在此用以下示例来说明整个设计过程。 假定一个3阶的FIR滤波器,其可以表示为
其中:h(0)=63,h(1)=127,h(2)=127,h(3)=63,是量化时附加的因子。 这里采用直接I型来实现该FIR滤波器。设计好的3阶直接I型FIR滤波器模型图可以参见图6-2。具体的新模型建立、模块调用过程可以参见第3章。
图6-2 3阶FIR滤波器
图中模块的参数作如下设置: xin模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Input port” 参数“number of bits”设为“8”
yout模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Output port” 参数“number of bits”设为“8” Parallel Adder Subtractor模块:(Parallel Adder Subtractor) 库:Altera DSP Builder中Arithmetic库 “Add(+)Sub(-)”设为“++++”
Delay1、Delay2、Delay3模块:(Delay) 库:Altera DSP Builder中Storage库 参数“Depth”设为“1” 参数“Clock Phase Selection”设为“1” h0模块:(Gain) 库:Altera DSP Builder中Arithemtic库 参数“Gain Value”设为“63” 参数“Map Gain Value to Bus Type”设为“Signed Integer” 参数“Gate Value number of bits”设为“8” 参数“Number of Pipeline Levels”设为“0”
h1模块:(Gain) 参数“Gain Value”设为“127” 其余同h0模块 h2模块:(Gain) h3模块:(Gain) 参数“Gain Value”设为“63”
由于FIR滤波器的系数已经给定,是一个常数,从图中看到,在DSP Builder中可以用Gain(增益)模块来实现的运算,用延时Delay模块来实现输入信号序列的延时。 设计完3阶FIR滤波器模型后,就可以添加Simulink模块进行仿真了,如图6-3所示。
图6-3 带仿真模块的3阶滤波器模型
新增的仿真模块的参数作如下设置: Chirp Signal模块:(Chirp Signal) 库:Simulink中Sources库 参数“Initial Frequency(Hz)”设为“0.1” 参数“Target time”设为“10” 参数“Frequency at target time(Hz)”设为“1” 参数“Interpret vectors parameters as 1-D”选中
Gain模块:(Gain) 库:Simulink中Math Operations库 参数“Gain”设为“127” 参数“Multiplication”设为“Element wise(K.*u)” Scope模块:(Scope) 库:Simulink中sinks库 参数“Number of Axes”为“2”
其中,Chirp Signal模块为线性调频信号发生模块,生成一个线性调频信号0.1 Hz~1 Hz。 在该模型仿真中,使用默认的仿真参数。 仿真结果如图6-4所示。显然,一个线性调频信号通过3阶FIR滤波器后幅度发生了变化,频率较高部分的幅度被衰减了。
图6-4 FIR滤波器仿真结果
6.2.2 4阶FIR滤波器节的设计 上节介绍的是常系数FIR滤波器的示例。本节将设计一个系数可变的FIR滤波器节。对于直接I型的FIR滤波器(结构见图6-5),是可以级联的。也就是说,在滤波器系数可变的情况下,可以预先设计好一个FIR滤波器节,在实际应用中通过不断地调用FIR滤波器节,将其级联起来,用来完成多阶FIR滤波器的设计。当然,对于线性相位的FIR滤波器,我们可以采用改进后的滤波器结构,可以节省一半的乘法器。在这里,为了叙述方便,没有采用改进后的FIR结构。
图6-5 直接I型FIR滤波器结构
图6-6是一个直接I型的4阶FIR滤波器节的结构。为了使该滤波器节的调用更为方便,在xin输入后插入了一个延时单元,由3阶滤波器演变成4阶的,不过常系数项(系数项) 恒为0。由于在通信应用中,FIR滤波器处理的往往是信号流,因而增加一个延时单元不会影响FIR滤波器处理的结果,只是系统延时增加了一个时钟周期。
图6-6 直接I型4阶FIR滤波器节
对于该FIR滤波器节,其系统函数可以用下式来表示: 由于浮点小数在FPGA中实现比较困难,实现的代价太大,因而在DSP Builder中不妨使用整数运算来实现,最后用位数舍取的方式得到结果。为了使参数可变,FIR滤波器系数、、、也作为输入端口。在本设计中输入序列的位宽设为9位。 图6-7显示的就是一个设计好的4阶FIR滤波器节,与图6-2的常数FIR滤波器相比,这里用Product(乘法)模块代替了Gain(增益)模块。
图6-7 直接I型4阶FIR滤波器节
图6-7中相关模块的参数设置如下: xin、hn1、hn2、hn3、hn4模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Input port” 参数“number of bits”设为“9”
yn模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Output port” 参数“number of bits”设为“20” xn4模块:(Altbus) 参数“number of bits”设为“9”
Parallel Adder Subtractor模块:(Parallel Adder Subtractor) 库:Altera DSP Builder中Arithmetic库 参数“Add(+)Sub(-)”设为“++++” 使用“Pipeline” 参数“Clock Phaese Selectioon”设为“1” Delay、Delay1、Delay2、Delay3模块:(Delay) 库:Altera DSP Builder中Storage库 参数“Depth”设为“1” 参数“Clock Phase Selection”设为“1”
Product模块:(Product) 库:Altera DSP Builder中Arithemtic库 参数“Pipeline”设为“2” 参数“Clock Phase Selection”设为“1” 不选择“Use LPM”
6.2.3 16阶FIR滤波器模型设计 利用以上设计的4阶FIR滤波器节可以方便地搭成阶直接I型FIR滤波器(注意: )。比如要实现一个16阶的低通滤波器,可以调用4个4阶FIR滤波器节来实现。 1. 设计4阶FIR滤波器节子系统 建立一个新的DSP Builder模型,复制上节的FIR4tap模型到新模型。按照第4章所示的方法由FIR4tap模型建立子系统(SubSystem),并对端口信号进行修改,把子系统更名为fir4tap,如图6-8所示。fir4tap的内部结构如图6-9所示。
图6-8 fir4tap子系统
图6-9 fir4tap子系统内部原理图
2. 组成16阶FIR滤波器模型 复制4个fir4tap,并将它们衔接起来。前一级的输出端口x4接后一级的x输入端口,并附加上16个常数端口,作为FIR滤波器系数的输入。把4个子系统fir4tap的输出端口y连接起来,接入一个4输入端口的加法器,得到FIR滤波器的输出yout。 注意:在作好子系统后,要按照第4章中所述的方式,修改其Mask参数Mask Type为“SubSystem AlteraBlockSet”。设计好的16阶FIR滤波器如图6-10所示。
图6-10 16阶直接I型FIR滤波器模型
16阶直接I型FIR滤波器模型中,对新增加的模块作如下设置: xin模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Input port” 参数“number of bits”设为“9”
yout模块:(Altbus) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“signed Integer” 参数“Node Type”设为“Output port” 参数“number of bits”设为“20” x16模块:(Altbus) 参数“number of bits”设为“9”
Parallel Adder Subtractor模块:(Parallel Adder Subtractor) 库:Altera DSP Builder中Arithmetic库 参数“Add(+)Sub(-)”设为“++++” 使用“Pipeline” 参数“Clock Phaese Selectioon”设为“1” h0、h1、h2、h3、h4、h5、h6、h7、h8、 h9、h10、h11、h12、h13、h14、h15模块:(Delay) 库:Altera DSP Builder中Bus Manipulation库 参数“Bus Type”设为“Signed Integer” 参数“number of bits”设为“9”
6.2.4 使用MATLAB的滤波器设计工具 1. 滤波器指标 若需要设计一个16阶的FIR滤波器(),给定的参数如下: ● 低通滤波器 ● 采样频率Fs为48 kHz,滤波器Fc为10.8 kHz ● 输入序列位宽为9位(最高位为符号位) 在此利用MATLAB来完成FIR滤波器系数的确定。
2. 打开MATLAB的FDATool MATLAB集成了一套功能强大的滤波器设计工具FDATool(Filter Design & Analysis Tool),可以完成多种滤波器的设计、分析和性能评估。 点击MATLAB主窗口下方的“Start”(开始)按钮,按图6-11选择“ToolBox”→“Filter Design”→“Filter Design & Analysis Tool(FDATool)”,打开FDATool,如图6-12所示。
图6-11 打开FDATool
图6-12 FDATool界面
3. 选择Design Filter FDATool界面左下侧排列了一组工具按钮,其功能分别如下所述: 滤波器转换(TransForm Filer) 设置量化参数(Set Quantization Parameters) 实现模型(Realize Model) 导入滤波器(Import Filter) 设计滤波器(Design Filter) 选择其中的按钮,进入设计滤波器界面,进行下列选择:
● 滤波器类型(Filter Type)为低通(Lowpass); ● 设计方法(Design Method)为FIR,采用窗口法(Window); ● 滤波器阶数(Filter Order)定制为15; ● 窗口类型为Kaiser,Beta为0.5; ● Fs为48 kHz,Fc为10.8 kHz。 设置好后的界面见图6-13。 注意:在滤波器阶数选择时,在此设置的是15阶,而不是16阶!这是由于在前面设计的16阶FIR滤波器的常系数项。其系统函数可用下式来表示:
图6-13 滤波器设计界面
显然上式可以写成: 即可以看成是一个15阶的FIR滤波器的输出结果经过了一个单位延时单元。所以在FDATool中把它当成15阶FIR滤波器来计算参数。点击,让MATLAB计算FIR滤波器系数并作相关分析。
4. 滤波器分析 计算完FIR滤波器系数后,往往需要对设计好的FIR滤波器进行相关的性能分析,以便了解该滤波器是否满足设计要求。分析操作步骤如下: 选择FDATool的菜单“Analysis”→“Magnitude Response”,启动幅频响应分析。图6-14显示了滤波器的幅频响应图,x轴为频率,y轴为幅度值(单位为dB)。 在图的左侧列出了当前滤波器的相关信息:
● 滤波器类型为Direct form FIR(直接I型FIR滤波器); ● 滤波器阶数为15。 注意:不是每种FIR滤波器设计方法计算出的滤波器都是直接I型结构的。如果在DSP Builder中设计的FIR滤波器为直接I型结构,那就必须保证在这里显示的FIR滤波器结构为“Direct form FIR”。
图6-14 FIR滤波器的幅频响应
选择菜单“Analysis”→“Phase Response”,启动相频响应分析。图6-15显示了滤波器的相频响应。由图可以看到设计的FIR滤波器在通带内其相位响应为线性的,即该滤波器是一个线性相位的滤波器。 图6-16显示了滤波器幅频特性与相频特性的比较。这可以通过菜单选择“Analysis”→“Magnitude & Phase Response”来启动分析。 选择菜单“Analysis”→“Group Delay Response”,启动群延时分析,波形如图6-17所示。
图6-15 FIR滤波器的相频响应
图6-16 幅频响应与相频响应的比较
图6-17 FIR滤波器的群延时
在菜单“Analysis”下还有一些分析: ● “Impulse Response”:冲激响应,见图6-18。 ● “Step Response”:阶跃响应,见图6-19。 ● “Pole/Zero Plot”:零极点图,见图6-20。 由于直接I型FIR滤波器只有零点,所以在图6-20中不存在极点。
图6-18 FIR滤波器的冲激响应
图6-19 FIR滤波器的阶跃响应
图6-20 FIR滤波器的零极点
求出的FIR滤波器的系数可以通过选择菜单“Analysis”→“Filter Coefficients”来观察,见图6-21。图中列出了FDATool计算的15阶直接I型FIR滤波器的部分系数。
图6-21 FIR滤波器系数
5. 量化 从图6-21可以看到,FDATool计算出的值是一个有符号小数,而在DSP Builder下建立的FIR滤波器模型需要一个整数作为滤波器系数。所以必须进行量化,并对得到的系数进行归一化。为此,点击FDATool左下侧的工具按钮进行量化参数设置。在设置“Turn quantization on”前选择“√”,如图6-22所示。
在滤波器的设计指标中,已经提到FIR滤波器的输入位宽是9位,表示为有符号数。在图6-22中设置前4项的量化格式(Format)为“[9 8]”,表示量化后位宽为9位,绝对值为8位;设置后2项(乘积、乘积和)的量化格式为“[18 16]”。 点击按钮,打开图6-23所示的对话框。在此量化优化设置对话框中选择相关的优化选项。 图6-24中显示了量化后的部分系数值。注意在这里系数仍是用小数表示的,不同于量化前的系数,现在其二进制表示的位数已满足量化要求。
图6-22 量化参数设置
图6-23 量化优化设置对话框
图6-24 量化后的系数值
设计的FIR滤波器在量化后滤波器的性能会有所改变,其幅频响应、相频响应也有所变化。量化在带来实现方便的同时也带来了量化噪声,图6-26显示了量化带来的噪声分析。
图6-25 量化后的幅频、相频响应
图6-26 量化后的噪声分析
6. 导出滤波器系数 为导出设计好的滤波器系数,选择FDATool菜单的“File”→“Export...”,打开导出(Export)对话框,如图6-27所示。在该窗口中,选择导出到工作区(Workspace)。这时滤波器系数就存入到一个一维变量Num中了,不过这时Num中的元素是以小数形式出现的: Num = -0.0742 0.0234 0.1133 0.0117 -0.1758 -0.0977 0.3594 0.8281 0.8281 0.3594 -0.0977 -0.1758 0.0117 0.1133 0.0234 -0.0742
图6-27 导出系数对话框
现在若要在FIR滤波器模型中使用这些数据,还需要将它们转化为整数:在MATLAB主窗口的命令窗口中键入: Num * (2^8) 得到:>> Num*(2^8) ans = Columns 1 through 10 -19 6 29 3 -45 -25 92 212 212 92 Columns 11 through 16 -25 -45 3 29 6 -19
7. 修改FIR滤波器模型添加参数 把计算出的系数逐个填入到FIR滤波器模型中,见图6-28。这样就完成了一个16阶直接I型FIR低通滤波器的设计。
图6-28 16阶低通FIR滤波器
8. 导出滤波器系数的另一种方法 按照上面介绍的导出滤波器系数的方法在FIR滤波器阶数较大时就不太方便,而且在设计要求有所变化时系数的修改极为不利。可以按照以下方法来导出: 把FIR滤波器模型中的h1~h16模块的参数“Constant Value(常数值)”设置为: Num(n)*(2^8) 其中Num同上文所述,是FDATool的导出系数,n用具体的数字来代替,如h1模块用Num(1)*(2^8),h2模块用Num(2)*(2^8)。
6.2.5 16阶FIR滤波器的硬件实现 1. 由Simulink模型转成VHDL 打开SingalCompiler,选定器件系列,把模型转成VHDL文件,具体操作步骤可以参见第3章。 2. 综合 在SignalCompiler中选择Quartus II进行综合,或者利用第三方综合工具,比如LeonardoSpectrum进行综合。图6-29显示了LeonardoSpectrum综合结果的部分RTL原理图。
3. 适配下载 如果采用Quartus II进行综合,在Quartus II中打开SignalCompiler建立的Quartus项目文件,选择具体器件,锁定管脚,完成适配后下载至FPGA开发板中。若采用其它综合工具进行综合,适配流程请参见第4章。 在FPGA开发板上加入高频信号源,验证FIR滤波器的滤波效果。
图6-29 LeonardoSpectrum综合结果
6.3 使用FIR IP Core设计FIR滤波器 对于一个面向市场和实际工程应用的系统设计,在开发速度和效率方面要求很高。然而对于一般的设计者,在短期内也不可能全面了解FIR滤波器(指在FPGA上实现)相关的优化技术,也没有必要了解过多的细节。另外,FIR滤波器的滤波系数的确定,即FIR滤波器的设计方法也是比较麻烦的,需要花费大量的精力和时间才能设计出在速度、资源利用、性能上都满足要求的FIR滤波器。
另一方面,虽然DSP Builder提供了大量的基本DSP模块,但是要了解用哪些模块可以构建一个高效的FIR滤波器仍然不是一件简单的事情。 但是,如果采用设计好的FIR滤波器的IP核,几乎可以很容易地解决以上的问题。对于IP核,在速度、资源利用、性能上往往进行过专门的优化,还提供了相关的IP应用开发工具。 Altera提供的FIR Compiler是一个结合Altera FPGA器件的FIR Filter Core,DSP Builder与FIR Compiler可以紧密地结合起来。DSP Builder提供了一个FIR Core的应用环境和仿真验证环境。
6.3.1 FIR滤波器核与DSP Builder集成 使用FIR Core之前,首先必须保证Matlab、DSP Builder、Quartus II以及IP核的本身,即FIR Compiler等工具安装正确。如果一切正常,我们可以在Simulink库管理器中看到“Altera MegaCore FIR Compiler”这个库,如图6-30所示。 MegaCore是Altera的IP Core计划中的一个组成部分,FIR Compiler作为一个MegaCore,不附带在DSP Builder和Quartus II中,需要单独向Altera公司购买或申请试用版。现在最新的FIR Compiler的版本可以支持Quartus II和DSP Builder。
图6-30 FIR Core模块
6.3.2 FIR滤波器核的使用 1. 调用FIR模块 在Simulink环境中新建一个模型,放置SignalCompiler模块和FIR模块(如图6-31)。 注意:在DSP Builder中使用FIR Compiler时,需要有SignalCompiler的支持,所以在使用配置FIR模块时,必须放置SignalCompiler模块。
图6-31 调用FIR Core
2. 配置FIR滤波器核 假定需要设计一个带通的高阶FIR滤波器,设计指标如下: ● 滤波器类型:带通(BandPass) ● 采样频率:50 MHz ● 通带:2~4 MHz ● 阶数:64 双击新模型中的FIR模块,打开FIR滤波器核的设置窗口,进行FIR滤波器参数的配置(参见图6-32)。
图6-32 确定FIR滤波器系数
在这里,设计者只要把设计要求直接输入到对应的设置框,并点击“Apply”(应用)按钮,FIR滤波器的系数就自动计算完成,并在窗口中显示出设计的FIR滤波器的幅频特性。 除了将设计指标输入外,还有一些选项可以设置,比如FIR滤波器设计时采用的窗函数类型,在这里我们设为Blackman窗。设计者不用关心这些窗口类型在FIR滤波器设计中的具体实现算法,只要观察不同的窗函数(Window)对FIR滤波器性能的影响,选定其中一种最符合设计性能要求的窗函数类型即可。
点击“Apply”按钮后在图中的右侧就显示了计算出的滤波器系数。注意在这里FIR滤波器的系数还没有被量化。设置完后点击“Next”按钮,进行下一步设置,完成系数的量化。 FIR滤波器在FPGA上进行实现时,往往需要进行滤波器系数的量化,系数以整数的面目出现在图6-33中。可以选择合适的系数的位宽,同时在设置窗口中还显示了当前滤波器的幅频响应,可用以分析系数量化对FIR滤波器性能的影响。 设计者应在满足设计要求的前提下尽可能地减少系数的位宽,以减少FPGA资源的耗费。
图6-33 FIR滤波器系数分析和量化
3. FIR滤波器结构与分析 FIR Compiler可以帮助设计者完成FIR滤波器的结构分析并生成仿真时的仿真文件。 图6-35显示了具体实现的FIR滤波器和采用的滤波器结构,以及具体用什么系列的FPGA加以实现,或实现在FPGA的哪种资源中,某些选项可以更改。 点击“Next”后进行FIR滤波器核的仿真分析,图6-36显示了在时域中表示的FIR滤波器的冲激响应。图6-37显示了阶跃响应。
图6-34 FIR滤波器的I/O设置
图6-35 FIR滤波器结构
图6-36 冲激响应
图6-37 阶跃响应
FIR Compiler在进行FIR滤波器分析的同时可以帮助设计者生成对应的仿真文件,并以多种形式出现。比如仿真用的MATLAB文件,用于Quartus II的仿真激励文件,用于HDL仿真器的TestBench文件等。 4. FIR滤波器核的硬件测试 设计好的FIR Core可以像普通的DSP Builder模块一样使用,与其它设计模块相连接,并在Simulink中进行仿真,直至使用SignalCompiler完成到VHDL的转化。最后,接着送入Quartus II进行编译、适配,完成后下载到FPGA开发板上进行硬件测试。