【发布时间】:2014-12-07 13:30:21
【问题描述】:
我不是傅立叶分析方面的专家,完全不明白 R 的函数 fft() 的作用。即使交叉阅读了很多,我也无法弄清楚。 我建立了一个例子。
require(ggplot2)
freq <- 200 #sample frequency in Hz
duration <- 3 # length of signal in seconds
#arbitrary sine wave
x <- seq(-4*pi,4*pi, length.out = freq*duration)
y <- sin(0.25*x) + sin(0.5*x) + sin(x)
看起来像:
fourier <- fft(y)
#frequency "amounts" and associated frequencies
amo <- Mod(fft(y))
freqvec <- 1:length(amo)
我假设 fft 期望在 1 秒的时间跨度内记录一个向量,所以我除以时间跨度
freqvec <- freqvec/duration
#and put this into a data.frame
df <- data.frame(freq = freqvec, ammount = amo)
现在我可以/必须省略 data.frame 的后半部分,因为由于 Nyquist,频率“数量”仅对采样率的一半有意义。
df <- df[(1:as.integer(0.5*freq*duration)),]
为了绘图,我稍微离散化了一点
df.disc <- data.frame(freq = 1:100)
cum.amo <- numeric(100)
for (i in 1:100){
cum.amo[i] <- sum(df$ammount[c(3*i-2,3*i-1,3*i)])
}
df.disc$ammount <- cum.amo
前 20 个频率的绘图函数:
df.disc$freq <- as.factor(df.disc$freq)
ggplot(df.disc[1:20,], aes(x=freq, y=ammount)) + geom_bar(stat = "identity")
结果:
这真的是上述函数的正确频谱图吗?我的两个假设是否正确?我的错误在哪里?如果没有,这个情节现在告诉我什么?
编辑: 这是一张没有离散化的图片:
谢谢大家,
米查。
【问题讨论】:
-
由于您的原始正弦叠加由三个具有不同频率和等幅的分量组成,我希望频谱图由三个等幅的条组成。所以我必须同意结果似乎有问题。
-
这可能会让我的离散化成问题......非常。我添加了一张没有的图片。
-
你为什么要对时间跨度做出假设?傅里叶变换仅作用于提供给它们的数据。我还怀疑您没有正确应用奈奎斯特限制,也没有考虑傅里叶变换输出的“折叠点”。与其询问
R函数在做什么,不如先阅读一些关于 FFT 的实部和虚部代表什么的详细讨论(例如,为什么在正频率和负频率上有峰值)。跨度> -
您怀疑 FFT 部分只是我要解决的更大问题的一小部分。所以我想我可以避免深入研究所有子问题的数学细节。但是,在这种情况下,可能无法逃脱。仍然......如果我将 fft() 应用于向量,我得到的复杂点与我的向量所拥有的点一样多,并且必须有一种方法可以恢复时间分量。所以我的问题:fft() 假设向量是 1 秒“长”,不是吗?