我是信号处理(尤其是FFT)的新手,因此不确定在这里是否做正确的事情,我对结果有点困惑。数据),并希望为此设置一个低通滤波器。选择的工具是带有numpy软件包的Python。我按照以下步骤操作:


计算函数的fft执行逆fft

这里是我正在使用的代码:

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包含复杂的值,这令我感到困惑。

评论

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

#1 楼

结果复杂的事实是可以预料的。我想指出以下几点:

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

$$
X [k] = X ^ * [Nk],k = 1,2,\ ldots,\ frac { N} {2}-1 \; \; \; \; \; \; \;(N \; \;偶数)
$$

$$
X [k] = X ^ * [Nk],k = 1、2,\ ldots,\ lfloor \ frac {N} {2} \ rfloor \; \; \; \; \; \; \; \;(N \; \;奇数)
$$


请注意,对于$ N $,偶数$ X [0] $和$ X [\ frac {N} {2} ] $通常并不相等,但它们都是真实的。对于奇数$ N $,$ X [0] $必须是实数。如果对传递给逆FFT的信号施加上述条件,那么您应该得到一个真实的信号。

我的第二点更多是哲学上的观点:您正在做的将是可以消除不需要的频域内容。但是,这实际上通常不是实现低通滤波器的方式。正如我之前提到的,您要做的实际上是使用具有砖墙(即完全矩形)幅度响应的滤波器。这种滤波器的脉冲响应具有$ sinc(x)$形状。由于频域中的乘法等效于时域中的卷积(在使用DFT的情况下),因此此操作等效于使用$ sinc $函数对时域信号进行卷积。 >为什么这是一个问题?回想一下$ sinc $函数在时域中的样子(下面的图片是从Wikipedia无耻地借来的):$ sinc $函数在时域中具有非常广泛的支持;随着时间的流逝,它的衰变非常缓慢。对于许多应用程序来说,这不是理想的属性。当您将信号与$ sinc $卷积时,缓慢衰减的旁瓣的影响通常在滤波后的输出信号的时域形式中显而易见。这种影响通常称为振铃。如果您知道自己在做什么,则在某些情况下这种类型的过滤可能是合适的,但在一般情况下,这不是您想要的。时域和频域中的滤波器。有限冲激响应和无限冲激响应滤波器可以使用它们的差分方程表示直接应用。或者,如果您的滤波器具有足够长的脉冲响应,则通常可以使用基于FFT的快速卷积技术(通过在频域中乘而不是在时域中进行卷积来应用滤波器)来获得性能优势,例如保存和重叠添加方法。

评论


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

$ \ begingroup $
是的,我的结果不是共轭对称的。我更正了代码,现在一切正常。谢谢!
$ \ endgroup $
–直到B
2011年11月29日15:12

$ \ begingroup $
@endolith-Sinc是某些插值的理想插值器,但对于大多数常见滤波器要求(例如,通带响应的平坦度,阻带抑制等)而言,作为理想的滤波器可能远非理想。
$ \ endgroup $
– hotpaw2
2011年11月29日15:27

$ \ begingroup $
+1很好地解释了“为什么人们不像PO那样实施过滤器”
$ \ endgroup $
– Sibbs赌博
13年8月13日在6:05

$ \ begingroup $
您必须使用带窗口的Sinc。如果您不受时间限制,那么这是最佳过滤器,远优于Chebichev。
$ \ endgroup $
–user13706
15年7月18日在21:09