【发布时间】: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 的正确结果。
提前致谢!
【问题讨论】: