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

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



评论

我可能建议将Kaiser窗口的Sinc与firpm()和firls()进行比较。

#1 楼

我同意开窗滤波器的设计方法不再是最重要的设计方法之一,并且可能确实是由于历史原因而在传统教科书中过分体现了这种情况。我认为在某些情况下可以合理使用它。我不同意计算复杂性不再是问题。这取决于平台。坐在我们的台式计算机上并设计一个过滤器,我们确实不需要担心复杂性。但是,在特定平台上以及需要准实时完成设计的情况下,计算复杂性是一个问题,与更复杂的最佳技术相比,简单的次优设计技术将更为可取。例如,我曾经在一个用于波束成形的系统上工作,在该系统中需要实时重新设计滤波器(波束成形器),因此计算复杂性确实是一个问题。

我也是相信在许多实际情况下,我们不必担心最佳设计与次优设计之间的差异。如果我们需要使用具有量化系数和算术运算结果量化结果的定点算术,这一点就变得更加正确。我遇到过几次Parks-McClellan算法(我应该说,我使用的实现)根本没有收敛的情况。如果规范没有多大意义,则会发生这种情况,但是在完全合理的规范中也会发生这种情况。对于需要解决线性方程组的最小二乘设计方法,情况也是如此,这可能会成为病态问题。在这种情况下,加窗方法将永远不会让您失望。

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

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

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

评论


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



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

$ \ begingroup $
至于与窗户设计相比,最佳设计实际节省的水龙头数量,我看到的结果通常令人失望。通常只有1或2个抽头,对于许多实现而言,它们并没有多大区别。
$ \ endgroup $
– Matt L.
17年2月18日在13:39

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

$ \ begingroup $
说的很好。要记住的是,工程就是要找到足以满足您要求的实现。 window方法易于实现,并且始终有效。其他方法的实现更为复杂,并且可能会遇到棘手的情况。我已经使用了多个需要动态设计过滤器的系统,而window方法是这些情况的首选。
$ \ endgroup $
–Jason R
17年2月18日在16:10

#2 楼

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

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

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

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

评论


$ \ begingroup $
@ hotpaw2是个好点,通带纹波导致符号间干扰(回波和超前回波)。谢谢
$ \ endgroup $
–丹·博申(Dan Boschen)
17年2月18日在21:22

$ \ begingroup $
2003年,我们在comp.dsp上讨论了Parks–McClellan的回声前后。 a = [1 1 0 0]; b = remez(300,f,a),它也以八度运行。一种解释是,对于非常陡峭的滤波器,纹波可能足够规则,类似于余弦。频域余弦的时域等效将是两个脉冲回波。
$ \ endgroup $
–奥利·尼米塔洛(Olli Niemitalo)
17年7月6日在10:43



#3 楼

我将在这里展示开窗设计的一个好处,以及从Parks–McClellan获得相同好处的技巧。缩放正弦函数的函数,这是典型的理想低通滤波器。零最终出现在系数中,从而降低了滤波器的计算成本。对于半带滤波器,开窗设计给出了一个滤波器,除中间系数(也被视为偶数)外,每个系数均为0。 2是增益为2的典型半带低通滤波器,适合于以2的倍数上采样。使用它设计一个滤波器,它具有偶数抽头,并且只定义了单位增益通带。所获得的系数用作较长滤波器的奇数系数。较长的滤波器的中间系数设置为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.使用Python scipy.signal.remez间接设计的半带滤波器的系数。

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