FIR 滤波器设计:Window vs Parks McClellan 和最小二乘法

信息处理 过滤器 过滤器设计 有限脉冲响应 最小二乘 帕克斯-麦克莱伦
2021-12-30 23:49:50

对于低通滤波器的 FIR 滤波器设计,使用窗口方法是否有优于 Parks-McClellan(此处进一步缩写为 PMcC)或最小二乘算法的优势?假设以今天的计算能力,算法本身的复杂性不是一个因素。

这个问题不是将 PMcC 与最小二乘法进行比较,而是特别是是否有任何理由使用任何窗口 FIR 设计技术而不是那些算法,或者是否有用于过滤设计的窗口技术被这些算法淘汰并降级为教学目的?

下面是一个比较,我将汉明窗与我喜欢的最小二乘设计方法进行了比较,使用相同的抽头数。我在最小二乘法中加宽了通带以紧密匹配汉明窗的通带,在这种情况下,很明显最小二乘法的表现会更好(提供更多的阻带抑制)。我没有对所有窗口都这样做,这让我想到你是否可以超越 PMcC 和最小二乘法,或者是否有其他 FIR 低通滤波器应用程序更适合使用窗口方法?

在此处输入图像描述

更新:

我在这里添加自首次发布此问题以来的经验教训:

  • 正如马特在下面指出和 RBJ 在评论中建议的那样,最小二乘解将在最小二乘意义上是最佳的(当它在其操作范围内收敛时),而具有凯撒窗口的解特别接近最小二乘所获得的解算法。(Kaiser 非常近似的 DPSS 窗口是另一个很好的选择)。

  • 一个非常高的动态范围滤波器是另一个例子,其中最小二乘算法(至少对于 Python 和 Octave 中的实现,我无法获得低于 -180 dB 的阻带抑制;使用凯撒窗)。这使我提出了进一步的问题,详见此处

4个回答

我同意窗口滤波器设计方法不再是最重要的设计方法之一,它可能确实在传统教科书中出现过多,可能是由于历史原因。

但是,我认为在某些情况下使用它是合理的。我不同意计算复杂性不再是问题。这取决于平台。坐在我们的台式电脑前设计一个过滤器,我们确实不需要担心复杂性。然而,在特定平台上和需要准实时完成设计的情况下,计算复杂性是一个问题,简单的次优设计技术将优于复杂得多的最优技术。例如,我曾经在一个波束成形系统上工作,其中滤波器(波束成形器)需要在运行中重新设计,因此计算复杂性确实是一个问题。

我还相信,在许多实际情况下,我们不需要担心最优设计和次优设计之间的差异。如果我们需要对量化系数和算术运算的量化结果使用定点算术,这将变得更加真实。

另一个问题是最优滤波器设计方法及其实现的数值稳定性。我遇到过几个案例,其中 Parks-McClellan 算法(我应该说,我使用的实现)根本没有收敛。如果规范没有多大意义,就会发生这种情况,但完全合理的规范也会发生这种情况。对于需要求解线性方程组的最小二乘设计方法也是如此,这可能成为病态问题。在这种情况下,开窗方法永远不会让你失望。

关于窗口方法和最小二乘设计之间的比较的评论:我不认为这种比较表明最小二乘方法优于窗口方法。首先,您似乎看到了阻带衰减,这不是两种方法中的任何一种的设计目标。加窗方法在任何意义上都不是最优的,最小二乘设计使阻带能量最小化,并且根本不关心阻带纹波大小。可以看出,窗口设计的通带边缘大于最小二乘设计之一,而阻带边缘更小。因此,通过加窗设计的滤波器的过渡带宽更小,这将导致更高的阻带纹波。过渡带宽度的差异可能很小,但是过滤器属性对这个参数非常敏感。毫无疑问,最小二乘滤波器在阻带能量方面优于其他滤波器,但这不像纹波大小那么容易看出。问题仍然存在,这种差异是否真的会在实际应用中产生影响。

让我告诉你,这样的比较通常可以按照人们希望的方式进行。在下图中,我将使用 Matlab/Octave 函数(蓝色)设计的最小二乘最优低通滤波器与firls.m使用 Kaiser 窗口(红色)的窗口方法设计的低通滤波器进行了比较。

在此处输入图像描述

从图中甚至可以得出结论,加窗设计的滤波器略好于最小二乘最优滤波器。这当然是无稽之谈,因为我们甚至没有定义“更好”,而最小二乘滤波器必须具有更小的均方逼近误差。但是,您不会在图中直接看到这一点。无论如何,这只是为了支持我的主张,即在进行此类比较时必须非常小心和清楚。

总之,除了出于纯粹的教学原因对 DSP 学生学习有用之外,我认为尽管自 1970 年代以来技术进步,但在某些实际场景中使用窗口方法是合理的,我认为这不会很快就会改变。

窗口 Sinc 滤波器可以在处理器上动态自适应生成,处理器的功能几乎不足以运行相关的 FIR 滤波器。加窗 Sinc 滤波器可以在有限的有界时间内生成。

一些简单的窗口 Sinc 过滤器的生成可以在几行代码中完全描述(并检查恶意软件等),而不是盲目使用一些不透明的工具箱。

与从头开始编写 PMcC 滤波器生成器所需的数学背景相比,解释窗口 Sinc 滤波器所需的数学背景更少。

PMcC 滤波器频率响应中的相同波纹会导致时域中的伪像与简单的窗口滤波器产生的伪像不同(并且可能不太理想)。

我将在这里展示窗口设计的一个好处以及从 Parks–McClellan 获得相同好处的技巧。

对于半带、四分之一带等滤波器,窗口化保留了缩放 sinc 函数的时域零点,这是典型的理想低通滤波器。零最终出现在系数中,从而降低了滤波器的计算成本。对于半带滤波器,加窗设计给出了一个滤波器,除了中间系数(也被认为是偶数)之外,每个偶数系数都为 0:

辛格
图 1. 水平拉伸 2 倍的 Sinc 函数是典型的半带低通滤波器,增益为 2,适用于 2 倍的上采样。

然而,Parks–McClellan / Remez 可以通过设计一个具有偶数抽头且仅定义一个单位增益通带的滤波器来欺骗以提供相同的好处。获得的系数用作较长滤波器的奇数系数。较长滤波器的中间系数设置为 1,其他偶数系数设置为 0。该滤波器在通带中的增益为 2,在通带和阻带中具有对称纹波。在 Python 中:

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
c0 = signal.remez(14, [0, 3500.0/8000], [1])
c = np.zeros(c0.size*2-1)
c[0::2] = c0
c[c0.size-1] = 1
freq, response = signal.freqz(c)
plt.semilogy(freq/(2*np.pi), np.abs(response))
plt.show()
plt.plot(range(-c0.size+1, c0.size, 1), c, 'x')
plt.grid(True)
plt.show()

图 2。
图 2. 使用 Python 间接设计的半带滤波器的系数scipy.signal.remez

图 3。
图 3. 使用 间接设计的半带滤波器的幅度频率响应图scipy.signal.remez

由于评论,我显然必须在近 5 年前看到这个问题,但我真的不记得了。

但是对于砖墙插值滤波器,windowed-sinc 优于 P-McC 或 LS 的一个优势是,windowed-sinc 可以保证在除 0 之外的所有整数值处通过零。这意味着插值信号总是通过采样点,而 P-McC 或 LS 除了插值外对信号稍作过滤。该过滤意味着您不能保证内插信号通过原始采样点。

这不是一个很大的优势。