System Generator的FIR Compiler 7.2 1滤波器增益修正
前言:
本文主要介绍了基于基于System Generator的FIR Compiler 7.2 1的原理与使用方法,之后再详细介绍如何修正fir滤波器的输出,使得增益为1,最后说明如何实现抽样滤波器。使用的软件是System Generator 2018.3(基于vivado 2018.3)与matlab2018a。
1. FIR Compiler 7.2 1滤波器使用方法
FIR Compiler 7.2 1模块图如图。
下面详细介绍配置界面:
1.基本设置
在设置滤波器的组数时,如果有多组系数,那默认的系数长度是一样的,比如我们有102个系数,设置为3组,那么第[0-33]个系数表示第一组滤波器,第[34-67]个系数表示第二组滤波器,第[68-101]个系数表示第三组滤波器。此时FIR-IP的接口会有所变化,增加了几个用于选择系数的接口,其中config tdata_fsel的位宽是2,因为我们有3组系数,0表示第一组,1表示第二组,2表示第三组。在每次选择系数时,config_tvalid信号也要相应置位一下。
2.设置通道数,路径数,采样滤倍数
3.滤波器系数量化,结构和输出截位
4.接口
2. 输出增益修正
仿真设定:
输入为5+20MHZ,采样率100MHZ。设置如下滤波器,滤除输入信号中的20M信号,留下5M信号。
滤波器配置:
查看单纯的滤波器刚出来的输入输出,可以看到20MHZ已经被滤除,但是输出幅度却与输入差距很大,因此我们需要对输出手动截位修正增益,而如何截位就是接下来要考虑的
方法1:整数系数法,只对输出移位
我们知道,FIR滤波器的分母为1,分子的和即为滤波器的增益,而我们设置的滤波器系数即为分子。
在定点量化时,如果滤波器系数的和为N,那么增益即为N。因此理论上,我们是把系数的和量化为2^N,再将滤波后的结果右移N位,即可抵消N的作用,实现增益为1。
1.首先将滤波器系数导出到matlab
可以看到已经成功导出
2.接着量化滤波器系数
求和NUM,sum(Num)==1.0687,可以看到增益不为1,这时我们将其定点量化为coef = floor(Num*2^15); sum(coef)==34974≈32768(2的15次方) ,再将滤波后再将结果右移15位,即可实现增益大致为1。
其中coef’ 配置fir整数滤波器系数,输出波形如图:
figure;plot(sigin1);hold on;plot(sigout1,‘r’);
=10000;max(sigout1)=10502;
增益为10502/10000 = 105.02%,多了5%,可以接受。
输出仍然会略大于输入,有两方面原因
① sum(coef)==34974>32768(2^15) 单纯移15位不能完全补偿差距。
②使用fvtool(coef)查看滤波器的幅频响应,放大通带部分可以看到即使在通带,也有些许幅值变化影响增益。
需要注意fir滤波器设置选择整数系数量化
方法2:归一化的小数系数
FIR滤波器的分母为1,分子的和即为滤波器的增益。
还是上式滤波器,对导出的Num求和sum(Num)==1.0687 ,可以看到增益不为1。
进行归一化操作:
coef_norm=Num/sum(Num);
coef_norm’
再对coef_norm求和sum(coef_norm)==1,可以看到增益已经被修正为1。
在将该参数导入滤波器系数,并配置fir第三页参数
对输出的移位与提示的小数位(这里是17)一样,再取低16位转为有符号数,可以看到增益非常接近1。
至于为什么不是1,仍然是使用fvtool(coef)查看滤波器的幅频响应,放大通带部分可以看到即使在通带,也有些许幅值变化影响增益。
输出输入与输出最大值:
max(sigin2)=10000;max(sigout2)=9826;
增益为9826/10000 = 98%,只有2%的损失,可以接受,同时与整数系数的5%相比更小,所以更推荐使用小数系数化。
3. 用作抽样滤波器
FIR Compiler 7.2 1滤波器也可以实现抽样滤波功能。
输入为5+20MHZ,采样率100MHZ。设置滤波器如上一致,滤除输入信号中的20M信号,留下5M信号。
输入5MHZ,采样率100MHZ, 一个T20个点
抽取2倍 一个T10个点
抽取4倍 一个T5个点
4. 多滤波器组选择使用
我们可以使用一个FIR Compiler 7.2 模块实现多个滤波器设置效果:
例如:
我们需要实现五个滤波器选择,通带分别为0.1M,0.5M,1M,2M,4M
搭建以下模块:
4.1 配置五个滤波器系数
这是其中俩个例子
4.2 配置使用FIR Compiler 7.2 模块
接着使用FIR Compiler 7.2 模块,在滤波器系数项填写所有滤波器,并且种类数量填写对应数量。
[xlfda_numerator(‘filter_0.1M’),xlfda_numerator(‘filter_0.5M’),xlfda_numerator(‘filter_1M’),xlfda_numerator(‘filter_2M’),xlfda_numerator(‘filter_4M’)]
这里我们大概率设置好后会报错,意思是“Number of Coefficient Sets必须为系数总数621的除数”,意思就是填写的五个滤波器系数总和为621,然后滤波器种类数量必须为该数据的因子数。
注意:系数总数621=sum(每个滤波器系数长度+1)
这儿我们有两种办法:
1.确认系数集数目是否为621的因数
621的因数包括:1,3,9,23,27,69,207,621
若当前设置的系数集数目(如5)不在上述列表中,需将其调整为最近的因数,例如改为3,9或者23,然后调用的时候不调用后面多余的滤波器数目即可,不过这样可能会多占用资源。
2.调整总系数数目(若必须使用特定系数集数目)
例如,若需使用5个系数集,需确保总系数数目是5的倍数。可将总数从621调整为620(5x104),即调整滤波器系数长度那一项。
4.3 方法二修正总系数实现
使用方法二,修改为620系数长度后,配置完毕,进行验证,选择第一个滤波器,结果如图,可以看到滤波后只剩下0.1M信号
再调整输入0.5M+2M,选择第二个滤波器,结果如图,可以看到滤波后只剩下0.5M信号
但是两次测试输出不太对,都没有完全滤除信号
经过测试发现滤波器系数需要等长,该模块会自动按比例分配每个滤波器系数长度,而不是读取滤波器自己设置的长度
修正每个滤波器系数等长为99后输出为,可以看出正确输出0.5M信号,滤除了2M信号