适用于Python初学者的低通滤波器和FFT


23

我对信号处理尤其是FFT还是陌生的,因此不确定在这里是否做正确的事情,我对结果有些困惑。

我有一个离散的实函数(测量数据),并想在其上设置一个低通滤波器。选择的工具是带有numpy软件包的Python。我遵循以下过程:

  • 计算我的函数的英尺
  • 切断高频
  • 执行反函数

这是我正在使用的代码:

import numpy as np
sampling_length = 15.0*60.0 # measured every 15 minutes
Fs = 1.0/sampling_length
ls = range(len(data)) # data contains the function
freq = np.fft.fftfreq(len(data), d = sampling_length)
fft = np.fft.fft(data)
x = freq[:len(data)/2] 
for i in range(len(x)):
if x[i] > 0.005: # cut off all frequencies higher than 0.005
    fft[i] = 0.0
    fft[len(data)/2 + i] = 0.0
inverse = np.fft.ifft(fft)

这是正确的程序吗?结果inverse包含复杂的值,这使我感到困惑。


1
在学习FFT时,我发现此博客文章非常有帮助。glowingpython.blogspot.com/2011/08/…–
David Poole

Answers:


23

结果复杂的事实是可以预期的。我想指出几件事:

您正在对数据应用砖墙式频域滤波器,尝试将对应于大于0.005 Hz频率的所有FFT输出归零,然后进行逆变换以再次获得时域信号。为了使结果是实数,则逆FFT的输入必须是共轭对称的。这意味着对于长度为 FFT,N

X[k]=X[Nk],k=1,2,,N21(Neven)

X[k]=X[Nk],k=1,2,,N2(Nodd)
  • 请注意,对于偶数,和通常并不相等,但它们都是实数。对于奇数,必须是实数。NX[0]NX[0]X[N2]NX[0]

我看到您尝试在上面的代码中执行类似的操作,但这并不完全正确。如果对传递给逆FFT的信号施加上述条件,则应该输出真实信号。

我的第二点更多是哲学上的观点:您所做的将起作用,因为它将抑制您不需要的频域内容。然而,这通常不是实践中实现低通滤波器的方式。如前所述,您要做的实际上是使用具有砖墙(即完美矩形)幅度响应的滤波器。这种滤波器的脉冲响应具有形状。由于频域中的乘法等效于时域中的卷积(在使用DFT的情况下),因此此操作等效于将时域信号与函数卷积。š Ñ Çsinc(x)sinc

为什么这是个问题?回想一下函数在时域中的样子(下面的图片是从Wikipedia毫不客气地借来的):sinc

sinc函数图

该函数在时域非常广泛的支持; 随着时间的流逝,它的衰变非常缓慢。对于许多应用程序来说,这不是理想的属性。当您用对信号进行卷积时,缓慢衰减的旁瓣的影响通常在滤波后的输出信号的时域形式中显而易见。这种影响通常称为振铃。如果您知道自己在做什么,则在某些情况下这种类型的过滤可能是适当的,但是在一般情况下,这不是您想要的。小号Ñ Çsincsinc

在时域和频域中,都有更实用的方法来应用低通滤波器。有限冲激响应无限冲激响应滤波器可以使用它们的差分方程表示直接应用。或者,如果您的滤波器具有足够长的脉冲响应,则通常可以使用基于FFT的快速卷积技术(通过在频域中乘而不是在时域中进行卷积来应用滤波器)来获得性能优势,例如重叠式-保存重叠添加方法。


sinc函数是理想的过滤,但是,不是吗?这就是所有其他过滤器旨在但未实现的目的。这对图像处理不利,因为没有首先对图像进行抗锯齿处理,因此会产生看起来很糟糕的振铃,但是对于在采样之前经过抗锯齿处理的音频或其他信号,这不是您可以获得的最佳滤波器吗?
endlith 2011年

1
是的,我的结果不是共轭对称的。我更正了代码,现在一切正常。谢谢!
直到B

3
@endolith -辛格为某些码种内插的内插器的理想,但可以从理想的是只要对于大多数种公共过滤器的要求,如通带响应,阻带抑制,以及等等的平坦度的滤光器
hotpaw2

对于“为什么人们不像PO那样实施过滤器”的详细说明,+ 1
Sibbs Gambling

您必须使用带窗的Sinc。如果您不受时间限制,那么这是最佳过滤器,远优于Chebichev。
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.