声学复杂度指数时间序列输出

huangapple go评论59阅读模式
英文:

Acoustic complexity index time series output

问题

我有一个.wav文件,我想在每一秒计算声学复杂度指数(Acoustic Complexity Index),并获得一个时间序列输出。

我了解如何修改函数内的其他设置,比如seewave::ACI(),但我无法找出如何输出一个时间序列的数据框,其中每一行都是一秒的时间,带有相应的ACI值。

为了提供一个可重现的示例,这个音频文件有20秒,所以我希望输出有20行,每行打印出那一秒的ACI值。

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

实际上,我想要实现这一点还有一些其他指标,例如:

soundecology::ndsi(tropicalsound)
soundecology::acoustic_evenness(tropicalsound)
英文:

I have a wav file and I would like to calculate the Acoustic Complexity Index at each second and receive a time series output.

I understand how to modify other settings within a function like seewave::ACI() but I am unable to find out how to output a time series data frame where each row is one second of time with the corresponding ACI value.

For a reproducible example, this audio file is 20 seconds, so I'd like the output to have 20 rows, with each row printing the ACI for that 1-second of time.

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

In fact, I'd like to achieve this is a few other indices, for example:

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

答案1

得分: 2

以下是代码的翻译部分:

您可以根据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
})

这使我们能够创建一个按秒计的数据框,表示每个度量的时间序列:

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

请注意,这仅是演示如何实现所需输出的方法;您需要查阅文献以确定是否适合在如此短的时间段内使用这些度量。

英文:

You can subset your wav file according to the samples it contains. Since the sampling frequency can be obtained from the wav object, we can get one-second subsets of the file and perform our calculations on each. Note that you have to set the cluster size to 1 second, since the default is 5 seconds.

library(soundecology)
data(tropicalsound)

f &lt;- tropicalsound@samp.rate

starts &lt;- head(seq(0, length(tropicalsound), f), -1)

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

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

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

This allows us to create a second-by-second data frame representing a time series of each measure:

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

Note that this is simply a demonstration of how to achieve the desired output; you would need to check the literature to determine whether it is appropriate to use these measures over such short time periods.

huangapple
  • 本文由 发表于 2023年2月19日 19:14:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/75499727.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定