如何从频谱计算幅度()

Posted

技术标签:

【中文标题】如何从频谱计算幅度()【英文标题】: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 或接近的信号的实际幅度?

【问题讨论】:

【参考方案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() 函数,那么你应该只在一个位置得到一个脉冲/峰值,而其他任何地方都只是零。

【讨论】:

以上是关于如何从频谱计算幅度()的主要内容,如果未能解决你的问题,请参考以下文章

STM32实现FFT,求取幅度频谱

如何使用频谱分析仪

如何使用 python 绘制整个音频文件的频谱或频率与幅度的关系?

用openGL绘制频谱图的最佳方法是啥

利用MATLAB计算周期序列的频谱

如何从傅里叶输出中生成详细的频谱图?