【问题标题】:Measuring bandwidth of a signal in R测量 R 中信号的带宽
【发布时间】:2016-07-31 02:40:25
【问题描述】:

我正在尝试从功率谱中测量信号的带宽。我希望能够在给定相对幅度值的情况下提取最小值和最大值。我一直在使用“seewave”来计算功率谱,我可以制作密度图,并提供 abline,但我无法弄清楚如何让 R 告诉我 abline 与图相交的位置。我需要根据信号质量更改感兴趣的相对幅度值,但想找到一种使用 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)

【问题讨论】:

  • 您可能想查看 ?approx ... 示例用法: approx(ampl, freq, xout=0.45)

标签: r signal-processing spectrogram spectral


【解决方案1】:

保存超过阈值的“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

【讨论】:

  • 非常感谢!这似乎是一个愚蠢的问题,但是我如何提取线条与 x 轴相交的值?
  • 我没有办法测试,因为我使用的示例中的所有 y 值(因为您未能包含获取 IBK.trill.1 的方法)只有正值。 (我想知道您的数据是否也是如此。)min(power.spec[,'y']) 是什么?答案可能取决于答案所需的精度水平[。如果您只需要知道 y[n-1] 是一个符号而 y[n] 是另一个符号的索引值,那么这很容易(但实际上是一个不同的问题,我怀疑已经回答了一个问题。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多