Ich arbeite an einem Klavierstimmprogramm und ein Teil davon erfordert eine Echtzeit-Tonhöhenerkennung. Hier ist das Schema, das ich bisher habe und das bis zu einem gewissen Grad funktioniert, aber wahrscheinlich etwas verfeinert werden könnte.
Ich nehme Mono, 44,1 kHz, 16-Bit-PCM-Audio in Blöcken von 2 ^ 14 Samples auf. Ich kombiniere die letzten 4 Samples zu einem Puffer mit einer Länge von 2 ^ 16, wende ein Hann-Fenster auf den Puffer an und führe eine FFT darauf aus. Dann habe ich die Ergebnisse der FFT in zwei Auflösungen zusammengefasst. Zuerst werde ich in 200 Buckets aufgeteilt und dann den HPS-Pitch-Erkennungsalgorithmus mit dieser Granularität ausführen. Ich brauche hier keine genaue Frequenz, ich möchte nur näher kommen. Dann schaufele ich in 12000 Eimer, was mir eine Auflösung von 1 Cent von 10 Hz bis 10 kHz gibt. Sobald ich eine ungefähre Frequenz aus dem 200-Bin-HPS-Algorithmus kenne, suche ich in diesem Bereich des 12000-Bin-Falls nach einem Peak, um eine genauere Frequenz zu erhalten.
Dies scheint für die Noten in der Mitte der Tastatur in Ordnung zu sein. Was mit den tiefen Noten passiert, ist etwa 1,5 Sekunden Fehlidentifikation der Note als normalerweise der 2. oder 3. Teil der realen Note und dann eine korrekte Identifizierung der Note.
In allen Spektraldiagrammen, die ich erstellt habe, um zu sehen, was los ist, sind die Peaks breiter als erwartet. Diese Breite ist optisch etwas konsistent von 200 bis 12000 Behälter. Ich hätte erwartet, dass die Spitzen im Fall von 200 Behältern schmaler sind.
Die Signalverarbeitung ist für mich also neu, daher kann es Probleme geben, über die ich nicht nachdenken würde, aber in Bezug auf bestimmte Fragen sind die Stichprobengrößen für diese Aufgabe ausreichend? Ist Hann die richtige Wahl für ein Fenster? Sollte ich die Daten auch vor der FFT glätten? Wie empfindlich ist HPS gegenüber der Anzahl der Behälter? Ich dachte, wenn ich viele Bins verwenden würde, würde die Inharmonizität möglicherweise nicht dazu führen, dass Partials ihre Grundlagen mit dem einfachen Ansatz des HPS-Algorithmus, durch 2, 3, 4 usw. zu teilen, überlappen.