【问题标题】:MATLAB: real-time vs. filter(b,a,z) implementation of IIR filtersMATLAB:IIR 滤波器的实时与滤波器(b,a,z)实现
【发布时间】: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 函数过滤的信号似乎很好。

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

【问题讨论】:

    标签: matlab filter


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2016-02-24
      • 2021-07-20
      • 2014-05-11
      相关资源
      最近更新 更多