这并不是 MATLAB 特有的问题。我看到了几个更一般的问题:
如何实现数字 IIR 滤波器?
您可以通过将其脉冲响应与要过滤的信号进行卷积来应用任何通用数字滤波器。看起来像:
是的[ n ] =∑k = 0ñ− 1x [ k ] h [ n - k ]
这对FIR滤波器很有效,但是你会遇到IIR系统的复杂情况,因为它们的脉冲响应是无限长的(ñ→ ∞在上述总和中)。这使得滤波器输出难以使用上面的直接卷积和来计算。要实际实现 IIR 滤波器,我们需要一种方法来以更易于计算的方式表达滤波器输出。
使脉冲响应无限长的 IIR 滤波器的属性是系统的递归性质;有从输出反馈到滤波器输入的反馈。这意味着 IIR 滤波器在任何给定时刻的输出都取决于两个独立的信息源:
滤波器的输入信号,过去和现在,以及
滤波器输出信号的过去值。
这导致IIR 系统的差分方程表示:
一种0是的[ n ] =∑k = 1米− 1一种ķ是的[ n - k ] +∑k = 0ñ− 1bķx [ n - k ]
该表示说明我们可以通过计算加权和来实现 IIR 滤波器米过滤器的过去输出和ñ过滤器的过去输入(在实践中,ñ和米可以和经常是一样的;如上所述定义的过滤器的顺序是米× (米_, N) - 1)。这是一个封闭形式的表达式,可以完全捕获过滤器的行为,适合自动实现,并且是您在问题中显示的 MATLAB 帮助摘录中引用的方程式。注意一种0几乎完全假定为等于1; 我只包含它是因为它显示在引用的帮助文本中,引用为a(1)
.
因此,为了具体回答您的问题,正如文中所建议的那样,MATLAB 使用上述等式实现了 IIR 系统。当您使用 MATLAB 或其他方式设计 IIR 滤波器时,您会得到两组系数 (一种ķ和bķ在差分方程中)定义如何在过滤器实现中对过去的过滤器输入和输出进行加权。还有一些其他的微妙之处有时是相关的;例如,文中提到使用“直接形式 II 转置”实现过滤器。然后,您通过为每个所需的输出样本计算上面的差分方程来应用过滤器。
事实上,有许多拓扑可用于实现数字滤波器,每种拓扑都有自己的权衡。DF2T 经常被使用,因为它的结构更有效(它包含最少数量的延迟元素)和改进的舍入误差鲁棒性(因为前馈系数bķ首先实施)。
MATLAB 如何设计巴特沃斯滤波器?
该butter
函数的文档没有说明它如何生成模拟巴特沃斯滤波器原型的离散近似。但是,通过窥视butter.m
,您会发现:
% step 5: Use Bilinear transformation to find discrete equivalent:
if ~analog,
[a,b,c,d] = bilinear(a,b,c,d,fs);
end
因此,它似乎使用双线性变换将巴特沃斯滤波器原型映射到数字滤波器实现。