如何从频谱计算幅度()

时间:2018-01-08 09:50:43

标签: r fft spectrum

我有一个信号,我需要得到spectrum()

处的频率的实际幅度

考虑以下信号

f <- 5
n <- 500
signal <- 4*sin(2*pi*f*seq(0,10,1/n))
S.signal <- spectrum(signal, log="no")

使用spectrum()我得到以下内容:

enter image description here

我可以使用以下方法验证峰值的幅度:

> max(S.signal$spec)
[1] 16698.45

如何将此值16698.45转换为该频率4的信号的实际幅度 - 或接近某个值?

3 个答案:

答案 0 :(得分:1)

此处信号幅度与频谱幅度无关。窦的傅立叶变换是在相应频率处的Δ函数,即具有无限幅度的无限窄pic。

你发现你的信号幅度值的事实是由于你的信号采样导致信息丢失,你可以在这里看到:

f <- 5
n <- 1000
signal <- 4*sin(2*pi*f*seq(0,10,1/n))
S.signal <- spectrum(signal, log="no")
max(S.signal$spec)
[1] 25261.03

你有更好的采样,所以你得到的值更接近光谱的实际值(这里是无穷大)。

答案 1 :(得分:1)

一个迟到的答案,但以防它对其他人有帮助。正如之前的答案所述,这不是如何将谱密度转换为幅度的问题,而是在我们的密度谱中找到信号后,我们如何提取主频率处的幅度。我发现建议的自定义函数 in this post 很有用。

使用原始海报示例实现它的示例:

power_spec = function(y,samp.freq, ...){

  N <- length(y)
  fk <- fft(y)
  fk <- fk[2:length(fk)/2+1]
  fk <- 2*fk[seq(1, length(fk), by = 2)]/N
  freq <- (1:(length(fk)))* samp.freq/(2*length(fk))
  data.frame(amplitude = Mod(fk), freq = freq)
}

f <- 5
n <- 500
signal <- 4*sin(2*pi*f*seq(0,10,1/n))

x = power_spec(signal,samp.freq = 1/n)

plot(x$amplitude~x$freq,type='l',xlim=c(0,10))

我们在 f = 5 处找到了一个振幅为 4 的峰值。

如果对您也有帮助,请为这个自定义函数的出处点赞!

答案 2 :(得分:0)

如果您的信号非常类似于您在代码中提到的sin()函数,那么您应该只在一个位置获得一个脉冲/峰值,而其他任何地方都只是零。