MATLAB 如何处理 IIR 滤波器?

信息处理 过滤器 无限脉冲响应 软件实现
2021-12-30 20:16:10

MATLAB 有一个butter,它构造一个给定阶数和相对截止频率的巴特沃斯滤波器。创建的滤波器可用于filter任何有限信号。

如果滤波器具有无限脉冲响应,MATLAB 如何做到这一点?我想它必须对信号进行窗口化——这是通过一个简单的矩形窗口完成的,以便使用所有已知值吗?

另外,连续滤波器是如何离散化的?双线性变换、脉冲响应匹配等?

我不认为 MATLAB 帮助文本解释了这一点:

Y = FILTER(B,A,X)使用向量X描述的过滤器过滤向量中的数据AB创建过滤后的数据Y该滤波器是标准差分方程的“直接形式 II 转置”实现:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
                      - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
2个回答

这并不是 MATLAB 特有的问题。我看到了几个更一般的问题:

如何实现数字 IIR 滤波器?

您可以通过将其脉冲响应与要过滤的信号进行卷积来应用任何通用数字滤波器。看起来像:

y[n]=k=0N1x[k]h[nk]

这对FIR滤波器很有效,但是你会遇到IIR系统的复杂情况,因为它们的脉冲响应是无限长的(N在上述总和中)。这使得滤波器输出难以使用上面的直接卷积和来计算。要实际实现 IIR 滤波器,我们需要一种方法来以更易于计算的方式表达滤波器输出。

使脉冲响应无限长的 IIR 滤波器的属性是系统的递归性质;有从输出反馈到滤波器输入的反馈。这意味着 IIR 滤波器在任何给定时刻的输出都取决于两个独立的信息源:

  • 滤波器的输入信号,过去和现在,以及

  • 滤波器输出信号的过去值。

这导致IIR 系统的差分方程表示:

a0y[n]=k=1M1aky[nk]+k=0N1bkx[nk]

该表示说明我们可以通过计算加权和来实现 IIR 滤波器M过滤器的过去输出和N过滤器的过去输入(在实践中,ñ可以和经常是一样的;如上所述定义的过滤器顺序是一种X(,ñ)-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

因此,它似乎使用双线性变换将巴特沃斯滤波器原型映射到数字滤波器实现。

MATLAB 的 filter 函数简单地实现了 Direct form II 变换滤波器的差分方程。没有理由对滤波器进行数字化,因为它首先是在离散空间中设计的。filter() 的输出与输入的长度相同。这在技术上是“错误的”,因为它会截断过滤器中会延长该长度的部分。如果您要访问尾部,则可以在输入信号中附加相当数量的零。由于它是“无限”响应,因此您无法完美地做到这一点,但在大多数应用程序中,实际上做到这一点并不难。