1/fゆらぎの検出方法

アプリ開発

心地よい音について調べていて、1/fゆらぎの計算方法について興味を持った。

少し複雑でわかりにくかったので、忘れないようにメモしておく。




まず、1/fとは何か調べてみると、どうやら以下の式のことを言うらしい。

P = 1 / f (P:パワー、f:周波数)

これの意味として、パワースペクトルのグラフを描いたとき、

周波数が高くなるほど信号が減衰していっており、

その減衰率が、Pがfに反比例するグラフに近いとき、1/fゆらぎがあるという。

音には高さのほかに音色という概念がある。

ピアノの「ラ」とバイオリンの「ラ」では音色が違う。

音色の違いは周波数特性によるものだ。

「ラ」の音だからといって、その音に440Hzの周波数だけ含まれているとは限らない。

色々な雑音(ノイズ)が含まれていて、基本音として440Hzが聞こえるというだけだ。

このことを踏まえて下記式を紐解く。

P = 1 / f (P:パワー、f:周波数)

fが440Hz(ラ)のときP1とする。

では、fが倍音の880Hz(1オクターブ上のラ)のときP2とすると、

P2はP1の半分に減衰する。

つまり、周波数をx倍した場合、音の強さが1/x倍になっているとき、

1/fゆらぎがあり、心地よい音になるということだ。

1/fゆらぎを画像検索すると、P = 1 / fのグラフが出てくる。

反比例のグラフは曲線になるはずだが、グラフが右肩下がりの直線になっているものを見かける。

軸をよく見ると横軸も縦軸も対数になっている。

つまり以下のように式を変形している。

P = 1 / f = f ^ -1

両辺に対数を取って、

logP = log(f ^ -1) = -logf

つまりlogPはlogfに比例する。このとき係数は-1で右肩下がりとなる。

ここまで分かれば、1/fゆらぎ検出プログラムを作ることもできる。

具体的には、fftで音圧からパワースペクトルを計算して、

fとPを対数に変換し単回帰直線の傾きを求める。

その傾きが-1に近いかを判定すればよい。

以上。

コメント

タイトルとURLをコピーしました