我有一个信号,我需要得到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
的信号的实际幅度 - 或接近某个值?
答案 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()函数,那么您应该只在一个位置获得一个脉冲/峰值,而其他任何地方都只是零。