MFCCの計算/理解を支援:メル周波数ケプストラム係数


17

私はオンラインで細かく読んでいますが、すべてをつなげることはできません。私はこれに関する十分な前提条件である信号/ DSPスタッフの背景知識を持っています。私は最終的にこのアルゴリズムをJavaでコーディングすることに興味がありますが、まだ完全には理解していません。だから私はここにいるのです(数学としてカウントされますよね?)。

これが私の知識のギャップと一緒にどのように機能するかを示しています。

  1. .wavファイルなどの音声スピーチサンプルから始めて、配列に読み込むことができます。この配列呼び出すNの範囲0 1 ... N - 1(したがって、N個のサンプル)。値は、私が推測するオーディオの強度-振幅に対応しています。バツ[n]n01N1N

  2. 音声信号を10ミリ秒程度の明確な「フレーム」に分割し、音声信号が「静止」していると想定します。これは量子化の形式です。したがって、サンプルレートが44.1KHzの場合、10msは441サンプル、つまり値に等しくなります。バツ[n]

  3. フーリエ変換(計算のためにFFT)を行います。これは、信号全体または各個別のフレームで実行されますか?一般にフーリエ変換は信号のすべての要素を見るので、違いがあると思うので、Fx [ n ] Fx 1 [ n ] Fと結合x 2 [ n ] Fと結合x N [ n ] ここでxバツ[n]Fバツ[n]Fバツ1[n]Fバツ2[n]FバツN[n]は小さいフレームです。とにかく、FFTを行って、残りの部分で X [ k ]になるとしましょう。バツ[n]バツ[k]

  4. Melスケールへのマッピングとロギング。通常の周波数の数値をメルスケールに変換する方法を知っています。それぞれについて、X [ K ]:(「x軸」あなたは私を許すだろう場合)、あなたはここで式を行うことができますhttp://en.wikipedia.org/wiki/Mel_scale。しかし、X [ k ]の「y値」または振幅はどうでしょうか。それらは同じ値のままですが、新しいメル(x-)軸上の適切なスポットにシフトしますか?私は、実際の値のロギングについての何かがあったいくつかの論文で見たXは、[ K ]その後、もしのでX [ K ] = A [ Kkバツ[k]バツ[k]バツ[k]これらの信号の1つが望ましくないノイズであると推定される場合、この方程式の対数演算は乗算ノイズを加算ノイズに変換します。バツ[k]=A[k]B[k]

  5. 最後のステップは、変更された DCTを上から取得することです(ただし、最終的に変更されます)。次に、この最終結果の振幅を取得します。これがMFCCです。高周波値を捨てることについて何かを読みました。バツ[k]

だから私は本当にこれらの人たちを段階的に計算する方法を実際に解決しようとしています、そして明らかにいくつかのものが上から私を避けています。

また、「フィルターバンク」(基本的にバンドパスフィルターの配列)の使用について聞いたことがありますが、これが元の信号からフレームを作成するのか、それともFFTの後にフレームを作成するのかわかりませんか?

最後に、MFCCに13個の係数があることについて見たことがありますか?


1
これは素晴らしい質問ですが、答えがたくさんあります。これを2〜3の異なる質問に分割することをお勧めします(継続性を維持したい場合は、別の質問を参照できます)。
ジョンスカ

以前にmath.SEで同じ質問をしたことがある(そしてdsp.SEがより良いホームであるとアドバイスされた)ので、おそらくmath.SEの質問を削除する必要があります。
ディリップサルウェート

math.SE
YoungMoneyの

非常に素晴らしく、有益なチュートリアルthanksssssssssssssss

1
ちょっとあなたの質問で、「Melスケールへのマッピングとロギング。通常の周波数数をMelスケールに変換する方法を知っています。」と言いました。この部分の計算を手伝ってもらえますか。x [k] = 1 * 184のFFt出力がありますが、三角バンドパスフィルターのセットは20 * 3です。その後、どうすれば両方を乗算できますか。まもなくしてください
アユシュアグラワル

回答:


25

ステップバイステップ...

1.&2。正解です。フレームは通常オーバーラップしていることに注意してください。たとえば、フレーム0はサンプル0〜440です。フレーム1はサンプル220〜660です。フレーム2はサンプル440〜880などです。また、ウィンドウ関数がフレーム内のサンプルに適用されることにも注意してください。

。フーリエ変換はフレームごとに行われます。この背後にある動機は単純です。音声信号は時間とともに変化しますが、短いセグメントでは静止しています。各短いセグメントを個別に分析する必要があります-このセグメントでは、信号は少数の係数で効率的に記述できるほど単純であるためです。「こんにちは」と言っている人を考えてください。すべての音を一度に分析することで、すべての音素が1つのスペクトルに折りたたまれる(FFTが時間情報を折りたたむ)のは望ましくありません。ステージごとに単語を認識するために「hhhhheeeeeeeeeeelloooooooooo」を見たいので、短いセグメントに分解する必要があります。

NN=40

これらの周波数が定義されると、これらの各周波数の周りのFFTの大きさ(またはエネルギー)の加重和を計算します。

12個のビンを持つフィルターバンクを表す次の図を見てください。

12チャネルのメル周波数フィルターバンク

8番目のビンの中心周波数は約2kHzです。8番目のビンのエネルギーは、1600〜2800 Hzの加重FFTエネルギーを合計することで得られます。重みは2kHz付近にピークがあります。

実装ノート:この重み付き和の束は、単一の操作で実行できます-"フィルターバンク行列"とFFTエネルギーベクトルの行列乗算。

この段階で、FFTスペクトルを40個のエネルギー値のセット(図では12個)に「要約」し、それぞれが異なる周波数範囲に対応しています。これらの値のログを取得します。

KK=13


Melフィルターバンクに関する簡単な質問-高さ/振幅の範囲は1.8-2です。これは重要ですか、それとも単位(1)の高さですか?
YoungMoney

1
これは重要ではありません。最大値を使用した場合の効果。1.0対2.0の振幅は、ステップ4で対数エネルギーを定数だけシフトするだけであるため、ステップ5で最初の係数のみに影響します(多くの場合、破棄されます)。一部の実装では、エネルギーの正規化を使用しているため、フィルターが広いほど、そのピーク振幅は低くなります(i.imgur.com/IOaLa.gif)。これにより、認識アプリケーションのパフォーマンスがわずかに変更される場合があります。-あなたが使用中のMFCCの実装を見てみると、実際には多くの小さな各ステップのバリエーションがあるbit.ly/ULatdL
pichenettesは

ここでは古いトピックですが、グラフについて質問する必要があるものがあります。ナイキストが4kHzの場合、帯域制限フィルターがポイント4kHzを超えるのはなぜですか。MFCCで大丈夫ですか。通常、フィルターがナイキストを通過させたくないのですか?私は正しいですか?
セルドール

2
N = 40のメルフィルターバンク周波数(または26、私が見たもう1つの一般的な値)が使用される理由についての参照はありますか?
ジェームズOwers

1
どこん39 melステップ4であるから来ますか?
ゲルトコマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.