简体   繁体   中英

More efficient way of subsampling sound files?

Apologies in advance if this has already been asked and for my wording of this question as I am new to R.

Is there any way of making my code for subsampling sound files more efficient? I have 148 hours of recordings from 9 sites, for each site I am subsampling 12 1-min segments every 5 minutes. The way I am doing it at the moment works but it very time consuming. Is there a way of making this code more efficient?

###hour 3###
setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson")
hod3a<-readWave("20200820_020000.wav", from = 0, to = 1, units="minutes")
hod3b<-readWave("20200820_020000.wav", from = 5, to = 6, units="minutes")
hod3c<-readWave("20200820_020000.wav", from = 10, to = 11, units="minutes")
hod3d<-readWave("20200820_020000.wav", from = 15, to = 16, units="minutes")
hod3e<-readWave("20200820_020000.wav", from = 20, to = 21, units="minutes")
hod3f<-readWave("20200820_020000.wav", from = 25, to = 26, units="minutes")
hod3g<-readWave("20200820_020000.wav", from = 31, to = 32, units="minutes")
hod3h<-readWave("20200820_020000.wav", from = 35, to = 36, units="minutes")
hod3i<-readWave("20200820_020000.wav", from = 40, to = 41, units="minutes")
hod3j<-readWave("20200820_020000.wav", from = 45, to = 46, units="minutes")
hod3k<-readWave("20200820_020000.wav", from = 50, to = 51, units="minutes")
hod3l<-readWave("20200820_020000.wav", from = 55, to = 56, units="minutes")

setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)")
writeWave(hod3a, filename="hod3a.wav",extensible=FALSE)
writeWave(hod3b, filename="hod3b.wav",extensible=FALSE)
writeWave(hod3c, filename="hod3c.wav",extensible=FALSE)
writeWave(hod3d, filename="hod3d.wav",extensible=FALSE)
writeWave(hod3e, filename="hod3e.wav",extensible=FALSE)
writeWave(hod3f, filename="hod3f.wav",extensible=FALSE)
writeWave(hod3g, filename="hod3g.wav",extensible=FALSE)
writeWave(hod3h, filename="hod3h.wav",extensible=FALSE)
writeWave(hod3i, filename="hod3i.wav",extensible=FALSE)
writeWave(hod3j, filename="hod3j.wav",extensible=FALSE)
writeWave(hod3k, filename="hod3k.wav",extensible=FALSE)
writeWave(hod3l, filename="hod3l.wav",extensible=FALSE)

setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)", resultfile = "ndsi_resultS2.csv", soundindex = "ndsi", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)", resultfile = "adi_results.csv", soundindex = "acoustic_diversity", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)", resultfile = "aei_results.csv", soundindex = "acoustic_evenness", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)", resultfile = "aci_results.csv", soundindex = "acoustic_complexity", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (3)", resultfile = "H_results.csv", soundindex = "H", no_cores = "-2")

###hour 4###
setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson")
hod4a<-readWave("20200820_030000.wav", from = 0, to = 1, units="minutes")
hod4b<-readWave("20200820_030000.wav", from = 5, to = 6, units="minutes")
hod4c<-readWave("20200820_030000.wav", from = 10, to = 11, units="minutes")
hod4d<-readWave("20200820_030000.wav", from = 15, to = 16, units="minutes")
hod4e<-readWave("20200820_030000.wav", from = 20, to = 21, units="minutes")
hod4f<-readWave("20200820_030000.wav", from = 25, to = 26, units="minutes")
hod4g<-readWave("20200820_030000.wav", from = 31, to = 32, units="minutes")
hod4h<-readWave("20200820_030000.wav", from = 35, to = 36, units="minutes")
hod4i<-readWave("20200820_030000.wav", from = 40, to = 41, units="minutes")
hod4j<-readWave("20200820_030000.wav", from = 45, to = 46, units="minutes")
hod4k<-readWave("20200820_030000.wav", from = 50, to = 51, units="minutes")
hod4l<-readWave("20200820_030000.wav", from = 55, to = 56, units="minutes")


setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)")
writeWave(hod4a, filename="hod4a.wav",extensible=FALSE)
writeWave(hod4b, filename="hod4b.wav",extensible=FALSE)
writeWave(hod4c, filename="hod4c.wav",extensible=FALSE)
writeWave(hod4d, filename="hod4d.wav",extensible=FALSE)
writeWave(hod4e, filename="hod4e.wav",extensible=FALSE)
writeWave(hod4f, filename="hod4f.wav",extensible=FALSE)
writeWave(hod4g, filename="hod4g.wav",extensible=FALSE)
writeWave(hod4h, filename="hod4h.wav",extensible=FALSE)
writeWave(hod4i, filename="hod4i.wav",extensible=FALSE)
writeWave(hod4j, filename="hod4j.wav",extensible=FALSE)
writeWave(hod4k, filename="hod4k.wav",extensible=FALSE)
writeWave(hod4k, filename="hod4l.wav",extensible=FALSE)

setwd("C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)", resultfile = "ndsi_resultS2.csv", soundindex = "ndsi", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)", resultfile = "adi_results.csv", soundindex = "acoustic_diversity", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)", resultfile = "aei_results.csv", soundindex = "acoustic_evenness", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)", resultfile = "aci_results.csv", soundindex = "acoustic_complexity", no_cores = "-2")
multiple_sounds(directory = "C:/Users/Cex/Desktop/R Studio/Audiomoth Files/Rural/Hodkinson/hour - Copy (4)", resultfile = "H_results.csv", soundindex = "H", no_cores = "-2")

I am currently having to go through the code for each hour and change the numbers of the hours manually which takes a great deal of time. I hope I have communicated this correctly, any help is greatly appreciated.

We could create two seq uences and loop over them with Map , read the data with readWave specifying the from , to as the looped values and store it in a list

readLst <- Map(function(i, j) 
     readWave("20200820_020000.wav", from = i, to = j,
           units = "minutes"), seq(0, 55, by = 5), seq(1,  56, by = 5))

Similarly for writing the file

lapply(seq_along(readLst), function(i)
         writeWave(readLst[[i]], 
      filename= paste0("hod3" letters[i],  ".wav"), extensible=FALSE))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM