我试图理解为什么实时硬编码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);
然后我通过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函数过滤的信号看起来很好.
为什么这两个结果不同?我有没有错误?