Hilfe beim Berechnen / Verstehen der MFCCs: Mel-Frequenz-Cepstrum-Koeffizienten

17

Ich habe online gelesen, aber ich kann einfach nicht alles zusammenfügen. Ich habe einige Hintergrundkenntnisse über Signale / DSP-Inhalte, die dafür ausreichen sollten. Ich bin daran interessiert, diesen Algorithmus irgendwann in Java zu codieren, aber ich verstehe ihn noch nicht vollständig. Deshalb bin ich hier (es zählt als Mathematik, oder?).

Hier ist, wie ich denke, es funktioniert zusammen mit den Lücken in meinem Wissen.

  1. Beginnen Sie mit Ihrem Audio-Sprachbeispiel, beispielsweise einer WAV-Datei, die Sie in ein Array einlesen können. Nenne dieses Array , wobei n von 0 , 1 , , N - 1 reicht (also Nx[n]n0,1,,N1N Abtastwerte). Die Werte entsprechen der Audiointensität - Amplituden.

  2. Teilen Sie das Audiosignal in verschiedene "Frames" von etwa 10 ms auf, wobei Sie davon ausgehen, dass das Sprachsignal "stationär" ist. Dies ist eine Form der Quantisierung. Wenn Ihre Abtastrate also 44,1 kHz beträgt, entsprechen 10 ms 441 Abtastwerten oder Werten von .x[n]

  3. Führe eine Fourier-Transformation durch (FFT zur Berechnung). Wird dies nun für das gesamte Signal oder für jeden einzelnen Frame von ? Ich denke, es gibt einen Unterschied, weil die Fourier-Transformation im Allgemeinen alle Elemente eines Signals betrachtet, also F ( x [ n ] ) F ( x 1 [ n ] ) verbunden mit F ( x 2 [ n ] ) verbunden mit F ( x N [ n ] ) wobei xx[n]F(x[n])F(x1[n])F(x2[n])F(xN[n]) sind die kleineren Frames. Wie auch immer, sagen wir, wir machen etwas FFT und haben am Ende X [ k ]xi[n]X[k] für den Rest .

  4. Zuordnung zur Mel-Skala und Protokollierung. Ich weiß, wie man reguläre Frequenzzahlen auf die Mel-Skala umrechnet. Für jedes von X [ k ] (die "x-Achse", wenn Sie es zulassen) können Sie die Formel hier ausführen : http://en.wikipedia.org/wiki/Mel_scale . Aber wie steht es mit den "y-Werten" oder den Amplituden von X [ k ] ? Bleiben sie nur die gleichen Werte, werden aber an die entsprechenden Stellen auf der neuen Mel (x-) Achse verschoben? Ich habe in einem Papier gesehen, dass es etwas über das Aufzeichnen der tatsächlichen Werte von X [ k ] gibt, denn dann ist X [ k ] = A ] kX[k]X[k]X[k] Wenn angenommen wird, dass eines dieser Signale unerwünschtes Rauschen ist, wandelt die logarithmische Operation dieser Gleichung das multiplikative Rauschen in additives Rauschen um, das hoffentlich gefiltert werden kann (?).X[k]=A[k]B[k]

  5. Nun ist der letzte Schritt, ein DCT von Ihrem modifizierten von oben zu nehmen (es wurde jedoch modifiziert). Dann nehmen Sie die Amplituden dieses Endergebnisses und das sind Ihre MFCCs. Ich habe etwas über das Wegwerfen von Hochfrequenzwerten gelesen.X[k]

Also versuche ich wirklich, Schritt für Schritt herauszufinden, wie man diese Typen berechnet, und offensichtlich entziehen sich mir einige Dinge von oben.

Außerdem habe ich von der Verwendung von "Filterbänken" gehört (im Grunde genommen ein Array von Bandpassfiltern) und weiß nicht, ob es sich dabei um das Erstellen von Frames aus dem Originalsignal handelt, oder ob Sie die Frames nach der FFT erstellen?

Zuletzt habe ich etwas an MFCCs mit 13 Koeffizienten gesehen?

Junges Geld
quelle
1
Dies ist eine großartige Frage, aber es gibt hier eine Menge zu beantworten. Ich würde empfehlen, dies in 2-3 verschiedene Fragen aufzuteilen (Sie können sich aufeinander beziehen, wenn Sie die Kontinuität wahren möchten), damit es leichter beantwortet werden kann.
Jonsca
Da Sie zuvor dieselbe Frage zu math.SE gestellt haben (und darauf hingewiesen wurden, dass dsp.SE ein besseres Zuhause dafür ist), sollten Sie die Frage zu math.SE möglicherweise löschen.
Dilip Sarwate
Ich habe die Version auf math.SE
YoungMoney am
Sehr schönes und infotmatives Tutorial thankssssssssssssss
1
Hey, du hast in deiner Frage gesagt, dass "Zuordnen zur Mel-Skala und Protokollieren. Ich weiß, wie man reguläre Frequenzzahlen zur Mel-Skala konvertiert." können Sie mir helfen, diesen Teil zu berechnen. Da ich meinen FFt-Ausgang von x [k] = 1 * 184 habe, aber mein dreieckiges Bandpassfilter von Satz 20 * 3 ist. Wie kann ich dann beide multiplizieren? Please ASAp
Ayush Agrawal

