2016-08-19 90 views
0

对于我的工作,我需要分析大型的.wav文件(> 208 MB),并使用R软件包seewave和tuneR。我使用readWave函数将每个文件放入R环境中,使用readWave函数如下:快速分割使用R的大型.wav文件的方法

tr1_1 = readWave("TR1_edit.WAV", from = 0, to = 0.5, units = "minutes") 
tr1_2= readWave("TR1_edit.WAV", from = 0.5, to = 1, units = "minutes") 
tr1_3= readWave("TR1_edit.WAV", from = 1, to = 1.5, units = "minutes") 
tr1_4= readWave("TR1_edit.WAV", from = 1.5, to = 2, units = "minutes") 
tr1_5= readWave("TR1_edit.WAV", from = 2, to = 2.5, units = "minutes") 

等等。此方法有效,但效率不高或漂亮。有没有办法更有效地导入和分割大的.wav类文件?

+0

你试过'for'循环或“应用”家庭功能? – epo3

回答

2

如果您将所有这些内容加载到内存中,而不是顺序变量名称,则应使用列表。

tr1 = list() 
duration = 0.5 
start_times = seq(0, 2, by = duration) 

for (i in seq_along(start_times)) { 
    tr1[[i]] = readWave('TR1_edit.WAV', 
         from = start_times[i], 
         to = start_times[i] + duration, 
         units = 'minutes') 
} 

这与为什么you should use a list of data frames而不是顺序命名数据帧的原理相同。

您可以轻松地将其包含到一个函数中,该函数将WAV文件的名称作为输入,从元数据中获取其长度,并在30秒(或参数化参数)段中导入它,并返回列表段。

+0

谢谢,这是一个很好的解决方案。你将如何从它的元数据中获取文件的长度? – dooogan

+0

我不知道 - 从未使用WAV文件 - 但我认为有一个简单的方法。我做了一个快速搜索“R WAV文件长度”[并得到这看起来非常有用](http://stackoverflow.com/q/23415036/903061)。你总是可以问一个关于如何在不读入WAV文件的情况下找到一个WAV文件长度的新问题。 – Gregor

+0

@SeanHardison文件的持续时间就是样本数除以采样率。如果你首先阅读完WAV,你可以这样做:'duration < - length(TR1_edit @ left)/ TR1_edit @ samp.rate' – AkselA

0

@Gregor和@AkselA感谢您的意见。 for循环解决方案最大的问题是我正在使用的wave文件大小不一,所以我最终会在结果列表中留下空白元素。我目前的解决方案导入整个文件,然后将其分解到30多岁件从那里:

duration = 1.44e6 

tr1 <- readWave("TR1_edit.wav", from = 0, to = 1, units = "minutes") 
tr1 <- as.matrix([email protected]) 
tr1 <- cbind(tr1, (rep(1:(length(tr1)/duration), each = duration))) 
tr1 <- lapply(split(tr1[,1],tr1[,2]),matrix, ncol = 1) 

从那里我可以使用mapply返回矢量波类

w <- function(s){ 
    Wave(s, right = numeric(0), samp.rate = 48000, bit = 16, pcm = TRUE) 
} 

tr1 <- mapply(w, tr1) 
+0

Jotas解决方案来自[here](http://stackoverflow.com/questions/20696681/将音频文件分割成任意大小)似乎也能很好地工作。 – AkselA