一种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 进行授权