如何在 Matlab 中初始化 IIR 滤波器

信息处理 matlab 过滤器设计
2022-02-03 17:32:02

我设计了一个 IIR 滤波器,并想做零、步进和投影初始化。在不同的参考论文中有提及,但没有针对 Matlab 的明确示例。对于前面提到的类型,你如何在 Matlab 中进行 IIR 初始化?

3个回答

不容易。Matlab filter() 函数实现了一个通用的 IIR 滤波器,并允许您传入初始状态。但是,他们没有公布状态的确切定义和部署的算法。它似乎接近转置的 II 型滤波器,但有一些细微的数值差异,因此状态不太匹配。

无论如何,最好使用 sosfilter() 将其分解为二阶部分。但是,这不允许您设置初始状态。您可能必须为此编写自己的过滤器功能。

您仍然可以在某种程度上使用 filter() 。默认为零初始化。您还可以通过简单地运行一段时间的常量输入并从过滤器收集状态作为输出参数来进行步骤初始化,如下所示:

[b a] = butter(4,1000*2/44100);
% create state for a constant input of "1"
[~,state1] = filter(b,a,ones(1000,1));
% now filter for a constant of 2 but with a state for "1" input
ystep = filter(b,a,2*ones(100,1),state1);
plot(ystep);

不过,不确定投影初始化。

这是二阶 IIR 的投影初始化的 Matlab 实现。有关详细信息,请参阅Chornoboy的改进 IIR 滤波器性能的初始化。

% x is your input signal.
% y is the output signal.
% fs is the sample rate.

% This example uses a 2nd order Butterworth high-pass filter with fc = 0.3 Hz.
fc = 0.3;
[bh, ah] = butter(2, fc/fs, 'high');

A = [bh(2)-bh(1)*ah(2); bh(3)-bh(1)*ah(3)];
B = [-ah(2), -ah(3); 1 0];
C = [1;0];

Np = 1.0 * fs; % Set Np to the length of data you want to train on.
F = zeros(Np, 2);
G = diag(bh(1) * ones(1, Np));
for ix = 1:Np
   F(ix, :) = A'*B^(ix-1);
   if ix > 1
      for cix = (ix-1):-1:1
         G(ix, cix) = A'*B^(ix-cix-1)*C;
      end
   end
end

% Filter the data using state variables.
Mm1 = -inv(F'*F)*F'*G * x(1:Np); % M(-1)
y = zeros(size(x));
for ix = 1:length(y)
   Mn = B*Mm1 + C*x(ix);
   y(ix) = A'*Mm1 + bh(1)*x(ix);
   Mm1 = Mn;
end

请注意,步骤初始化是通过设置完成的Mm1 = 1/(1 + ah(2) + ah(3)) * [1; 1];

零初始化是通过设置完成的Mm1 = [0;0];