for.loop with WAV files

时间:2014-02-03 23:16:04

标签: r 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 个答案:

答案 0 :(得分:1)

我的第一个想法是使用lapply来读取文件。有点像这样:

wav_files <- lapply(mydir, readWave)

然后,我将使用lapply浏览生成的Wave对象列表,以完成任务的其余部分。

这样的东西可以用于提取频道和使用rms函数:

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

注意:这是未经测试的。

答案 1 :(得分:1)

我认为您可能只需要从当前目录获取文件的完整路径。

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

或者,您可以在list.files之后但在阅读之前更改目录。

setwd("directory")

答案 2 :(得分:1)

仅供参考,以下是我这样做的方法:

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〜