我试图了解使用带卷积滤波器内核的“第一原理”设计的FIR滤波器与使用FFT的两种方式之一设计的滤波器之间的关系(见下文)。

据我了解,FIR滤波器的脉冲响应与滤波器的卷积内核是一样的。 (如果我错了,请纠正我。)

据我所知,FIR滤波器的脉冲响应的成分频率(即傅立叶变换)与滤波器的频率响应相同。因此,傅立叶逆变换将使我获得脉冲响应。(同样,如果我做错了,请纠正我)。

这使我得出两个结论(忽略相位响应或假设线性相位响应):


我应该能够通过“画出”所需的频率响应,进行IFFT以获得脉冲响应,并使用它来设计任意频率响应的FIR滤波器作为我的卷积内核。
或者,我应该能够通过对输入信号进行FFT,在频域中乘以所需的任意频率响应,并对结果进行IFFT来创建滤波器,从而创建滤波器输出信号。

直觉上,感觉1和2是等效的,但是我不确定是否能证明这一点。

似乎人(和DSP文献)竭尽全力来设计具有预定义响应的FIR内核,使用诸如Chebyshev或Remez之类的复杂的(对我而言)算法(我抛出了一些我已经例如,没有真正理解它们。)

为什么每个可能的FIR内核都存在FFT / IFFT转换,为什么要采用这些长度?
为什么不简单地绘制所需的确切频率响应,进行IFFT,然后有FIR内核(上面的方法1)?


评论

如果感兴趣,我感兴趣的领域是数字音频/数字音乐。

#1 楼

您看到人们设计FIR滤波器而不是采用直接方法(如1和2)的原因之一是,直接方法通常未能考虑频域中的周期性,而使用FFT实现卷积的事实是循环卷积。

是什么意思?

假设您有一个信号$ x = [1,2,3,4] $和一个滤波器脉冲响应(卷积内核) ;是的,它们是相同的)$ h = [1,1] $。

卷积$ y = x * h $是$ [1、3、5、7、4] $ 5个长度的向量。如果使用FFT(长度错误,为4),则得到的答案为$ [3,5,7,5] $。产生差异的原因是这两者的线性卷积结果为长度5,但圆形卷积的结果与FFT长度无关。

如果FFT长度大于或等于线性卷积结果的长度,则两者相同。否则,两者将不相同(除非数据以某种方式密谋做到这一点,例如,如果一个信号为零)。

评论


$ \ begingroup $
当然可以,但是为什么有人不能确保FFT / IFFT的大小与最终卷积长度相称呢?例如,卷积长度为N + M-1,因此只需确保在傅立叶域中“画出”频率响应,长度为M-1。为什么不行呢?有趣的东西顺便说一句。 :)
$ \ endgroup $
– TheGrapeBeyond
2013年9月3日在18:49

$ \ begingroup $
@TheGrapeBeyond:完全没有理由!只用$ M-1 $点的徒手绘制响应可能并没有达到您认为的效果(在点之间)。
$ \ endgroup $
– Peter K.♦
2013年9月3日19:07在

$ \ begingroup $
长度为M-1的频率响应仍然具有无限的长度脉冲响应。这意味着当您进行IFFT以获得滤波后的结果时,滤波器的脉冲响应的尾部将环绕(多次)并增加最终时域结果。也许一点。也许很多。
$ \ endgroup $
– hotpaw2
2013年9月4日在1:13



#2 楼

一个问题是处理使用有限长度FFT时环绕的无限长度变换。有限长度频率响应的傅立叶变换是无限长度脉冲响应或滤波器内核。大多数人希望过滤器在其耗尽或耗尽计算机内存之前完成,因此需要技巧来生产更短的FIR过滤器。与“经典”滤波器原型之一相比,仅使无限冲激响应的尾部环绕FFT,或将其截短至某个通用长度,就可能会为您所需的频率产生劣等的FIR滤波器。

另一个问题是,随机的“绘制”频率响​​应在任何有限分辨率下,绘制点之间通常都具有可怕的响应(野生的过冲)。转换为FIR滤波器,它会像疯了似的响起。经典滤波器原型被设计为具有在采样点之间平滑的频率响应函数。

您的(2)被称为快速卷积,通常在FFT长于数据长度的情况下使用窗口加上组合的滤波器内核,并使用适当的重叠添加/保存来照顾每个卷积段或窗口的开始/结束(因为FFT的长度通常是块状的)。

#3 楼

关于1):是的,您可以通过“绘制”频率响​​应(幅度和相位)来设计FIR滤波器,但是,这往往效率很低:脉冲响应的长度(和滤波器阶数)只是预先确定的-由您的FFT长度决定如果选择128点FFT,您将获得128个抽头,以获得脉冲响应;如果选择4096点FFT,您将获得4096个滤波器抽头。

关于2):是的,您可以通过在频域中进行乘法滤波,这确实是对大脉冲响应进行有效滤波的唯一方法。但是,正如Peter K所指出的,频域中的乘法对应于循环卷积。实现线性卷积的最常见方法是“重叠添加”或“重叠保存”算法(易于谷歌搜索)。

#4 楼

我不确定我是否理解这里所说的所有内容,但是我想说明傅里叶变换方法。正如您所说,要做的就是定义幅度和相位响应。但是,正如所说的,您确实需要谨慎定义响应。任意响应可能需要大量抽头来实施并给出可怕的时域响应。因此,请谨慎定义它。

第二,确实是这样的情况:例如,对于某些特定要求,Parks McClellan方法可以生成比Fourier方法更好的过滤器,但不容易控制抽头计数,并使用该方法定义幅度,相位和阶跃响应。例如,假设您要设计一个特性类似于10极IIR贝塞尔的FIR滤波器,但是您想要稍微缩小过渡带(以阶跃响应过冲为代价)。然后,根据过渡带的变窄程度,使用傅立叶方法可以轻松解决大约22个抽头,这很容易解决问题。

如果您想了解傅立叶方法的功能,请尝试以下FIR程序http://www.iowahills.com/5FIRFiltersPage.html(免费)。例如,它可以设计等效于高斯,贝塞尔,巴特沃思和逆切比雪夫滤波器的IIR。通常,它使您可以将滤波器的响应调整为几乎所有情况,这是傅立叶方法的强项。不利的一面是,对于某些特定要求,过滤器可能不是最佳的。

评论


$ \ begingroup $
看起来确实很有趣。我将不得不尝试使用该软件来真正了解发生的事情-该网页似乎并没有太多详细地描述其方法。但是据我所知,这似乎是一种混合,您可以操纵以更传统的方式生成的滤波器原型的频率响应。那是对的吗?我认为您说的是对的-您需要谨慎定义响应方式,否则最终会产生大量点击。 AFAIU,这是专门设计具有频率响应的滤波器的大问题。
$ \ endgroup $
– bryhoyt
2013年9月11日20:25在

#5 楼

AFAIK,这就是所谓的“幼稚过滤方法”。您可以影响频率空间中某些点的频谱内容,但是对于这些点之间的频率内容没有做任何有用的事情。如果设计适当的FIR滤波器,则实际上还要考虑到那些主要点之间的点,并且这种滤波器比第一个要好得多。.


Bul。