9

JavaでMFCCアルゴリズムを実装しています。

ここにサンプル コードがあります: Matlab のhttp://www.ee.columbia.edu/~dpwe/muscontent/practical/mfcc.m 。ただし、メル フィルター バンキング プロセスにはいくつか問題があります。三角形のウィンドウを生成する方法とその使用方法は?

PS1: MFCC について説明している部分がある記事: http://arxiv.org/pdf/1003.4083

PS2:基本的に MFCC アルゴリズムの手順に関するドキュメントがあれば、それでよいでしょう。

PS3: 私の主な質問はそれに関連しています: Java Linear and Logarithmic Filters を使用した MFCC一部の実装では、線形フィルターと対数フィルターの両方を使用し、一部の実装では使用しません。そのフィルターとは何か、中心的な頻繁な概念とは何か。私はそのコードに従います: MFCC Java、そのコードの違いは何ですか: MFCC Matlab

4

2 に答える 2

4

周波数帯域フィルターとしての三角窓の実装は難しくありません。i-1基本的に、各バンド内の FFT データを統合する必要があります (中心周波数と中心周波数の間の周波数空間として定義されますi+1)。

あなたは基本的に次のようなものを探しています、

for(int bandIdx = 0; bandIdx < numBands; bandIdx++) {
    int startFreqIdx  = centerFreqs[bandIdx-1];
    int centerFreqIdx = centerFreqs[bandIdx];
    int stopFreqIdx   = centerFreqs[bandIdx+1];

    for(int freq = startFreqIdx; i < centerFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-startFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-startFreqIdx)/magnitudeScale;
    }

    for(int freq = centerFreqIdx; i <= stopFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-stopFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-stopFreqIdx)/magnitudeScale;
    }
}

「中心周波数」または「帯域」または「フィルタ」の概念を理解していない場合は、基本信号の教科書を手に取ってください。このアルゴリズムが何をするかを理解せずにこのアルゴリズムを実装するべきではありません。

正確な中心周波数については、あなた次第です。データから分離したい情報を取得する値を実験して選択します (または出版物で見つけます)。決定的な値や値のスケールさえない理由は、このアルゴリズムが非常に複雑なリスニング デバイスである人間の耳に近づけようとするためです。ある音階は、たとえばスピーチに適しているかもしれませんが、別の音階は音楽などに適しているかもしれません。適切なものを選択するのはあなた次第です。

于 2011-06-03T23:27:32.850 に答える