R语言 声学复杂性指数时间序列输出

gblwokeq  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(215)

我有一个wav文件,我想计算声学复杂指数在每一秒,并收到一个时间序列输出。
我知道如何在seewave::ACI()这样的函数中修改其他设置,但我无法找到如何输出一个时间序列 Dataframe ,其中每行是一秒的时间,并具有相应的ACI值。
作为一个可重现的示例,这个音频文件是20秒,所以我希望输出有20行,每行打印1秒时间的ACI。

library(soundecology)
data(tropicalsound)
acoustic_complexity(tropicalsound)

其实,我想达到这一点的是其他几个指标,例如:

soundecology::ndsi(tropicalsound)
soundecology::acoustic_evenness(tropicalsound)
xmjla07d

xmjla07d1#

您可以根据wav文件包含的样本来对它进行子集化。由于采样频率可以从wav对象获得,因此我们可以获得文件的一秒子集,并对每个子集执行计算。注意,您必须将簇大小设置为1秒,因为默认值为5秒。

library(soundecology)
data(tropicalsound)

f <- tropicalsound@samp.rate

starts <- head(seq(0, length(tropicalsound), f), -1)

aci <- sapply(starts, function(i) {
  aci <- acoustic_complexity(tropicalsound[i + seq(f)], j = 1)
  aci$AciTotAll_left
})

nds <- sapply(starts, function(i) {
  nds <- ndsi(tropicalsound[i + seq(f)])
  nds$ndsi_left
})

aei <- sapply(starts, function(i) {
  aei <- acoustic_evenness(tropicalsound[i + seq(f)])
  aei$aei_left
})

这使我们能够创建一个逐秒的 Dataframe ,表示每个测量的时间序列:

data.frame(time = 0:19, aci, nds, aei)
#>    time      aci       nds      aei
#> 1     0 152.0586 0.7752307 0.438022
#> 2     1 168.2281 0.4171902 0.459380
#> 3     2 149.2796 0.9366220 0.516602
#> 4     3 176.8324 0.8856127 0.485036
#> 5     4 162.4237 0.8848515 0.483414
#> 6     5 161.1535 0.8327568 0.511922
#> 7     6 163.8071 0.7532586 0.549262
#> 8     7 156.4818 0.7706808 0.436910
#> 9     8 156.1037 0.7520663 0.489253
#> 10    9 160.5316 0.7077717 0.491418
#> 11   10 157.4274 0.8320380 0.457856
#> 12   11 169.8831 0.8396483 0.456514
#> 13   12 165.4426 0.6871337 0.456985
#> 14   13 165.1630 0.7655454 0.497621
#> 15   14 154.9258 0.8083035 0.489896
#> 16   15 162.8614 0.7745876 0.458035
#> 17   16 148.6004 0.1393345 0.443370
#> 18   17 144.6733 0.8189469 0.458309
#> 19   18 156.3466 0.6067827 0.455578
#> 20   19 158.3413 0.7175293 0.477261

请注意,这只是演示“如何”实现所需的输出;您需要查阅文献,以确定在如此短的时间内使用这些措施是否合适。

相关问题