用Hanning窗口傅立叶滤波后恢复信号

时间:2016-11-18 02:00:23

标签: matlab filtering signal-processing fft physics

我有一个复杂的信号,我可以在傅里叶空间看到,并希望过滤一些我不想要的频率。我在网上看到我应该在进行傅立叶变换之前应用Hanning窗口以避免泄漏。

因此,我正在做的,如下面的代码所示,是将Hanning窗口应用于我的数据,然后对其进行傅里叶变换。作为测试,我想看看我是否不过滤任何东西,是否可以恢复原始信号。但是,信号在边缘处变为零。

现在,我知道这是因为Hanning窗口过滤器在其结尾处也变为零。在这种情况下,如何应用Hanning窗口,进入频域并返回到我的时域,恢复信号?如果我的信号在末尾变为零,当我尝试过滤我想要的频率时,时域中的结果仍然会在边缘处变为零。

我的方法中缺少什么/做错了什么?感谢您提供的任何帮助!

以下是我正在做的示例代码:

COMMIT

从中出来的图像如下: Real space and Frequency space of signal before and after filtering with Hanning window

1 个答案:

答案 0 :(得分:1)

刺伤你的一些问题。

  

在这种情况下,如何应用Hanning窗口,进入频域并返回我的时域并恢复信号?

直到你的numpy的fft实现的数值精度,应用傅立叶变换然后逆傅立叶变换应该返回原始信号。但是,如果你在fft之前将信号乘以一个hanning窗口,那么fft'ing和ifft'ing的结果将是信号乘以hanning窗口。因此,您提供的第三个图是有道理的。它是原始信号,乘以汉宁窗口(并通过消除高于2.0的频率进行平滑)。

  

我在网上看到我应该在进行傅立叶变换之前应用Hanning窗口以避免泄漏。

汉宁窗口用于可能最小化频谱泄漏。在理想情况下,您可以将有限数据片段用作图块,以在整个空间中重新创建整个函数。当您的有限数据片段无法完全满足此目的时,您将产生一定量的频谱泄漏。

hanning窗口衰减信号的开始和结束,以帮助满足“重复图块”约束。话虽如此,我不认为频谱泄漏是您提供的数据的问题,但也许它正在您正在分析的另一个数据集中。

有关频谱泄漏的更多信息,请转至why does spectral leakage arise in a fft

  

如果我的信号在结束时变为零,当我尝试过滤我想要的频率时,时域中的结果仍然会在边缘处变为零。

不一定是这种情况。您在频域中消除的频率实际上可能是在时域中使函数为零的模式。

第四个剧情

你的第四个情节很有趣。在其中,您正在绘制高频消除时间序列的傅里叶变换的结果。该功能在+/- 2处快速衰减,因为您已经消除了这些频率。 fft没有精确到0的事实是因为离散傅里叶变换不精确。

快速编码评论

您的代码的一行有趣地使用了数组切片。我花了一秒钟,但我想评论你做了什么。

time[::-1][:-1][::-1] # Reverse array, disregard "new" last element, ...
                      # ... then reverse again
time[1:]  # Don't consider the first element.
time[1:] == time[::-1][:-1][::-1] # These are exactly the same.
# Result: True