MATLAB:IIR滤波器的实时与滤波器(b,a,z)实现

时间:2014-04-23 04:22:38

标签: matlab filter

我试图理解为什么实时硬编码IIR不起作用,而MATLAB中已经提供的非实时IIR滤波器函数(filter())起作用。我测试的过滤器如下:

http://i.imgur.com/CDhG7Ja.png

我经历了差分方程并将其作为滤波器系数:

b = [0,2*10^-7];
a = [1,-1.98,1];

首先,我设置了一个具有不同频率的测试信号:

f_s = 44100;
t = 0:1/f_s:0.5;
y = sin(0.5*t) + sin(1500*t) + sin(100*t) + sin(5*t);

然后我通过2个不同实现的IIR滤波器过滤了这个信号:1)硬编码的IIR滤波器,通过输入过滤信号输入。 2)MATLAB内置函数滤波器(B,A,信号)。

% hard-coded IIR
state1 = 0;
state2 = 0;
inputState = 0;
for n = 1:22051
    input = b(2) * y(1,n)
    y_buffer = inputState + a(2) * state1 + a(3) * state2;
    inputState = input;
    state2 = state1;
    state1 = y_buffer;
    y_out(1,n) = y_buffer;
end

% given MATLAB function filter(b,a,y)
y_out2 = filter(b,a,y);

然而,当我绘制两个结果时,我编码的那个结果会爆炸到无穷大,而通过MATLAB函数过滤的信号看起来很好。

为什么这两个结果不同?我有没有错误?

1 个答案:

答案 0 :(得分:1)

您忘记了a系数的减号。在你的循环中,y_buffer应该是:

y_buffer = inputState - a(2) * state1 - a(3) * state2;