为什么在执行快速傅立叶变换时需要使用遮罩?

时间:2019-04-15 10:54:19

标签: r fft

我正在尝试使用R中的fft()方法找出隐藏在数据中的峰值频率。在准备数据时,经验更丰富的用户建议创建一个“掩码”(在解释了详细内容之后,更多),确实为我提供了所需的图表。问题是,我不了解它的作用或需要它的原因。

为了提供一些背景信息,我正在使用.txt文件,每个文件都有大约12000个条目。它是电压与时间的关系信息,预期结果只是正弦波,其峰值频率应接近1-2 Hz。这是这些文件之一的示例:

My plotted data

我一直在尝试使用在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)计算的绝对值与频率范围的关系时,我得到了:

abs(fft(data)) vs. frequency

峰值频率似乎接近50 Hz,但我知道并非如此。它应该接近1 Hz。我是R和Fourier分析领域的一名新手,因此,在进行了一些研究之后,我发现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轴限制在合理范围内的图表)。 Right frequency diagram!

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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