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

MATLAB:IIR滤波器的实时vs.滤波器(b,a,z)实现,matlab,filter,Matlab,Filter,我试图理解为什么实时硬编码IIR不起作用,而MATLAB中已经提供的非实时IIR过滤函数(filter())起作用。我正在测试的过滤器如下所示: 我通过差分方程得到了这个作为滤波器系数: 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); 然后我通过两个不同实现的IIR

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

我通过差分方程得到了这个作为滤波器系数:

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);
然后我通过两个不同实现的IIR滤波器对信号进行过滤:1)硬编码IIR滤波器,逐条过滤信号。2) 内置函数滤波器(B,A,信号)由MATLAB实现

% 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函数过滤的信号似乎很好


为什么这两个结果不同?我犯了什么错误吗?

你只是忘记了
a
系数的减号。在循环中,
y\u buffer
应该是:

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