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.
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 N Abtastwerte). Die Werte entsprechen der Audiointensität - Amplituden.
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 .
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 x sind die kleineren Frames. Wie auch immer, sagen wir, wir machen etwas FFT und haben am Ende X [ k ] für den Rest .
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 ] ∗ 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 (?).
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.
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?
quelle
Antworten:
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.
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:
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.
quelle
39 mel
Schritt 4?