Tipps zur Verbesserung der Tonhöhenerkennung


21

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.

Antworten:


20

Ich vermute, die anderen Frequenzen, die es bekommt, sind Harmonische der Grundwelle? Als würden Sie 100 Hz spielen und stattdessen 200 Hz oder 300 Hz auswählen? Zunächst sollten Sie Ihren Suchraum auf die Frequenzen beschränken, die eine Gitarre wahrscheinlich hat. Finden Sie das höchste Fundamental, das Sie wahrscheinlich brauchen, und beschränken Sie sich darauf.

Die Autokorrelation funktioniert beim Auffinden der Grundwelle besser als die FFT, wenn die Grundwelle eine geringere Amplitude als die Harmonischen hat (oder insgesamt fehlt, aber das ist bei der Gitarre kein Problem):

Bildbeschreibung hier eingeben

Sie können auch versuchen, die niedrigeren Frequenzen zu gewichten, um die Grundwelle zu betonen und die Harmonischen zu minimieren, oder Sie verwenden einen solchen Peak-Picking-Algorithmus und wählen dann einfach die niedrigste Frequenz.

Außerdem sollten Sie Ihr Signal vor dem Anwenden der FFT filtern. Sie multiplizieren es einfach mit einer Fensterfunktion , die den Anfang und das Ende der Wellenform verjüngt, um das Frequenzspektrum sauberer zu machen. Dann erhalten Sie hohe schmale Spitzen für Frequenzkomponenten anstelle von breiten.

Sie können auch die Interpolation verwenden, um eine genauere Spitze zu erhalten. Nehmen Sie das Protokoll des Spektrums, passen Sie dann eine Parabel an den Peak und die beiden benachbarten Punkte an und finden Sie den wahren Peak des Parabolas. Möglicherweise benötigen Sie jedoch nicht so viel Genauigkeit.

Hier ist mein Beispiel-Python-Code für all dies .


Das habe ich gesucht, sehr gute Antwort, danke!
Valentin Radu

2
Das Multiplizieren mit einer Fensterfunktion, die sich verjüngt, verschmiert tatsächlich alle Spektrallinien in Ihrem Signal und macht sie dadurch breiter. Was es Ihnen jedoch bietet, ist der Dynamikbereich, mit dem Sie beispielsweise eine Spektrallinie mit sehr geringer Leistung bei Vorhandensein eines Störtons mit hoher Leistung identifizieren können.
Jason R

@JasonR Da dies für eine Umgebung ausgelegt ist, in der die Wahrscheinlichkeit von Hochleistungsstörungstönen sehr gering ist, schlagen Sie vor, kein Hamming-Fenster zu verwenden.
Valentin Radu

1
Ich kann bestätigen, dass ich mit einem Hamming-Fenster meinem Ziel näher gekommen bin, die Messwerte konstant zu halten. Im Moment, wenn ich einen A4 spiele, bekomme ich die meiste Zeit 440 Hz und nur sehr selten bekomme ich einen genauen Messwert wie 650 Hz oder so. Ich vermute, das sind Harmonische? Ich konnte auch nicht anders, als zu bemerken, dass die App bei höheren Frequenzen fehlerfrei funktioniert und bei niedrigeren Frequenzen anfängt zu versagen. Wahrscheinlich, weil ich FTT verwende, um den Frequenzbereich der Spitzengröße zu ermitteln, und für niedrigere Frequenzen, die nicht immer die Grundfrequenz sind?
Valentin Radu

1
@mindnoise: 660 Hz ist keine Harmonische von 440 Hz, aber eine Harmonische von 220 Hz oder eine perfekte Quinte über 440. Könnte eine andere Saite mitschwingen oder verzerren oder so? Es ist viel einfacher, solche Probleme herauszufinden, wenn Sie die FFT zeichnen und betrachten können. Ja, die tiefen Frequenzen können entweder durch mechanische Effekte oder durch Ihre Analogschaltung gefiltert und im Vergleich zu den höheren Frequenzen reduziert werden.
Endolith

12

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


Ich habe gerade den Blog besucht (und kommentiert), auf den Sie uns gerade verwiesen haben.
Robert Bristow-Johnson

5

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.

Bildbeschreibung hier eingeben

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.

Bildbeschreibung hier eingeben


James, erkennt Ihr DFT-Pitch-Detektor Noten mit einer fehlenden (oder schwachen) Grundwelle?
Robert Bristow-Johnson

Ja, mein 2-Stufen-Tonhöhenerkennungsalgorithmus erkennt Noten, auch wenn das Signal eine "fehlende (oder schwache) Grundwelle" aufweist - das ist eine große Stärke dieses 2-Stufen-Prozesses. Das Fundamental wird in der zweiten Stufe bestimmt, wenn die Oktaverkennung für die Zeitbreiten durchgeführt wird, die Sie für Hinweise im logarithmischen DFT-Diagramm sehen. Da diese Tonhöhenerkennungsfunktion innerhalb der Verwirrung eines polyphonen mp3-Signals arbeitet, werden Noten erkannt, bei denen viele Harmonische fehlen, einschließlich der Fundamental-Funktion. Ich habe dieser Antwort gerade ein zweites Diagramm hinzugefügt, das meinen Algorithmus zur Oktaverkennung erläutert.
James Paul Millard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.