R中的快速傅里叶变换

31
我有一个包含某种动物在12个月内每小时访问次数的数据集。我希望使用快速傅里叶变换来检查其循环模式和周期性。以前我用 Statistica 来完成这个任务,但现在我想用 R 生成频谱密度与周期的图形。请问有什么简便的方法可以在 R 中实现吗?如果可能的话,我还想识别出12小时和24小时的最高活动峰值。
2个回答

42
您可以考虑以下函数:
  • TSA包中的periodogram函数会立即绘制出一个周期图。
  • GeneCycle包中的periodogram函数返回频率列表和估计的功率谱密度。它是一个对stats::spectrum的封装,具有一些特殊选项。
  • stats包中的spectrum函数允许您选择用于估计谱密度的方法:使用周期图或自回归过程。
  • stats包中的cpgram函数会绘制出累积周期图以及置信区间。

例如,查看?cpgram?spectrum获取所有详细信息,并记住当函数名称重复时,使用的是TSA::periodogramGeneCycle::periodogram

此外,网上还有很多示例和教程可供使用这些函数。在这里查看如何使用fft,在这里查看更详细的教程。

另外,如您所知,给定时间序列必须去趋势。因此,请使用diff(x)而不是x。最后,您的时间序列长度必须是12的倍数,以便能够识别12和24小时频率,可以通过例如x[-(1:(length(x) %% 12))]来实现,其中x是去趋势的时间序列。


8

使用spectrum进行频谱密度分析;同时使用fft进行基础快速傅里叶变换。


1
你能详细说一下吗?首先在原始数据上执行fft,然后使用spectrum函数? - user1626688
4
不,spectrum 是一个独立的谱密度分析器;它通过一些预处理、后处理和绘图来调用 fft - Ben Bolker
两个FFT的示例没有首先对数据进行窗口处理。不幸的是,很难找到哪些库可以正确地窗口化数据,除非使用例如斜坡信号进行测试。请务必进行测试以确保正确性。 - Paul S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接