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))
Примечание: это не проверено.