利用Matlab的filterbuilder生成IIR滤波器参数如下:
>> filterbuilder
The variable 'Hlp' has been exported to the workspace.
>> Hlp
Hlp =
FilterStructure: 'Direct-Form II, Second-Order Sections'
Arithmetic: 'double'
sosMatrix: [13x6 double]
ScaleValues: [0.465985780077502;1;1;1;1;1;1;1;1;1;1;1;1;1]
OptimizeScaleValues: true
PersistentMemory: false
有用信息为 sosMatrix和ScaleValue。利用fdatool向外导出的也是这两个参数。
sosMartrix为一系列二阶滤波的参数,这些滤波器串联即为当前的IIR滤波器;而ScaleValues则是sosMartrix这些滤波器的增益。
>> Hlp.sosMatrix
ans =
0.3523 0.7046 0.3523 1.0000 -0.1806 0.5304
0.3724 0.7449 0.3724 1.0000 -0.1369 0.1602
0.2986 0.5971 0.2986 1.0000 -0.1203 0.0195
0.4716 0.4716 0 1.0000 -0.0592 0
0.2876 0.5752 0.2876 1.0000 -0.1262 0.0694
0.1272 0.2543 0.1272 1.0000 -0.1541 0.3054
0.2577 0.5154 0.2577 1.0000 -0.2222 0.8826
0.3837 0.7674 0.3837 1.0000 -0.1659 0.4057
0.4242 0.8484 0.4242 1.0000 -0.1309 0.1090
0.3007 0.6015 0.3007 1.0000 -0.1189 0.0075
0.2701 0.5401 0.2701 1.0000 -0.1227 0.0399
0.2238 0.4477 0.2238 1.0000 -0.1446 0.2248
0.4153 0.8305 0.4153 1.0000 -0.1990 0.6862
>> Hlp.ScaleValues
ans =
0.4660
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
此时完整的IIR滤波器Z变换表达式为:
利用fvtoll观察滤波器的频率响应
>> fvtool(Hlp)
利用sos2tf生成滤波器a,b参数,并利用freqz观察频率响应
>> [b,a]=sos2tf(Hlp.sosMatrix,Hlp.ScaleValues);
>> freqz(b,a)
手动计算滤波器的a,b参数,并利用freqz观察频率响应
>> b2=Hlp.sosMatrix(1,1:3);
>> for n=2:length(Hlp.sosMatrix), b2=conv(b2,Hlp.sosMatrix(n,1:3));end
>> a2=Hlp.sosMatrix(1,4:6);
>> for n=2:length(Hlp.sosMatrix), a2=conv(a2,Hlp.sosMatrix(n,4:6));end
>> freqz(b2,a2)
>> b2=b2*prod(Hlp.ScaleValues)
>> freqz(b2,a2)