MATLAB IIR数字滤波器设计
首先我们要明白相关的概念。
数字滤波器设计采用角频率,如何与实际信号频率对应?
角频率w,采样频率fs ,实际信号频率f的转换关系为:
W = 2*pi* f / fs
采样频率的角频率为 2 *pi.
数字滤波器的指标,以低通为例【见下图】:
当我们设计的滤波器是带通的时候。其通带截止频率有两个,阻带截止频率也有两个。截止频率还有另外一个称谓,即边沿频率。
FIR 滤波器可以设计为线性相位,并且总是稳定的。在多数情况下,FIR滤波器的阶数 NFIR 显著大于具有等效幅度响应的IIR滤波器阶数NIIR 。NFIR/NIIR 通常为10的量级或更高. IIR 滤波器通常计算更简便。 在很多应用中,并不要求滤波器具有严格的线性相位,在这些情况下,通常会因计算简便而选择IIR滤波器。例如在很多语音编码当中的滤波器很多都是IIR滤波器,均衡器一般也用IIR滤波器。也就是说对实时性要求不是很高的场合可以考虑使用FIR滤波器,当FIR滤波器阶数较长时,可以考虑用FFT去计算。
在设计IIR滤波器时,通常将数字滤波器的设计指标转化成模拟低通原型滤波器的设计指标,从而确定满足这些指标的模拟低通滤波器的传输函数Ha(s),然后再将它变换成所需要的数字滤波器传输函数G(z)。
上述滤波器设计的过程只需要了解其原理。借助于MATLAB强大的工具,滤波器的设计变得比较简单了。
在MATLAB命令窗口中键入fdatool, 你将启动滤波器设计的图形界面。你可以从simulink中直接选择数字滤波器控件而启动。
本文主要讲述IIR数字滤波器设计的方法。
对从麦克风进来的信号滤波。
假定我们要把50hz的电频干扰去掉,同时人说话的频率一般不会超过3400hz。我们设计一个带通滤波器,通带为【80-3200】,采样率为8k。
根据上面的需求,我们把相关的参数改成下面的界面:
单击 Design Filter,数秒之后显示如下:
可以看出:滤波器的阶数是36,还有一个 sections: 18. 由于在具体实现时一般是以2阶的级联或并联去实现的。所以实际上分为18个2阶节去实现。
36阶是系统计算出的满足需求的最小阶了。我们也可以自己事先制定阶数,参数如下:
这时,截止频率衰减参数已经没法选了,被固定为3分贝:
最终计算的幅度响应如下:
我们需要把设计的滤波器系数保存下来,以供其它程序调用。
MATLAB提供了直接导出系数的方法。
【targets】->【generate C header】
可以修改如下,选择【Generate】
在MATLAB工作目录下可以找到你生成的系数文件,大概是下面这个样子的:
这个文件让人看的不太懂。返回fdatool设计界面选择【Analysis->Filter coeffcients】:
系数界面与这个文件里面的数据是一致的。
认真观察上面这个界面里的数据,我们发现,文件里面的系数,实际上把它分成两个2阶节相乘的形式,其中还有增益。增益的目的是为了保证计算的精度和系统的稳定性。
选择【edit】->【convert to single section】,这时候系数变成我们熟悉的形式:
生成的系数C头文件如下:
指定阶数为2,重复上述步骤生成的IIR滤波器系数文件如下:
OK,到此结束。