FFTではなくて、最大エントロピー法で周波数スペクトラムを得たかった。
ところが、最大エントロピー法とか、周波数解析とか
そのあたりの単語を一緒に検索しても
あんまりピンと来るような結果が出てこない。
理屈はどうでもいいから、R のソースが欲しいんだよ!
というわけで、自分で書いてみる。
書いてみると大したことないんだけど、
キーワードで引っかかるページを作りたかったの。
キーワード:
ARモデル 自己相関 Burg法
最大エントロピー法 MEM ( Maximum Entropy Methods )
library("tuneR")
FREQ <- 44100 # サンプリング周波数Hz
MYBY <- 10 # 何Hzごとに解析するか
fn <- "browniannoise.wav" # 対象のwavファイル
# waveファイルを読み込み
# from=0 を入れないと、最初の1秒は無視されちゃう
# 左チャンネルだけ使う(どっちでもいいけど)
wave.raw <- readWave(fn, from=0, units=c("seconds"))@left
# 時系列データに変換
tsdata <- ts(wave.raw, frequency=FREQ)
#Burg法に従って自己相関関数MEMスペクトルを得る
# n.freq プロットされる点の数
# order 当てはめられる AR モデルの次数
# 省略されると次数は AIC で選ばれる
# method 多分 "yule-walker" または "burg"
result <- spec.ar(tsdata, n.freq=(FREQ/MYBY/2)+1, plot=F, method="burg")
# プロットされる点は、最大で、サンプリング周波数の半分の周波数になるので、
# 最大 4410/2=>22050 個であるになる
# (サンプリング周波数の半分以上の周波数は、解析できない)
# ※n.freqを+1すると、result$freqにキレイな数が入る(0..2205なので0の分を足す)
# result$freq[0]は0が入るので、+1しといたほうがいいんじゃないか(根拠なし)
# 返り値
# specクラスオブジェクト
# result$freq 周波数のリスト
# result$spec 周波数に対応する値のリスト
plot(result) # グラフを表示
※参考
R 基本統計関数マニュアル
https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf
orderを省略してみたが、
次数を赤池法でよしなに選んでもらっても
全然遅くない。
すごいな。
ユールウォーカー法でもいいんだけど、
みんながバーグ法のほうが良いって書いてるから、
バーグ法にしてみた。
全然わかっていないのだけど、
result$spec に入っている値って何なんだろう?
FFT みたいにパワー値が出てきているでもないのかしらん?
値の範囲がわからない。
上のサンプルの入力はブラウンノイズを使っているんだけど、
result$spec[1] には 870870.1 なんつー値が入っていた。
ビット深度 16bit で録音しているのだけど、
そのあたりをごにょごにょして、
なんか計算すれば、きっとなんかわかるんだろうな。
まぁいいや(良くない)
ところが、最大エントロピー法とか、周波数解析とか
そのあたりの単語を一緒に検索しても
あんまりピンと来るような結果が出てこない。
理屈はどうでもいいから、R のソースが欲しいんだよ!
というわけで、自分で書いてみる。
書いてみると大したことないんだけど、
キーワードで引っかかるページを作りたかったの。
キーワード:
ARモデル 自己相関 Burg法
最大エントロピー法 MEM ( Maximum Entropy Methods )
library("tuneR")
FREQ <- 44100 # サンプリング周波数Hz
MYBY <- 10 # 何Hzごとに解析するか
fn <- "browniannoise.wav" # 対象のwavファイル
# waveファイルを読み込み
# from=0 を入れないと、最初の1秒は無視されちゃう
# 左チャンネルだけ使う(どっちでもいいけど)
wave.raw <- readWave(fn, from=0, units=c("seconds"))@left
# 時系列データに変換
tsdata <- ts(wave.raw, frequency=FREQ)
#Burg法に従って自己相関関数MEMスペクトルを得る
# n.freq プロットされる点の数
# order 当てはめられる AR モデルの次数
# 省略されると次数は AIC で選ばれる
# method 多分 "yule-walker" または "burg"
result <- spec.ar(tsdata, n.freq=(FREQ/MYBY/2)+1, plot=F, method="burg")
# プロットされる点は、最大で、サンプリング周波数の半分の周波数になるので、
# 最大 4410/2=>22050 個であるになる
# (サンプリング周波数の半分以上の周波数は、解析できない)
# ※n.freqを+1すると、result$freqにキレイな数が入る(0..2205なので0の分を足す)
# result$freq[0]は0が入るので、+1しといたほうがいいんじゃないか(根拠なし)
# 返り値
# specクラスオブジェクト
# result$freq 周波数のリスト
# result$spec 周波数に対応する値のリスト
plot(result) # グラフを表示
※参考
R 基本統計関数マニュアル
https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf
orderを省略してみたが、
次数を赤池法でよしなに選んでもらっても
全然遅くない。
すごいな。
ユールウォーカー法でもいいんだけど、
みんながバーグ法のほうが良いって書いてるから、
バーグ法にしてみた。
全然わかっていないのだけど、
result$spec に入っている値って何なんだろう?
FFT みたいにパワー値が出てきているでもないのかしらん?
値の範囲がわからない。
上のサンプルの入力はブラウンノイズを使っているんだけど、
result$spec[1] には 870870.1 なんつー値が入っていた。
ビット深度 16bit で録音しているのだけど、
そのあたりをごにょごにょして、
なんか計算すれば、きっとなんかわかるんだろうな。
まぁいいや(良くない)