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


21

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

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

下面是一个比较,在该比较中,我使用相同数量的水龙头将汉明窗与我偏爱的最小二乘设计方法进行了比较。我以最小二乘方法加宽了通带,使其与汉明窗的通带紧密匹配,在这种情况下,很明显,最小二乘的性能优于(提供更大的阻带抑制性能)。我还没有在所有窗口上执行此操作,这使我想到了一个问题,即您是否可以胜过PMcC和最小二乘,或者是否还有其他使用FIR低通滤波器的应用,而该方法更适合使用开窗方法?

在此处输入图片说明


2
我可能建议将Kaiser窗口的Sinc firpm()与进行比较firls()
罗伯特·布里斯托

Answers:


16

我同意开窗滤波器的设计方法不再是最重要的设计方法之一,而且可能确实是由于历史原因,在传统教科书中过分地代表了这种情况。

但是,我认为在某些情况下可以合理使用它。我不同意计算复杂性不再是问题。这取决于平台。坐在我们的台式计算机上并设计一个过滤器,我们确实不需要担心复杂性。但是,在特定平台上以及需要准实时完成设计的情况下,计算复杂性是一个问题,与更复杂的最佳技术相比,简单的次优设计技术将更为可取。举例来说,我曾经在一个用于波束成形的系统上工作,在该系统中,需要动态地重新设计滤波器(波束成形器),因此计算复杂度确实是一个问题。

我也坚信,在许多实际情况下,我们无需担心最佳设计和次佳设计之间的差异。如果我们需要使用具有量化系数和算术运算结果量化的定点算术,则这一点变得更加正确。

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

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

让我向您展示,通常可以进行这种比较,以使其看起来像他们希望的那样。在下图中,我将使用Matlab / Octave函数设计的最小二乘最佳低通滤波器firls.m(蓝色)与使用Kaiser窗口(红色)的窗口方法设计的低通滤波器进行了比较。

在此处输入图片说明

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

总之,除了纯粹出于教学目的对DSP学生的学习有用之外,我认为尽管自1970年代以来取得了技术上的进步,但在某些实际情况下仍可以使用开窗方法,因此我认为这不会很快改变。


好的答案Matt-夫妇澄清/问题:关于复杂性,您能提出一个实际的例子吗?我可以看到这是实现方面的问题,但是在提出系数时,我没有想到我会在劣等平台上进行设计的原因(因此,我的问题)。关于比较,最小二乘法显然更好。对于相同的波纹和过渡,您可以获得更好的阻带衰减。我已经增加了通带宽度以匹配两者。边缘稍大,因为那是我停止匹配的地方,但可以更接近地得出结论。
Dan Boschen

2
@DanBoschen:当然,在大多数情况下,设计是脱机完成的,而复杂性不是问题。但是,我遇到过需要准实时重新设计滤波器的应用程序(那是一个波束成形应用程序),因此确实存在复杂性问题。
马特L.17年

1
至于与窗户设计相比,通过最佳设计实际节省的水龙头数量,我看到的结果通常令人失望。通常只有1或2个抽头,对于许多实现而言,它们并没有多大区别。
马特L.17年

1
好的,对于脱机设计,如果数值稳定性没有问题(对于该特定设计,通常仍然是问题),则开窗将无用。但是总的来说,我们不能总是依靠离线设计,更重要的是,我们不能总是避免出现数值问题。因此,我认为“过时”一词仍然太强了。
马特L.17年

3
说得好。要记住的是,工程就是要找到足以满足您要求的实现。window方法易于实现,并且始终有效。其他方法的实现更为复杂,并且可能会遇到棘手的情况。我已经使用了多个需要动态设计过滤器的系统,而window方法是那些情况的首选。
杰森R

7

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

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

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

PMcC滤波器的频率响应中的相等纹波会导致时域中的伪影与简单的窗口式滤波器所产生的伪影不同(也许不太理想)。


1
@ hotpaw2是个好点,通带纹波会导致符号间干扰(回波和超前回波)。谢谢
Dan Boschen

2
我们在2003年的comp.dsp上讨论了Parks–McClellan的回声前后。Alexey Lukin发布了一个最小的MATLAB示例:f=[0 0.49 0.51 1]; a=[1 1 0 0]; b=remez(300,f,a),它也可以在Octave中运行。一种解释是,对于非常陡峭的滤波器,纹波可能足够规则,类似于余弦。频域余弦的时域等效将是两个脉冲回波。
Olli Niemitalo

6

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

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

辛克
图1.典型的半带低通滤波器,增益为2,是水平扩展2倍的Sinc函数,适合于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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.