2013-05-06 33 views
0

您好我接过例子来自:stat.ethz.ch“X”和“Y”的长度与FFT不同R中

## Now let's look at some artificial data: 
x <- seq(100000)/1000 # pretend we're sampling at 1 kHz 

## We'll put in two frequency components, plus a dc offset 
f1 <- 5 # Hz 
f2 <- 2 # Hz 
y <- 0.1*sin(2*pi*f1*x) + sin(2*pi*f2*x) + 50 
fft.y <- fft(y) 
delta <- x[2] - x[1] 
f.Nyquist <- 1/2/delta 
f <- f.Nyquist*c(seq(length(x)/2), -rev(seq(length(x)/2)))/(length(x)/2) 

par(mfrow=c(2,2)) 
plot(x,y, type='l', xlim=c(0,20)) 
plot(f, Mod(fft.y), type='l', log='y') 

## Now let's zoom in and mark the points were I expect to see peaks: 
plot(f, Mod(fft.y), type='l', log='y', xlim=c(-10,10)) 

现在我有一个数据帧分析 - DF。 df的第一列(V1)是日期,第二列是值(V2)。我设定了分数,但我总是得到一个更多的fft值(与奈奎斯特做的是什么)。因此得到:“'x'和'y'长度不同”。不知道问题出在哪里!

y <- df$V2 
fft.y <- fft(y) 
delta <- 10 # I know that there are 10sec between values 
f.Nyquist <- 1/2/delta 
f <- f.Nyquist*c(seq(length(df$V1)/2), -rev(seq(length(df$V1)/2)))/(length(df$V1)/2) 

DF的样子:

07032012-185821;20.0 
07032012-185831;12.0 
07032012-185841;14.0 

,并有大约20000个obersvations

感谢您的帮助!

+0

,才有可能分享'df'? – Nishanth 2013-05-06 12:41:36

+0

也许这是一种限制性的问题 - 确实有大约20000个观测值 - 对于df抱歉,我会给出一个例子,看看它是怎么样的。 – 2013-05-06 12:48:00

+0

生成一些模仿你的情况的随机数甚至更好,使用'runif'。 – 2013-05-06 12:55:39

回答

1

大胆猜测,我认为当观察的长度很奇怪时会出现问题。基本上,

length(c(seq(length(df$V1)/2), -rev(seq(length(df$V1)/2)))) 

不等于

length(df$V2) 

这是由于整数前的舍入:seq(length(1:9)/2)是相同seq(length(1:8)/2)虽然原始向量的长度不同。

编辑: 它可以通过固定:

if (length(df$V2) %% 2 == 1) 
{ 
    f <- f.Nyquist*c(seq(length(df$V1)/2), 0, -rev(seq(length(df$V1)/2)))/(length(df$V1)/2) 
} else 
{ 
    f <- f.Nyquist*c(seq(length(df$V1)/2), -rev(seq(length(df$V1)/2)))/(length(df$V1)/2) 
} 
+0

是观察次数是奇数!我纠正了 - 它的运行!如果观测数量奇怪,是否还有其他解决方案没有问题? – 2013-05-06 13:11:07

+0

现在,你可以放弃最后的观察,如果它的奇数。少于20000人应该没问题。 – Nishanth 2013-05-06 13:13:21

+0

@HerrStudent我已经修复了我的答案。 – Nishanth 2013-05-06 14:27:02

相关问题