我正在尝试从功率谱中测量信号的带宽。我希望能够在给定相对幅值的情况下提取最小和最大值。我一直在使用"seewave“来计算功率谱,我可以制作一个密度图,并提供白线,但我不知道如何让R告诉我白线与该图相交的位置。我将需要更改感兴趣的相对幅度值,这取决于信号质量,但希望找到一种简单的方法来测量带宽使用R。
power.spec <- spec(IBK.trill.1, flim=c(0,2))
pow.spec <- as.matrix(power.spec)
head(pow.spec)
# x y
# [1,] 0.000000000 0.007737077
# [2,] 0.007470703 0.029795630
# [3,] 0.014941406 0.021248476
# [4,] 0.022412109 0.015603801
# [5,] 0.029882813 0.014103307
# [6,] 0.037353516 0.014584454
freq <- pow.spec[1:2941,1]
head(freq)
# [1] 0.000000000 0.007470703 0.014941406 0.022412109 0.029882813 0.037353516
ampl <- pow.spec[,2]
head(ampl)
# [1] 0.007737077 0.029795630 0.021248476 0.015603801 0.014103307 0.014584454
plot(ampl ~ freq, type="l",xlim=c(0,2))
abline(h=0.45)

发布于 2016-04-10 09:04:58
保存标识超出阈值的"y“值的结果:
wspec <- which( power.spec[, "y"] > 0.45)然后使用这些索引从"x“值中提取,在第一个和最后一个索引处放置垂直线:
abline( v= power.spec[ c( wspec[1], tail(wspec, 1) ) , "x"], col="blue" )顺便说一句,我建议使用原始的"power.spec“值,而不是您的as.matrix版本,因为spec返回一个矩阵,因此不需要强制。我在?spec页面的第一个示例中对此进行了测试。我想你可以变得非常挑剔,试着取"x“的平均值,在阈值超过的地方,以及之前和之后的阈值。这将是:
abline( v= c( mean( myspec[ c( wspec[1]-1, wspec[1]), "x"]) ,
mean( myspec[ c( tail(wspec, 1), tail(wspec, 1)+1 ) , "x"]) ), col="blue" )

我确实研究了与diff的区别,在我的示例中典型的分离是
mean( diff(myspec[ , "x"]) )
[1] 0.0005549795因此,我可以返回并向前推进一半的数量,以获得一个合理的估计。(我用这个作为我对“半高”的估计:max(myspec[, "y"])/2)
https://stackoverflow.com/questions/36523219
复制相似问题