“x”和“y”长度在R中与fft不同

时间:2013-05-06 12:34:45

标签: r fft

您好我从stat.ethz.ch

中取了示例
## 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值,如f(什么在做奈奎斯特)。所以得到:“'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

感谢您的帮助!

1 个答案:

答案 0 :(得分: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)
}