Ich habe viele Jahre damit verbracht, die Tonhöhenerkennung für polyphone Musik zu erforschen - wie das Erkennen der Töne eines Gitarrensolos innerhalb einer MP3-Aufnahme. Ich habe auch einen Abschnitt auf Wikipedia geschrieben, der eine kurze Beschreibung des Prozesses enthält (siehe den Unterabschnitt "Tonhöhenerkennung" im Link unten).
Wenn eine einzelne Taste auf einem Klavier gedrückt wird, hören wir nicht nur eine Frequenz von Schallschwingungen, sondern eine Mischung aus mehreren Schallschwingungen, die bei verschiedenen mathematisch verwandten Frequenzen auftreten. Die Elemente dieser Zusammensetzung von Schwingungen mit unterschiedlichen Frequenzen werden als Harmonische oder Teilschwingungen bezeichnet. Wenn wir zum Beispiel die mittlere C-Taste auf dem Klavier drücken, beginnen die einzelnen Frequenzen der Oberschwingungen des Composites bei 261,6 Hz, da die Grundfrequenz 523 Hz die 2. Harmonische ist, 785 Hz die 3. Harmonische ist und 1046 Hz 4. Harmonische usw. sein. Die späteren Harmonischen sind ganzzahlige Vielfache der Grundfrequenz 261,6 Hz (Beispiel: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).
Ich verwende eine modifizierte logarithmische DFT-Transformation, um zuerst die möglichen Harmonischen zu erkennen, indem ich nach Frequenzen mit Spitzenpegeln suche (siehe Abbildung unten). Aufgrund der Art und Weise, wie ich Daten für meine modifizierte Log-DFT sammle, muss ich KEINE Fensterfunktion auf das Signal anwenden, noch hinzufügen und überlappen . Und ich habe die DFT so erstellt, dass ihre Frequenzkanäle logarithmisch angeordnet sind, um sie direkt an den Frequenzen auszurichten, bei denen durch die Noten auf einer Gitarre, einem Saxophon usw. Harmonische erzeugt werden.
Jetzt, da ich pensioniert bin, habe ich beschlossen, den Quellcode für meine Pitch Detection Engine in einer kostenlosen Demo-App namens PitchScope Player freizugeben . Der PitchScope Player ist im Internet verfügbar, und Sie können die ausführbare Datei für Windows herunterladen, um zu sehen, wie mein Algorithmus an einer MP3-Datei Ihrer Wahl arbeitet. Der folgende Link zu GitHub.com führt Sie zu meinem vollständigen Quellcode, in dem Sie sehen können, wie ich die Harmonischen mit einer benutzerdefinierten logarithmischen DFT-Transformation erkenne, und dann nach Partialen (Harmonischen) suchen, deren Frequenzen die richtige ganzzahlige Beziehung erfüllen, die a 'definiert. Tonhöhe'.
Mein Tonhöhenerkennungsalgorithmus ist eigentlich ein zweistufiger Prozess: a) Zuerst wird die Tonhöhe erkannt ('Tonhöhe' hat 12 mögliche Tonhöhenwerte: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) und nachdem ScalePitch bestimmt wurde, wird die Oktave berechnet, indem alle Harmonischen für die 4 möglichen Oktav-Kandidaten-Noten untersucht werden. Der Algorithmus ist so konzipiert, dass zu jedem Zeitpunkt innerhalb einer polyphonen MP3-Datei die dominanteste Tonhöhe (eine Musiknote) erkannt wird. Das entspricht normalerweise den Noten eines Instrumentalsolos. Diejenigen, die sich für den C ++ - Quellcode für meinen 2 Stage Pitch Detection-Algorithmus interessieren, möchten möglicherweise mit der Estimation_ScalePitch () - Funktion in der SPitchCalc.cpp-Datei auf GitHub.com beginnen.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
Unten ist das Bild einer logarithmischen DFT (erstellt von meiner C ++ - Software) für 3 Sekunden eines Gitarrensolos auf einer polyphonen MP3-Aufnahme. Es zeigt, wie die Harmonischen für einzelne Noten auf einer Gitarre erscheinen, während ein Solo gespielt wird. Für jede Note in dieser logarithmischen DFT können wir sehen, dass sich die mehreren Harmonischen vertikal erstrecken, da jede Harmonische dieselbe Zeitbreite hat. Nachdem die Oktave der Note bestimmt ist, kennen wir die Frequenz des Fundamental.
Das folgende Diagramm zeigt den Algorithmus zur Oktaverkennung, den ich entwickelt habe, um die richtige Oktavkandidatennote (dh das richtige Fundamental) auszuwählen, nachdem die Tonhöhe für diese Note bestimmt wurde. Diejenigen, die diese Methode in C ++ sehen möchten, sollten die Calc_Best_Octave_Candidate () -Funktion in der Datei FundCandidCalcer.cpp aufrufen, die in meinem Quellcode bei GitHub enthalten ist.