実効値(RMS)を計算する

これまでMatlabでやってきたことをR言語で置き換えられないか、検討を続けています。R言語は統計処理に強いのですが汎用的にも用いることができるので、もちろん信号処理的なことができないわけはありません。

今回は音ファイルの実効値の計算をしてみました。ただし、音ファイル全体の実効値ではなく、時間分割をして実効値がどのように変動しているかを見られるようにしてみました。

# 音ファイルの読み込み
library(tuneR)
wobj <- readWave("soundfile.wav")

# ステレオの場合はモノラルに変換
if (wobj@stereo == TRUE) {
  x <- (wobj@left + wobj@right) / 2
} else {
  x <- wobj@left
}

# 音を[-1,+1)の範囲にする
x <- x/(2^(nbits-1))
nbits <- wobj@bit
fs <- wobj@samp.rate

# 30msごとに分割して、それぞれの実効値を計算
window.size <- round(30/1000 * fs)
y <- c()
for (n in seq(from=1, to=length(x), by=window.size)) {
  # ベクトルの最後だけ分割した長さが異なるため対処する
  if (length(x) > n+window.size) {
    y <- rbind(y, sqrt(mean(x[n:(n+window.size)]^2)))
  } else {
    y <- rbind(y, sqrt(mean(x[n:length(x)]^2)))
  }
}

# グラフに描画
t <- seq(0, (length(x)-1)/fs, length.out=length(y))
plot(t, 10*log10(y), xlab="Time (s)", ylab="RMS (dB)", type="l")
grid()