文章

一种IIR滤波器参数整形化方式

前提提示:

改方式仅适用于对滤波器要求不是很高,浮点数转整型必定会存在精度丢失,转换完成之后需要判断滤波器是否稳定。

以一个matlab设计的滤波器为例:

1
2
3
采样率为:100hz
截止频率为:15hz
设计一个2阶IIR巴特沃斯滤波器

设计结果导出:

1
2
3
SOS=[1	2	1	1	-0.747789178258503	0.272214937925007]
G=[0.131106439916626
   1]

因为为二阶滤波器,就只有一级,其中G(1)对应于这一级滤波器的增益。

1
2
其中SOS(1:3)为传递函数的分子(numerator),对应于传递函数的b值,需要乘上增益G
    SOS(4:6)为传递函数的分母(denominator),对应于传递函数的a值

二阶滤波器的传递函数为:

H(z)=b0+b1z1+b2z2a0+a1z1+a2z2

其中参数a0=1;

对于滤波器的作用,y(n)=x(n)H(z)


如果对传递函数进行一些缩放,是否可以将[b,a]的传递函数调整为整数类型呢?

matlab生成的滤波器一般采用级联的方式来设计的,每一级为一个二阶滤波器,可以设法将传递函数的分子分母系数调节为整数。

对分母进行放大处理,相当于对整个传递函数进行了缩小,如对于分母的系数乘上100,就相当于传递函数缩小了100.

对分子进行放大处理,相当于对整个传递函数进行了放大,如对于分母的系数乘上100,就相当于传递函数放大了100.

测试对于巴特沃斯滤波器来说生成的分子b值一般为[1,2,1]再乘上增益G,其他滤波器不是这样的。所以其他滤波器调节传递函数的参数就需要更麻烦一些。


对于上面生成的滤波器参数:

1
2
3
4
5
6
7
8
b=[1	2	1] * 0.131106439916626
a=[1	-0.747789178258503	0.272214937925007]

假设b值为[1 2 1],那么b值进行了(1/0.131106439916626)倍放大,
对于a值也进行(1/0.131106439916626)倍放大,a=[7.62739039086048	 -5.70367999263837	2.07628960177788]
对a值进行四舍五入,得a=[8 -6 2]

对于进行整形化设计的滤波器值导入到matlab中,使用freqz函数或者fvtool函数查看滤波器的频率响应,在误差范围内就可以。

对于b值不是整型的滤波器,采用分子分母分别进行整型化处理,加入分子放大了M倍,分母放大了N倍,那么整体就放大了(M/N)倍。

对于所有整型化的滤波器参数,都需要和原设计的滤波器进行对比,确保误差在可接受范围内。

因对滤波器的分子分母进行了调节,那么肯定a0值不为1,在计算的时候需要考虑a0对结果的影响。

对于直接1型,考虑它的传递结构,因此它的计算方式为:

y[n]=b0x[n]+b1x[n1]+b2x[n2]a1y[n1]a2y[n2] y[n]=y[n]/a0

对于直接2型,考虑它的传递结构,因此它的计算方式为:

y[n]=b0ω[n]+b1ω[n1]+b2ω[n2]

其中:

ω[n]=x[n]a1ω[n1]a2ω[n2] ω[n]=ω[n]/a0

对于分子分母调节不一致的情况,传递函数相对于原来的增益了MN倍,那么计算结果还需要乘上NM

本文由作者按照 CC BY 4.0 进行授权