R中的FFT,获取值

FFT in R, obtaining values

我有一个使用 2 个正弦波生成的数据

inputSignal <- 60000*sin(2*pi*(0.042)*x+4.5)+100000*sin(2*pi*(0.043)*x+3.3)

我想用 FFT 检索这个信号。我可以以图形方式进行并定位频率。如何在不从图表中读取的情况下直接获取频率、幅度和相位的值。

samplingFrequency <- 128
timeInterval <- 1/samplingFrequency
x<-c(0:1048575)*timeInterval
inputSignal <- 60000*sin(2*pi*(0.042)*x+4.5)+100000*sin(2*pi*(0.043)*x+3.3)
ffts <- fft(inputSignal)
freq <- c(0:(length(ffts)-1))*samplingFrequency/length(ffts)
plot(freq,abs(ffts)/(length(ffts)/2),type="h",xlim=c(0.042,0.043))

由于 real-valued 信号的 FFT 是对称的,我们只取前半部分:(real-valued FFT 有一个更有效的算法,它将实数值打包到一个复杂的向量,以避免浪费。我不知道它是否在 R 中的任何地方实现;我很久以前就从 Press 等人那里学到了它。Numerical Recipes)

N <- length(ffts)/2
ind <- 1:ceiling(N)
af <- abs(ffts[ind])/N  ## or Mod(ffts[ind])
i <- which(af %in% rev(sort(af))[1:2])   ## find two max frequencies

ff <- ffts[i]/length(ind-1)
Mod(ff)
atan2(Im(ff), Re(ff))
freq[i]

这个(或类似的东西)应该是大致正确的。我没有 double-checked 我所有的指数、象限、sin 与 cos 等(很可能你比我更记得傅立叶变换的细节......)如果我犯了错误,欢迎在评论中纠正我。