如何从频谱计算幅度()
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() 函数,那么你应该只在一个位置得到一个脉冲/峰值,而其他任何地方都只是零。
【讨论】:
以上是关于如何从频谱计算幅度()的主要内容,如果未能解决你的问题,请参考以下文章