Echtzeit-Tonhöhenerkennung


11

Ich versuche, ein Gesangsspiel zu implementieren, das den rohen Mikrofoneingang analysiert und dem Spieler sagt, wie gut er singt. Das muss in Echtzeit erfolgen.

Ich bin auf viele Threads gestoßen, die die gleiche Frage gestellt haben, aber ich bin immer noch nicht damit fertig, wahrscheinlich aufgrund meiner mangelnden Erfahrung auf dem Gebiet und des geringen mathematischen Hintergrunds. Ich habe einen Algorithmus implementiert, der auf dem Artikel der DSPDimension-Website Pitch Shift basiert: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

Ich extrahiere die wahre Frequenz und Größe, wie im Artikel erklärt, aber ich weiß nicht, ob ich damit die Grundfrequenz finde. Ich habe versucht, den Bin mit der größten Größe zu erhalten, aber das liefert mir nur die richtigen Ergebnisse für Signale mit höherer Tonhöhe. Es spielt keine Rolle, welchen Überabtastungsfaktor ich verwende. Ich erhalte immer noch schlechte Daten für Signale mit niedriger Frequenz. Ist dieser Ansatz völlig falsch oder bin ich auf dem richtigen Weg, vermisse aber nur etwas?

Danke im Voraus,

EDIT: Ich habe vergessen zu erwähnen, dass ich nur an der Tonhöhenklasse interessiert bin, daher ist es in Ordnung, wenn das Fundament fehlt, aber ich habe einen starken Oberton im Sample.

EDIT2: Vielen Dank an alle, ich habe gerade eine Version des Algorithmus fertiggestellt, die wie ein Zauber funktioniert. Das Problem der Schätzung der niedrigen Tonhöhe war auf meinen Eingangstest zurückzuführen. Als ich die Note gesungen habe, stimmte sie richtig überein. Außerdem betrachte ich jetzt alle Harmonischen, nicht nur den höchsten Peak.


Wikipedia hat einige Informationen.
Emre

Antworten:


9

Ich habe versucht, den Bin mit der größten Größe zu erhalten, aber das liefert mir nur die richtigen Ergebnisse für Signale mit höherer Tonhöhe. Es spielt keine Rolle, welchen Überabtastungsfaktor ich verwende. Ich erhalte immer noch schlechte Daten für Signale mit niedriger Frequenz.

Das ist , weil die Harmonischen sind größer als die von grundlegender Bedeutung. Zeichnen Sie Ihr Spektrum und Sie werden sehen. Eine bessere Methode, um das wahre Fundament zu finden, ist die Autokorrelation. Dann "schieben" Sie die Wellenform an sich vorbei und finden Verzögerungen, bei denen die Wellenform mit sich selbst übereinstimmt.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Möchten Sie wirklich, dass sie die genaue Note singen, oder ist es in Ordnung, wenn sie je nach Sprachregister eine Oktave darüber oder darunter singen?


Du hast recht, ich habe vergessen zu erwähnen, dass ich nur an der Pitchklasse interessiert bin. Ich benutze diese Website, um mein Tool zu testen: 7thstring.com/tuningfork/tuningfork.html . Für den Eingang von A (220 Hz) wird E (660 Hz) als gefundene Tonhöhenklasse zurückgegeben. Ich habe mir das Sprektum angesehen und 220Hz ist zwar da, aber mit einer geringeren Größe als 660Hz. Nach dem Herausfiltern von Werten unter einer Mindestgröße und Grenzfrequenzen in meinem gewünschten Bereich hat das Sprektum, das ich daraus erhalte, 4 Peaks. [Peak, Mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira

Ich habe gerade darüber nachgedacht, dass ich vielleicht den Phasenversatz bei der Berechnung der Größe berücksichtigen sollte, genau wie ich es tue, um die wahre Frequenz zu erhalten. Ist das sinnvoll? Was ich meine ist, dass, wenn ich einen Phasenversatz von ungefähr 90º für einen Behälter habe, der "Peak" bei 0 Magnitude liegen würde, nicht wahr?
Felipe Lira

@elipedrl: Du schreibst also im Wesentlichen einen Gitarrentuner. :) Soweit ich weiß, filtern sie tief, um die Wellenform zu bereinigen, und zählen dann Spitzen, um die Tonhöhe zu erhalten. electronicdesign.com/article/articles/… aboutmicrocontroller.blogspot.com/2008/04/… Es gibt jedoch bessere Möglichkeiten, wenn Sie eher auf Genauigkeit als auf Billigkeit setzen. gist.github.com/255291
endolith

@elipedrl: Der Phasenversatz für einen Bin sollte für die Tonhöhe irrelevant sein. Jeder Behälter ist eine komplexe Zahl, und Sie interessieren sich für den absoluten Wert oder die Größe dieser Zahl. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
Endolith

1
und wenn Sie aus irgendeinem Grund 2 kürzere FFTs haben (Latenz, Zeitquanten usw.), ist eine Phasenvocoderberechnung weniger rechnerisch als eine weitere längere FFT und interpoliert diese.
hotpaw2

6

Ja, die Verwendung eines Spitzenfrequenzschätzers für die Tonhöhe ist falsch. Die Tonhöhe ist ein psychoakustisches Phänomen, daher unterscheidet sich die Tonhöhenerkennung oder -schätzung von der Frequenzschätzung. In früheren Antworten auf ähnliche Fragen wurden hier zahlreiche Methoden zur Tonhöhenschätzung angegeben. Es gibt mehr als 1 zur Auswahl.

Hier ist eine: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 und eine andere: Tipps zur Verbesserung der Tonhöhenerkennung

HINZUGEFÜGT # 1: Ähnliche Fragen werden so oft gestellt, dass ich einen längeren Blog-Beitrag zum Thema verfasst habe: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frequenz.html


Ich habe die Frage mit der Information aktualisiert, dass ich nur an der Pitch-Klasse interessiert bin. Ich hoffe wirklich, dass FFT mit einer Nachbearbeitung dafür ausreicht, ich bin weit hinter meinem Zeitplan zurück und eine Änderung des Ansatzes wäre für mich schrecklich.
Felipe Lira

@elipedrl: FFT sollte dann funktionieren. Es sollte gut genug sein, mehrere Peaks zu erhalten und dann einen davon intelligent auszuwählen. Denken Sie daran, dass die gültigen Peaks nahe (aber nicht genau) an ganzzahligen Vielfachen der Grundwelle liegen, während dies bei falschen Peaks nicht der Fall ist. Sie müssen die Auswahl von Störspitzen und die Auswahl der 3. Harmonischen usw. vermeiden, die keine Oktave von der gesuchten Note entfernt sind.
Endolith

Es ist möglich, obwohl vielleicht unwahrscheinlich, dass keine Frequenzspitze bei der musikalischen Tonhöhenfrequenz liegt. Einige männliche Vokale können nahe daran liegen, nur hohe Obertöne bleiben nach dem Filtern durch den Vokalformanten übrig.
hotpaw2

Das Harmonic Product Spectrum-Verfahren kann geeignet sein, eine LCD-Schätzung des kleinsten gemeinsamen Nenners einer Gruppe von Spektralspitzen durch Nachbearbeitung der anfänglichen FFT-Ergebnisse zu finden.
hotpaw2
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.