我正在尝试创建一个循环来读取 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"
...
这就是我所期望的,因为这些是我的声音文件的名称。想法?
我认为您可能只需要从当前目录获取文件的完整路径。
mydir <- list.files("directory", recursive=TRUE, full.names=TRUE)
或者,您可以在
list.files
之后但在阅读它们之前更改目录。
setwd("directory")
我是这样做的:
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 文件。我认为这个脚本只能处理两个目录。
我的第一个想法是使用
lapply
来读入文件。类似这样的事情:
wav_files <- lapply(mydir, readWave)
然后我将使用
lapply
浏览 Wave 对象的结果列表来完成任务的其余部分。
这样的东西可以用于提取通道并使用
rms
函数:
right_rms <- lapply(wave_files, function(x)rms(x@right))
我遇到了一个问题,在使用 Jota 的产品线后:
wav_files <- lapply(mydir, readWave)
我收到此错误
readBin(con, int, n = 4, size = 1, endian = "little",signed = FALSE) %*% 中的错误:不一致的参数
有什么想法吗?