我试图理解为什么实时硬编码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函数过滤的信号看起来很好。
为什么这两个结果不同?我有没有错误?
答案 0 :(得分:1)
您忘记了a
系数的减号。在你的循环中,y_buffer
应该是:
y_buffer = inputState - a(2) * state1 - a(3) * state2;