matlab IIR滤波

前言

        这次用matlab做IIR滤波,掉到了坑里,花了好久的功夫后,终于爬上来了,记录一下,免得下次再掉而不自知。。。

1. IIR滤波方法一

        在给定IIR滤波器参数a、b的情况下,实现IIR滤波,代码如下:

iir_obj = dsp.IIRFilter('Numerator', b,'Denominator', a); % Create the dsp.IIRFilter object and set its properties.
dout    = iir_obj(din); % The System object filters each column of the input signal independently over time.

        注意,这里的输入数据din需要以单列的方式提供,即size(din)需要是data_len x 1,因为根据matlab提供的官方说明(已摘抄在上述代码的注释中,或用help dsp.IIRFilter打开查看全部),这种方式的滤波是按照列独立滤波的。也就是说,如果输入数据的第一列为I相,第二列为Q相,可以支持一次调用IQ两路同时滤波,而互不干扰。

        这种方式的IIR滤波,在多通道时是方便了,但是在单通道滤波时,很不方便,而且还有埋坑嫌疑。因为还需要特意关注输入数据格式,即是否需要转置后再输入数据,如果遗漏转置的话,或者说输入数据为单行时,虽然代码能正常跑起来,不报错,但是却没有真正实现滤波,这个就像给自己埋了个雷,不知道啥时候会炸,所以,不推荐这种IIR滤波方法。(因为已经被炸过一回,有了惨痛的教训!为了避免以后再掉坑里,必须这次记下来!)

        由于matlab中可以用x(:)的方式将x变为列向量。尤其是当你不知道输入是列还是行向量时,总是用x(:)的方式是一个避坑的好方法。所以,在单行或者单列的时,直接统一先用x(:)的方式处理下,代码如下:

iir_obj = dsp.IIRFilter('Numerator', b,'Denominator', a); % Create the dsp.IIRFilter object and set its properties.
dout    = iir_obj(din(:)); % The System object filters each column of the input signal independently over time.

2. IIR滤波方法二       

dout = filter(b, a, din);

        第一种IIR滤波方法不行,那么怎么办呢?用这种!简单还好用。

        经检验,输入数据单行、单列的方式,都可以有效滤波。(所以说代码写得炫,未必好用。。。)

你可能感兴趣的:(matlab,matlab)