如何使用 R 创建循环函数以将 "soundecology" 中的声学索引应用于 .wav 文件的特定部分

How do I create a loop function to apply acoustic indices from "soundecology" to specific sections of .wav files using R

我有大量 .wav 文件需要使用 R 中 "soundecology" 包中的声学指数进行分析。但是,录音没有统一的开始时间,我需要分析具体的文件中的时间段。我想创建一个函数和循环来自动化这个过程。 我为每个录音文件夹(每个文件夹位于不同的位置)创建了一个跨页 sheet,其中列出了我需要分析的录音和每个录音中的时间。基本上,一行包含:声音文件名、样本应该开始的时间(例如 09:00:00、从文件开始到那个时间发生的秒数,以及从开始开始的秒数样本结尾应该出现的文件时间。 该数据如下所示: Spread sheet of data

我正在使用包 "tuneR" 和 "warbleR" 来 select 我想要分析的声音文件的特定部分。这是我想在所有声音文件中循环的代码和输出:

wavrow1 <-read_wave(mvb$sound.files[1], from = mvb$start[1], to = mvb$end[1]) wavrow1.aci <- acoustic_complexity(wavrow1, j=10)

产量

     max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 934.568

但是,当我将其放入函数中以便将其放入循环中时,我得到了不同的输出。

acianalyzeFUN <- function(mvb, i){
  r <- read_wave(mvb$sound.files[i], mvb$start[i], mvb$end[i])
  soundfile.aci <- acoustic_complexity(r, j=10)
}

row1.test <- acianalyzeFUN(mvb, 1)

这给出了输出:

max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 19183.03

  Acoustic Complexity Index (by minute): 931.98

这是不同的。 所以我需要修复这个函数并将其放入一个循环中,这样我就可以将它应用于所有文件并将结果保存到数据框中或最终保存到另一个传播 sheet.

我在想像下面这样的循环可能会起作用,但我也遇到了错误:

output <- vector("logical", length(97)) 
for (i in seq_along(mvb$sound.files)) {     
  output[[i]] <- acianalyzeFUN(mvb, i) 
}

其中returns这个错误:

max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 19183.03

  Acoustic Complexity Index (by minute): 931.98

Error in output[[i]] <- acianalyzeFUN(mvb, i) : 
  more elements supplied than there are to replace

感谢您对此提供的任何帮助和建议。如果还有其他有用的信息,请告诉我。

read_wave 函数采用以下参数:

read_wave(X, index, from = X$start[index], to = X$end[index], channel = NULL, header = FALSE, path = NULL)

在手动测试中,您指定 from = mvb$start[1], to = mvb$end[1]

在您创建的函数中,您没有指定参数:

r <- read_wave(mvb$sound.files[i], mvb$start[i], mvb$end[i])

这样 mvb$start[i] 会影响到索引和 mvb$end[i] 到 from。 你应该写:

acianalyzeFUN <- function(mvb, i){
  r <- read_wave(mvb$sound.files[i], from = mvb$start[i], to = mvb$end[i])
  soundfile.aci <- acoustic_complexity(r, j=10)
}

这应该可以解释您观察到的差异。

关于错误,您创建了一个逻辑向量来收集结果,但是 acianalyzeFUN returns 什么都没有:它只是设置了两个变量 rsoundfileaci 而没有返回任何内容。