本文转载自:FPGA探索者微信公众号
以99阶FIR低通滤波器为例,学习使用matlab的fdatool工具箱设计滤波器,并将滤波器系数导出到.coe文件,联合Vivado进行FPGA的FIR滤波器设计。
本文滤波器参数为:低通FIR滤波器,窗函数设计,采用布莱克曼窗,99阶,抽样频率32MHz,通带频率1.5MHz,适用窗函数时截止频率不需要设定,根据选定的窗函数和阶数决定截止频率。
1. 打开matlab
命令行输入fdatool,回车,打开fdatool滤波器设计工具箱
打开后的初始界面如下:
1处选定滤波器类型(低通、高通、带通、带阻);
2处选择要设计IIR(无限冲激响应)滤波器还是FIR(有限冲击响应)滤波器,并且选择使用哪种方法设计对应的滤波器;
3处设计滤波器的阶数,一般阶数越多滤波效果越好,但是系数对应的也越多,在FPGA硬件实现的时候会占用更多的资源,设计时要综合考虑;
4处设计滤波器的抽样频率Fs,通带频率Fpass和截止频率Fstop;
2. 设计所需滤波器
低通(Lowpass),FIR滤波器,窗函数设计(Window),采用布莱克曼窗(Blackman),99阶(会有100个系数,这个是固定的,N阶FIR需要N+1个系数),抽样频率32MHz,通带频率1.5MHz,适用窗函数时截止频率不需要设定,根据选定的窗函数和阶数决定截止频率。
按照上图设定参数后,点击Design Filter。
设计完成后,黄色框内显示幅频响应曲线,可以看到,使用Fs=32MHz的抽样频率,显示的频率为0~Fs/2即0-16MHz的幅频响应,大概在2MHz左右幅度下降为原来的-60dB以下,换算成幅度即1/1000以下(-60dB=20log(1/1000))。
3. 参数量化
使用16位的滤波器参数,定点数表示。
点击左侧第三个框,进行参数量化,在FPGA中计算浮点数是很麻烦的事情,并且浮点数的操作在射频输出时会影响功放性能,此处设置为定点数(一般都是设为定点数处理)。这里进行量化时就会引入量化误差,位数越少误差越大,但是位数越多在FPGA硬件中所需的资源也越多,设计中也是需要综合考虑,此处选择16位定点数量化(Fixed-point)。
16位定点数量化,其他参数保持默认,此处其实默认是16位,也就是选择了定点数之后所有的保持默认就复合要求,所以工具箱会认为你没有设置,下方的apply按钮就是灰色的,无法进行应用。
所以此时可以随便点个参数改下再改回来,比如把16改成15再改回16,这样apply就会能点击了。
点击apply,在右上方可以看到量化之后和未量化的差别,可以看到实线部分是16位量化后的幅频特性曲线,虚线部分是未量化的幅频特性曲线,量化之后在4MHz以后的阻带衰减不如原来的衰减大,但是实际上量化后也能衰减到-100dB,从幅度上来讲是原来的1/(10^5),这个衰减程度也已经足够了,所以使用16位量化对于滤波器的滤波效果几乎没有什么影响。
如下图,只用4位数据去量化的时候,阻带衰减的就不是很好了,如果误差要求高的时候就会残留高频信号。
4. 导出参数
(1)导出参数到matlab
如下图,先点击1处的按钮回到设计界面(不回去也不影响导出参数,此处为了更方便观看滤波器的参数),再点击2处File -> Export,弹出3处所示的小界面,点击3处界面里的Export即可导出参数到matlab,导出一个名为Num的数组,名字可以自己修改,在命令行输入Num再回车即可观察系数。
(2)导出参数到Xilinx的存储文件(.coe文件)
点击Targets -> XILINX Coeffient(.coe) File,
设置文件名称(最好不要有中文和特殊字符)。
导出的参数共有100个,可以发现这样设计出来的时对称结构的FIR滤波器,第一个参数和第100个参数一样,第2个和第99个一样,依次对应。