【发布时间】:2014-04-23 04:22:38
【问题描述】:
我试图理解为什么实时硬编码 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内置函数filter(B,A,signal)。
% 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 函数过滤的信号似乎很好。
为什么两个结果不同?我犯了什么错误吗?
【问题讨论】: