目次
MFCC の計算式についてまとめました。
ここでは、フーリエ変換、離散コサイン変換などの詳細な説明は行わず、計算される式をただひたすら並べています。
フレーム化処理 (窓かけ)
音声などのスペクトル分析では、音声区間全体でのフーリエ変換を行うのでなく、20-40 ms の区間で時間窓 (time window) を掛けて周波数分析を行います。 フーリエ変換を行えば、周波数成分がわかるのですが、切り出した信号がその区間で波の形になることはまずありません。 そこで、窓関数をつかって両端をつなげ、周期関数とみなして分析を行います。 そして、 8-16 ms ごとにこの時間窓をシフトしながら繰り返し分析を行って、スペクトルの時間的な変化を見ます。 この信号処理の手法を短時間スペクトル分析といいます。
窓関数(time window function)は何種類もありますが、次のものがよく使われます。 音声から連続する ( N ) 個 のデータ ( x ) を抜き出して分析を行います。
ハミング窓
( n = 0, cdots , N-1)
[ w(n) = 0.54 – 0.46 cos frac{ pi n }{N} ]最大値は 1, 最小値は 0.08 です。
最小値がゼロではないので、高周波成分が入り込みます。
ハニング窓
Hann さん が考案したものですが、 ハミングに対してハニングと呼ばれています。
[ w(n) = 0.5 – 0.5 cos frac{ pi n }{N} ]最大値は 1, 最小値は 0 です。 この関数を掛けることで、切り出した区間は周期関数として扱えます。
離散フーリエ変換
信号 ( x(n) ) に対して窓関数 ( w(n) ) を掛けて離散フーリエ変換(DFT)を行います。
[ X(k) = sum ^{N-1}_{n=0} w(n) x(n) exp left( – frac{ -j2 pi k n}{N} right) ]メルフィルタバンク
サンプリング周波数を ( f_s ) とします。 観測できる周波数はこの ( f_s ) 以下の周波数となります。 今後の計算でも使いますので ( f(k) = frac{k}{N} f_s ) と定義します。
フィルタバンクは、窓関数にある意味似ているのですが、特定の範囲の値のみを有効なものとして扱う関数を集めたものです。 メルフィルタバンクはメルスケールにおいて等間隔に刻んだフィルタバンクになります。
ここではフィルタバンクの数を ( M ) 個 として進めます。 ( M ) は ( N ) に比べて極めて小さいと考えてください。
メルスケールへの変換
人間の感覚的な音の尺度をメルスケールと言い、メルスケール上の値の感覚が同じであれば、人間が感じる音の高低差も同じと考えられています。
周波数 ( f ) は次のようにメルスケールの値 ( p ) に変換されます。
[ p = 2595 log _{10} left( frac{f}{700} + 1 right) ]これを ( f ) について解くと、 メルスケールの値 ( p ) を周波数に逆変換する式が求められます。
[ f = 700 left( 10 ^{frac{p}{2595}} – 1 right) ]中心周波数の計算
各 ( m = 1, cdots , M ) について中心周波数 ( f_c (m) ) を計算します。
分析対象の周波数帯を考えると、その最小値 ( f_{mathrm{min}} ) と 最大値 ( f_{mathrm{max}} ) が定まります。 これらをメルスケールに変換したものをそれぞれ ( p_{mathrm{min}} ) , ( p_{mathrm{max}} ) とします。
( Delta p ) を次のように定義します。
[ Delta p = frac{ p_{mathrm{max}} – p_{mathrm{min}}}{M} ]次に ( p_c ) を次のように定義します。
[ p_c (m) = m Delta p ]こうすることで ( p_c (1) , cdots , p_c(M) ) はメルスケール上で等間隔の値となります。 これを周波数に変換したものが中心周波数 ( f_c ) となります。
以上より定められた ( f_c ) を用いてメルフィルタバンクの式を表します。
[ H(k, m) = begin{cases} 0 & ( f(k) lt f_c (m-1) ) \ frac{f(k) – f_c (m-1)}{f_c (m) – f_c (f-1)} & ( f_c (m-1) leq f(k) lt f_c(m) ) \ frac{f_c (m+1) – f(k)}{f_c (m+1) – f_c (m)} & (f_c (m) leq f(k) lt f_c (m+1) ) \ 0 & (f_c (m+1) lt f(k) ) end{cases} ]( k ) も ( m ) も変数だと考えると大変ですが、 ( k ) 番目の離散信号値について考えますので、 ( m ) を固定して考えるとわかりやすいと思います。 ( xy ) 平面 を考えるとしたら、 ( x ) 軸 に周波数値を考え、 ( y ) 軸 に ( H ) の値を考えましょう。 すると ( f_c ( m – 1 ) leq x lt f_c ( m + 1 ) ) で 最大値を1とする三角形型のグラフができます。
- ( x = f_c ( m – 1 ) ) までは ( y = 0 )
- ( f_c ( m – 1 ) leq x lt f_c (m) ) では ( y = 0 ) から ( y = 1 ) へ向かう直線
- ( f_c ( m ) leq x lt f_c (m+1) ) では ( y = 1 ) から ( y = 0 ) に向かう直線
- それよりも大きい (x ) ( ( f_c (m + 1) lt x ) ) では ( y = 0 )
MFCC の計算
まず ( X(n) ) を対数にします。
[ X'(m) = log left( sum ^{N-1}_{k=0} | X(k) | H(k, m) right) ]これを離散コサイン変換(DCT)したものがMFCCとなります。 次の値は (l)番目のMFCCです。 ( ( l = 1 , cdots , M )))
[ c(l) = sum ^{M} _{m=1} X'(m) cos frac{l}{M} left( m – frac{1}{2} right) pi ]