Ich arbeite an einer einfachen Web-App, mit der der Benutzer seine Gitarre stimmen kann. Ich bin ein echter Anfänger in der Signalverarbeitung, also beurteilen Sie nicht zu genau, ob meine Frage unangebracht ist.
Ich habe es also geschafft, die Grundfrequenz mit einem FFT-Algorithmus zu ermitteln, und zu diesem Zeitpunkt ist die Anwendung irgendwie funktionsfähig. Es gibt jedoch Raum für Verbesserungen. Im Moment sende ich Roh-PCM an den FFT-Algorithmus, aber ich dachte, dass es möglicherweise einige Pre / Post-Algorithmen / Filter gibt, die die Erkennung verbessern könnten. Kannst du welche vorschlagen?
Mein Hauptproblem ist, dass wenn es eine bestimmte Frequenz erkennt, diese Frequenz 1-2 Sekunden lang angezeigt wird und dann zu anderen zufälligen Frequenzen springt und wieder zurückkommt usw., auch wenn der Ton kontinuierlich ist.
Mich interessiert auch jede andere Art von Optimierung, wenn man Erfahrung mit solchen Dingen hat.
quelle
Die Tonhöhe ist nicht mit dem Frequenzbereich der Spitzengröße einer FFT identisch. Tonhöhe ist ein menschliches psychoakustisches Phänomen. Der Pitch-Sound könnte einen fehlenden oder sehr schwachen Grundton (häufig in einigen Voice-, Piano- und Gitarren-Sounds) und / oder viele kräftige Obertöne in seinem Spektrum haben, die die Pitch-Frequenz überwältigen (von einem Menschen aber immer noch als diese Pitch-Note gehört werden). . Daher ist jeder FFT-Spitzenfrequenzdetektor (einschließlich einiger Fenster und Interpolation) keine robuste Methode zur Tonhöhenschätzung.
Diese Stapelüberlauf-Frage enthält eine Liste einiger alternativer Methoden zum Schätzen der Tonhöhe, mit denen möglicherweise bessere Ergebnisse erzielt werden.
ADDED: Wenn Sie dies für Gitarrensounds tun, beachten Sie, dass die tiefsten Gitarrensaiten tatsächlich leicht unharmonische Obertöne erzeugen können, was die Tonhöhenschätzung noch schwieriger macht, da das menschliche Ohr eine Tonhöhenfrequenz hören kann, die in enger Beziehung zu einem Vielfachen der Obertöne steht und nicht auf die tatsächliche Grundschwingungsfrequenz der Saite.
ADDED # 2: Dies wird so oft gefragt, dass ich einen längeren Blogeintrag zum Thema geschrieben habe: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html
quelle
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.
quelle