【问题标题】:How to calculate amplitude from spectrum()如何从频谱计算幅度()
【发布时间】:2018-01-08 09:50:43
【问题描述】:

我有一个信号,我需要获取在spectrum() 找到的频率的实际幅度

考虑以下信号

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

使用spectrum() 我得到以下信息:

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

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

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

【问题讨论】:

    标签: r fft spectrum


    【解决方案1】:

    这里的信号幅度和频谱幅度之间没有关系。正弦的傅立叶变换是对应频率的 delta 函数,即具有无限幅值的无限窄 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
    

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

    【讨论】:

      【解决方案2】:

      一个迟到的答案,但以防万一它帮助别人。正如先前的答案所述,这不是如何将谱密度转换为幅度的问题,而是在我们的密度谱中找到一个信号后,我们如何在主频率处提取幅度。我发现建议的自定义函数 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 的峰值。

      如果对您也有帮助,请投票支持此自定义函数的来源!

      【讨论】:

        【解决方案3】:

        如果你的信号真的像你在代码中提到的那样,一个 sin() 函数,那么你应该只在一个位置得到一个脉冲/峰值,而其他任何地方都只是零。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 2021-05-15
          相关资源
          最近更新 更多