Antworten:

25

Schritt für Schritt...

1. & 2 . Das ist richtig. Beachten Sie, dass sich die Frames normalerweise überlappen. Beispiel: Frame 0 entspricht den Samples 0 bis 440. Frame 1 sind die Abtastwerte 220 bis 660; Frame 2 enthält die Samples 440 bis 880 usw. Beachten Sie auch, dass eine Fensterfunktion auf die Samples im Frame angewendet wird.

3 . Die Fourier-Transformation wird für jeden Frame durchgeführt. Die Motivation dahinter ist einfach: Ein Sprachsignal ändert sich mit der Zeit, ist jedoch über kurze Segmente stationär. Sie möchten jedes kurze Segment einzeln analysieren - denn auf diesen Segmenten ist das Signal so einfach, dass es durch wenige Koeffizienten effizient beschrieben werden kann. Denken Sie an jemanden, der "Hallo" sagt. Sie möchten nicht, dass alle Phoneme in einem einzigen Spektrum zusammengefasst werden (FFT kollabiert zeitliche Informationen), indem Sie den gesamten Klang auf einmal analysieren. Sie möchten "hhhhheeeeeeeeeeelloooooooo" sehen, um das Wort stufenweise zu erkennen, daher muss es in kurze Segmente unterteilt werden.

NN=40

Sobald diese Frequenzen definiert wurden, berechnen wir eine gewichtete Summe der FFT-Größen (oder Energien) um jede dieser Frequenzen.

Schauen Sie sich das folgende Bild an, das eine Filterbank mit 12 Fächern darstellt:

Mel Frequenzfilterbank mit 12 Kanälen

Das 8. Bin hat eine Mittenfrequenz von ungefähr 2 kHz. Die Energie im achten Bin wird durch Summieren der gewichteten FFT-Energien im Bereich von 1600 bis 2800 Hz erhalten, wobei das Gewicht einen Spitzenwert bei etwa 2 kHz aufweist.

Implementierungshinweis: Dieses Bündel gewichteter Summen kann in einer einzigen Operation durchgeführt werden - einer Matrixmultiplikation einer "Filterbankmatrix" mit dem FFT-Energievektor.

Zu diesem Zeitpunkt haben wir das FFT-Spektrum in einen Satz von 40 (in der Abbildung 12) Energiewerten "zusammengefasst", die jeweils einem anderen Frequenzbereich entsprechen. Wir zeichnen diese Werte auf.

5 . Der nächste Schritt besteht darin, die DCT dieser Folge von 40 logarithmischen Energien zu nehmen. Dies ergibt 40 Werte. Der ErsteK Koeffizienten sind die MFCC (Normalerweise K=13). Tatsächlich ist der allererste DCT-Koeffizient die Summe aller im vorherigen Schritt berechneten logarithmischen Energien. Er ist also ein Gesamtmaß für die Signallautstärke und gibt keinen Aufschluss über den tatsächlichen spektralen Inhalt des Signals. Oft wird er verworfen Für Spracherkennungs- oder Sprecher-ID-Anwendungen, bei denen das System gegenüber Lautstärkeschwankungen robust sein muss.

Pichenetten
quelle
Nur eine kurze Frage zur Mel-Filterbank - die Höhe / Amplitude liegt zwischen 1,8 und 2, ist dies wichtig oder kann es sich um eine Einheit (1) handeln?
YoungMoney
1
Das ist nicht wichtig. Die Wirkung einer max. Die Amplitude bei 1,0 vs 2,0 verschiebt die logarithmische Energie in Schritt 4 nur um eine Konstante und wirkt sich daher in Schritt 5 nur auf den ersten Koeffizienten aus (der oft ohnehin verworfen wird). Beachten Sie, dass bei einigen Implementierungen die Energienormalisierung verwendet wird. Je breiter der Filter ist, desto niedriger ist seine Spitzenamplitude ( i.imgur.com/IOaLa.gif ). Dies kann zu geringfügigen Leistungsänderungen bei Erkennungsanwendungen führen. Wenn Sie sich die verwendeten MFCC-Implementierungen ansehen, gibt es tatsächlich viele kleine Variationen bei jedem Schritt - bit.ly/ULatdL
pichenettes
Es ist ein altes Thema hier, aber ich muss etwas über das Diagramm fragen. Wenn der Nyquist 4 kHz beträgt, warum überschreiten diese bandbegrenzten Filter den Punkt 4 kHz? Ist es OK für MFCC? Normalerweise soll der Filter den Nyquist nicht passieren? Habe ich recht?
Celdor
2
Haben Sie einen Hinweis darauf, warum N = 40 mel Filterbankfrequenzen (oder 26, ein anderer allgemeiner Wert, den ich gesehen habe) verwendet werden?
James Owers
1
Woher kommt der 39 melSchritt 4?
Gert Kommer