我是参照这篇文章来的
juneja.blog.hexun.com/60023348_d.html
FDATool中IIR设计及系数导出 [原创 2008-11-11 14:56:00]
字号:大 中 小
IIR滤波器的设计
书上的IIR都是先说用模拟滤波器转到数字,但是现在有了MATLAB,这种方法只用了解,现在没有谁会有耐心去先查表,再搞s方程,再双线性变换,还要预畸变,这么一长串东西搞下来,不晕也要吐了。
1.MATLAB中fdatool,选择direct form II(MATLAB默认),一方面是因为directform I要更多的内存,另一方面是由于direct form I先和分子发生运算,而分子又很小,导致精度达不到要求。
2.使用Matlab的FDAtool工具可以很方便地IIR设计滤波器。使用File菜单中的export选项可以把滤波器的参数输出到Matlab的工作空间中。若滤波器为IIR型,则输出的变量名为G和SOS。它把高阶的IIR滤波器转换为一系列二阶IIR滤波器的级联。SOS为二阶IIR滤波器的系数(b,a),G为各级的增益系数,可用来调节各级通带的衰减。计算IIR滤波器的输出的时候,先将输入数据乘以G, 然后一一通过SOS中的每个IIR滤波器,就得到最终的结果了。
SOS的每一行表示一级二阶IIR滤波器系[b0,b1,b2,a0,a1,a2],G的每个元素表示相应级的增益系数。也即将G乘上SOS的b0,b1,b2。得到一组新的滤波器系数SOS',可调用MATLAB滤波函数sosfilt对输入信号进行滤波。
但是如果二阶IIR滤波器的程序只支持定点小数运算的话,那么就需要调整一下系数了。因为设计出来的G有时候很小(不知道会不会很大),这样一旦把输入数据乘以G后,就会使得二阶IIR滤波器的输入过小,造成很大的误差。我们需要把G分配到每个二阶IIR滤波器的系数中,使得每次得到的中间结果都刚好不会溢出。若以IIRi表示第i个二阶IIR滤波器的话,则我们需要保证IIR1, IIR1 * IIR2, IIR1 * IIR2 * IIR3, … 的频率响应都不超过0dB,*号表示级联。为了使得输出的精度最好,我们还需要让上面这些滤波器的频率响应中的最大值最接近0dB。
|