为啥在执行快速傅里叶变换时需要遮罩?

Posted

技术标签:

【中文标题】为啥在执行快速傅里叶变换时需要遮罩?【英文标题】:Why the need for a mask when performing Fast Fourier Transform?为什么在执行快速傅里叶变换时需要遮罩? 【发布时间】:2019-04-15 10:54:18 【问题描述】:

我正在尝试使用 R 中的 fft() 方法找出隐藏在我的数据中的峰值频率。在准备数据时,更有经验的用户建议创建一个“掩码”(详细说明后更多),这确实给了我正在寻找的确切图表。问题是,我不明白它的作用或为什么需要它。

为了提供一些上下文,我正在处理每个包含大约 12000 个条目的 .txt 文件。它是电压与时间的信息,预期结果只是一个正弦波,其峰值频率应接近 1-2 Hz。这是其中一个文件的外观示例:

我一直在尝试使用 R 中实现的快速傅立叶变换方法 fft() 来查找峰值频率并获得清晰反映它们的图表。首先,我计算了一些我认为有用的东西,比如奈奎斯特频率和我将在最终图表中显示的频率范围:

    n = length(variable)
dt = time[5]-time[4] 
df = 1/(max(time))  #Find out the "unit" frequency
fnyquist = 1/(2*dt) #The Nyquist frequency
    f = seq(-fnyquist, fnyquist-df, by=df) #These are the frequencies I'll plot

但是当我绘制 fft(data) 计算的绝对值与频率范围的关系时,我得到了:

峰值频率似乎接近 50 Hz,但我知道情况并非如此。它应该接近 1 Hz。我是 R 和傅里叶分析的新手,所以在研究了一下之后,我发现in a Swiss page 可以通过创建一个“掩码”来解决这个问题,这实际上只是一个具有重复模式的向量(1,- 1, 1, -1...) 与我的数据向量本身的长度相同:

    mask=rep(c(1, -1),length.out=n)

然后,如果我将我的数据向量乘以这个掩码并绘制结果:

    results = mask*data
    plot(f,abs(fft(results)),type="h")

我得到了我想要的东西。 (这是将 x 轴限制为合理比例后的图表)。

那么,面具实际上在做什么?我不明白它正在以另一种方式改变我的数据点符号,但我不明白为什么它将推断的峰值频率从 ~50 Hz 变为 ~1 Hz 的正确结果。

提前致谢!

【问题讨论】:

【参考方案1】:

您的“掩码”是执行 fftshift 的两种方法之一,通常用于将 FFT 的 0 Hz 输出居中在图形或绘图的中间(而不是在左边缘,以负频率环绕到右边缘)。

要执行 fftshift,您可以在 FFT 之前对数据进行外差或调制(按 Fs/2),或者在 FFT 之后简单地执行 50% 的循环移位。两者都产生相同的结果。由于 DFT 的 shift 属性,它们是相同的。

【讨论】:

哦,我明白了。我检查了 fftshift 函数的作用(至少在 MATLAB 中),它切换了向量的左右两半。所以我猜想将初始数据交替乘以 +1 和 -1 会得到相同的结果,对吧? (感谢您的回答!我决定使用 fftshift 函数,因为它比证明我使用“掩码”的决定更容易解释)。

以上是关于为啥在执行快速傅里叶变换时需要遮罩?的主要内容,如果未能解决你的问题,请参考以下文章

为啥啁啾频率的微小变化会导致快速傅里叶变换输出发生重大变化?

快速傅里叶变换FFT(Fast Fourier Transform)

音频算法入门-傅里叶变换

傅里叶变换通俗解释及快速傅里叶变换的python实现

关于快速傅里叶变换

快速傅里叶变换fft