以99阶FIR低通滤波器为例,学习使用matlab的fdatool工具箱设计滤波器,并将滤波器系数导出到.coe文件,联合Vivado进行FPGA的FIR滤波器设计。
本文滤波器参数为:低通FIR滤波器,窗函数设计,采用布莱克曼窗,99阶,抽样频率32MHz,通带频率1.5MHz,使用窗函数时截止频率不需要设定,根据选定的窗函数和阶数决定截止频率。
1. 打开matlab
2.命令行输入fdatool,回车,打开fdatool滤波器设计工具箱
打开后的初始界面如下:
1处选定滤波器类型(低通、高通、带通、带阻);
2处选择要设计IIR(无限冲激响应)滤波器还是FIR(有限冲击响应)滤波器,并且选择使用哪种方法设计对应的滤波器;
3处设计滤波器的阶数,一般阶数越多滤波效果越好,但是系数对应的也越多,在FPGA硬件实现的时候会占用更多的资源,设计时要综合考虑;
3.设计所需滤波器
低通(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))。
4.参数量化
使用16位的滤波器参数,定点数表示。
点击左侧第三个框,进行参数量化,在FPGA中计算浮点数是很麻烦的事情,并且浮点数的操作在射频输出时会影响功放性能,此处设置为定点数(一般都是设为定点数处理,设成浮点数可以试一下,是无法导出为Xilinx设计所需的.coe文件)。这里进行量化时就会引入量化误差,位数越少误差越大,但是位数越多在FPGA硬件中所需的资源也越多,设计中也是需要综合考虑,此处选择16位定点数量化(Fixed-point)。
5.导出参数
(1)导出参数到matlab
回到设计界面(不回去也不影响导出参数,此处为了更方便观看滤波器的参数),再点击 Export,即可导出参数到 matlab,导出一个名为 Num 的数组,名字可以自己修改,在命令行输入 Num 再回车即可观察系数。
(2)导出参数到Xilinx的存储文件(.coe文件)
点击 Targets -> XILINX Coeffient(.coe) File,
导出的参数共有 100 个,可以发现这样设计出来的时对称结构的FIR滤波器,第一个参数和第 100 个参数一样,第 2 个和第 99 个一样,依次对应。
作者:FPGA探索者