for.loop с файлами WAV

Я пытаюсь создать цикл для чтения стереофонических файлов в R, но я не уверен, стоит ли использовать for.loop или while.loop. Я рассчитываю RMS для обоих каналов.

Вот действие для одного звукового файла:

foo=readWave("mysound.wav")
L=foo@left
R=foo@right
rms(L)
rms(R)

Теперь у меня есть каталоги, заполненные 2-минутными звуковыми файлами. Я хочу взять каждый из этих файлов, изолировать каналы и рассчитать RMS. Я думаю, вот как это делается:

mydir=list.files("directory", recursive=TRUE) 
for (i in 1:length(mydir)) {
    foo=readWave(mydir[i])
    L=foo@left
    R=foo@right
    rms(L)
    rms(R)
    write(combine, file="test.txt", append=true, sep="\t")  
}

Этот цикл возвращает сообщение об ошибке, что мои первые звуковые файлы не существуют. Согласно предложению ниже, я также попытался прочитать в файлах:

wav_files <- lapply(mydir, readWave)
Error in FUN(c("DASBR2_20131112$224708.wav", "DASBR2_20131112$224910.wav",  : 
   File 'DASBR2_20131112$224708.wav' does not exist.

Это также возвращает, что мой файл не существует. Возможно, есть лучший способ чтения в волновых файлах? Может ли lapply или for.loop обрабатывать волны?

Когда я набираю mydir в консоли, R выдает следующий вывод:

> mydir
   [1] "DASBR2_20131112$224708.wav" "DASBR2_20131112$224910.wav"
   [3] "DASBR2_20131112$225110.wav" "DASBR2_20131112$225310.wav"
   [5] "DASBR2_20131112$225446.wav" "DASBR2_20131112$225648.wav"
   ...

Это то, что я ожидаю, так как это имена моих звуковых файлов. Мысли?

3 ответа

Решение

Просто для справки, вот как я это сделал:

fnam=file.path("directory path")
filist=list.files(fnam, recursive=TRUE, pattern="wav")
filist1=paste(fnam, "/", filist, sep="")
nfiles=length(filist1)
test_rms=c("Full File Path", "RMS-L","RMS-R")
for (i in 1:nfiles){
     inname=filist1[i]
     ywave=readWave(inname)
     L=ywave@left
     R=ywave@right
     test_rms = rbind(test_rms, c(inname, rms(L), rms(R)))
 }

Код для RMS может быть заменен любым процессом, который вам необходимо выполнить. Я скажу, что код не прошел через весь мой каталог, так как у меня были подкаталоги. По крайней мере, два глубоко от пути, который я указал. Этот код прошел один уровень и прочитал все в этом каталоге, даже файлы wav в других подкаталогах. Я думаю, что этот скрипт может справиться с двумя каталогами. Если у кого-нибудь есть альтернатива, пожалуйста, дайте мне знать!

Ура,

~ ETG

Я думаю, вам может понадобиться получить полный путь к файлам из текущего каталога.

mydir <- list.files("directory", recursive=TRUE, full.names=TRUE)

Кроме того, вы можете изменить каталоги после list.files но прежде чем читать их.

setwd("directory")

Моя первая мысль заключается в использовании lapply читать в файлах. Что-то вроде этого:

wav_files <- lapply(mydir, readWave)

Затем я бы просмотреть список объектов Wave, используя lapply выполнить оставшиеся части задачи.

Нечто подобное может работать для извлечения каналов и использования rms функция:

right_rms <- lapply(wave_files, function(x)rms(x@right)) 

Примечание: это не проверено.

Другие вопросы по тегам