将 IIR 滤波器拟合到复杂的传递函数

信息处理 matlab 过滤器 过滤器设计 无限脉冲响应 优化
2022-02-14 20:22:20

任何人都知道将 IIR 滤波器拟合到比 Matlab 的复杂传递函数更好的方法invfreqz.m吗?我正在为自己实现一个小的传递函数拟合工具箱。我从重新实现 Matlab 中使用的方法开始invfreqz.mInvfreqz.m正在使用Levy 的复杂曲线拟合算法来计算迭代 Gauss-Newton 算法的起始系数。由于 Levy 的论文没有很好地记录算法并且它已经很老了,我正在寻找更简单的实现,甚至可能是更好的算法来完成同样的工作。文献研究结果证明是一个真正的痛苦 - 所以任何有经验的人关于文献、起点或实施示例的提示都将非常感激。

1个回答

正如我在评论中提到的,我认为方程误差法是在频域中设计具有规定幅度和相位响应的 IIR 滤波器的一个很好的起点。有关此方法的说明,请查看此答案和那里的参考资料。

与方程误差法相关的两个问题是

  1. 设计的过滤器的稳定性不能保证
  2. 频域误差用所设计滤波器的分母多项式的平方幅度加权,这意味着在某些频率区域的近似值比在其他频率区域更好,但这种加权是设计过程的结果,通常是不可取的。

第一个问题可以通过调整所需频率响应的总延迟来解决,使其与具有所选分子和分母多项式阶数的因果和稳定滤波器可以实现的匹配。因此,所需的复频率响应变为D(ω)

(1)D~(ω)=D(ω)ejωτ

带有一些延迟参数(也可以是负数)。优化的值将有助于设计一个具有最小可能误差的稳定滤波器。与原始期望响应的唯一区别是增加(或减少)延迟(即线性相位分量)。ττ

解决第二个问题的一种选择是使用自适应权重函数解决一系列方程误差问题,这是Steiglitz-McBride 方法的基本思想。

我已经为 IIR 滤波器的频域设计实现了方程误差方法,并且我还增加了迭代近似最优最小二乘解的可能性,如上所述。请注意,不能保证收敛,但实际上通常在几次迭代后实现收敛。另请注意,生成的滤波器可能不稳定,但可以通过调整所需响应的总延迟来解决此问题,如上所述。Matlab/Octave 代码可以在GitHub 上找到

这是一个简单的滤波器设计示例。所需的响应是在通带中具有线性相位响应的低通滤波器。希望延迟是整数个样本,但要优化精确值以通过稳定滤波器获得最佳近似值。分子和分母的顺序选择为实验表明,所需通带群延迟的最佳值是个样本:M=N=1028

w = pi*[linspace(0,.2,20),linspace(.25,1,75)]; % 频率网格
D = [exp(-j*w(1:20)*28),zeros(1,75)]; % 期望响应
W = [一个(1,20),10*一个(1,75)]; % 误差加权
[a,b] = eqnerror(10,10,w,D,W,6); % 方程误差法的 6 次迭代

下图显示了设计结果。请注意,通带群延迟近似于所需的个样本。设计的滤波器稳定,最大极点半径为280.98

在此处输入图像描述