文章

一种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)=\frac{b_0+b_1z^{-1}+b_2z^{-2}}{a_0+a_1z^{-1}+a_2z^{-2}}\]

其中参数\(a_0=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]=b_0x[n]+b_1x[n-1]+b_2x[n-2]-a_1y[n-1]-a_2y[n-2]\] \[y[n]=y[n]/a_0\]

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

\[y[n]=b_0 \omega[n]+b_1 \omega[n-1]+b_2 \omega[n-2]\]

其中:

\[\omega[n]=x[n]-a_1 \omega[n-1]-a_2 \omega[n-2]\] \[\omega[n] = \omega[n] / a_0\]

对于分子分母调节不一致的情况,传递函数相对于原来的增益了\(\frac{M}{N}\)倍,那么计算结果还需要乘上\(\frac{N}{M}\)

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