2016-08-19 21 views
0

私の仕事では、大規模な.wavファイル(> 208 MB)を分析する必要があり、RパッケージseewaveとtuneRを利用します。私は以下のようにreadWave関数を使って、各ファイルを30sのチャンクでR環境に持っていきます。大規模な.wavファイルを高速で分割する方法R

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

を振るためにベクトルを返すためにmapply使用することができますが、 'for'を試してみましたループまたは 'apply'ファミリ関数? – 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ファイルを読み込まずに長さを見つける方法について常に新しい質問をすることができます。 – 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) 

そこから私はクラスに

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

tr1 <- mapply(w, tr1) 
+0

Jotas solution from here [http://stackoverflow.com/questions/20696681/]任意のサイズのファイルに分割されたオーディオファイル)もうまくいくように見えます。 – AkselA

関連する問題