我正在尝试处理正弦时间序列数据集:
library(readxl)
library(stats)
library(matplot.lib)
library(TSA)
Data_frame<-read_excel("C:/Users/James/Documents/labssin2.xlsx")
# compute the Fourier Transform
p = periodogram(Data_frame$NormalisedVal)
dd = data.frame(freq=p$freq, spec=p$spec)
order = dd[order(-dd$spec),]
top2 = head(order, 5)
# display the 2 highest "power" frequencies
top2
time = 1/top2$f
time
但是,当检查频谱时,该频率(以Hz为单位)非常低,约为0.02Hz,而它应具有一个较大的频率(约为1Hz)和另一个较小的频率(约为0.02Hz)(仅在视觉上假设这是正弦曲线)包裹在另一个正弦波中。
可能是一个相当琐碎的问题,但是有人对可能出什么问题有任何想法吗?
谢谢。
编辑1:使用
result <- abs(fft(df$Data_frame.NormalisedVal))
产生我期望看到的。
Edit2:根据请求,输出到dput(Data_frame)的文本文件。 http://m.uploadedit.com/bbtc/1553266283956.txt
答案 0 :(得分:1)
periodogram函数返回在[0,0.5]范围内的归一化频率,其中0.5对应于Nyquist frequency,即一半采样率。由于您似乎以60Hz采样了数据,因此0.02的峰值将对应于0.02 * 60 = 1.2Hz的频率,这与您的预期相符,并且与您所提供的数据中可以看到的相近(大部分的峰值在0.7-1.1Hz范围内。
另一方面,您基于fft
显示的最后一个图形的x轴是索引,而不是频率。相应的频率应根据以下公式计算:
f <- (index-1)*fs/N
其中fs
是采样率,N
是fft
使用的采样数。因此,假设N
大约为1500,在您的图形中,相同的1.2Hz频率将以〜31的索引出现。
注意:由于periodogram
和fft
都假设有规则的采样间隔,因此您提供的数据中的采样间隔不是很恒定,并且可能会影响结果。>