我是傅立叶分析的非专家,并且很难得到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的后半部分,因为频率&#34;数量&#34;由于奈奎斯特,这一数字仅占采样率的一半。
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")
结果:
这真的是上述功能的正确谱图吗?我的两个假设是否正确?我的错误在哪里?如果没有,这个情节现在告诉我什么?
编辑: 这是一张没有离散化的图片:
感谢所有人,
米莎。
答案 0 :(得分:2)
好的,好的。由于我的错误通常较低的性质,解决方案是非常微不足道的。 我写了freq = 200和duration = 3.但实际持续时间是从-4pi到4 pi,因此8pi导致了一个&#34;真正的&#34;采样频率为1 /((8 * pi)/ 600)= 23.87324,不等于200。 用
替换示例代码中的相应行freq <- 200 #sample frequency in Hz
duration <- 6 # length of signal in seconds
x <- seq(0,duration, length.out = freq*duration)
y <- sin(4*pi*x) + sin(6*pi*x) + sin(8*pi*x)
(具有更具说明性的功能)产生正确的频率,如下图所示(仅限于频域的重要部分):