Echtzeit-Tonhöhenerkennung
Ich versuche zu tun, Echtzeit-Erkennung von einem Benutzer zu singen, aber ich bin in eine Menge Probleme. Ich habe versucht, viele Methoden, einschließlich FFT (FFT-Problem (Gibt zufällige Ergebnisse)) und Autokorrelation (Autokorrelation Erkennung der Tonhöhe gibt zufällige Ergebnisse mit mic-Eingang), aber ich kann nicht scheinen, um alle Methoden zu geben, ein gutes Ergebnis. Kann jemand empfehlen, eine Methode für die Echtzeit-pitch-tracking oder wie Sie verbessern auf eine Methode, die ich bereits habe? Ich kann nicht scheinen zu finden, eine gute C /C++ - Methoden für die Echtzeit-Erkennung der Tonhöhe.
Dank,
Niall.
Edit: Nur zum Hinweis, habe ich überprüft, dass der mic-input-Daten korrekt sind, und dass bei Verwendung einer Sinuswelle, die Ergebnisse sind mehr oder weniger die richtige Tonhöhe.
Edit: Sorry, so spät, aber in dem moment, im dem visualisieren der autocolleration, indem die Werte aus den Ergebnissen array, und jede index -, und Plotten Sie den index auf der X-Achse und dem Wert auf der Y-Achse (beide sind geteilt durch 100000 oder so und im mit OpenGL), stecken die Daten in einem VST-host und verwenden von VST-plugins ist keine option für mich. Im moment, es sieht aus wie einige zufällige Punkte. Mache ich es richtig, oder können Sie bitte zeigen Sie mir, zu einigen code, es zu tun oder mir helfen zu verstehen, wie die Visualisierung der rohen audio-Daten, und die Autokorrelation in den Daten.
InformationsquelleAutor der Frage Niall | 2009-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Schritt zurück... Um diese arbeiten, die Sie MUSS herauszufinden, einen Weg, um plot Zwischenschritte dieses Prozesses. Was Sie zu tun versuchen, ist nicht besonders schwer, aber es ist fehleranfällig und fummelig. Clipping, windowing, schlechte Verkabelung, aliasing, DC-offsets, Lesen die falschen Kanäle, die seltsame FFT-Frequenz-Achse, Impedanz-Fehlanpassungen, die frame-Größe-Fehler... wer weiß. Aber wenn Sie können, zeichnen Sie die raw-Daten, und dann zeichnen die FFT, wird alles klar.
InformationsquelleAutor der Antwort tom10
Fand ich mehrere open-source-Implementierungen von real-time-pitch-tracking -
dywapitchtrack verwendet ein wavelet-basierter Algorithmus
Echtzeit-C# - Pitch-Tracker nutzt eine modifizierte Autokorrelation Ansatz
aubio (erwähnt von piem; mehrere algorithmen stehen zur Verfügung)
Gibt es auch einige pitch-Tracker gibt, die möglicherweise nicht ausgelegt für Echtzeit -, aber nutzbar sein könnte, dass der Weg für alles, was ich weiß, und könnte auch nützlich sein, als Referenz für den Vergleich der real-time tracker:
Praat ist ein open-source-Paket, das manchmal zur pitch-Extraktion von Linguisten und finden Sie den Algorithmus dokumentiert http://www.fon.hum.uva.nl/paul/praat.html
Snack-und WaveSurfer enthalten auch eine Tonhöhen-Extraktor
InformationsquelleAutor der Antwort David Gelbart
Ich weiß, diese Antwort wird nicht alle glücklich machen, aber hier geht.
Dieses Zeug ist hart, sehr hart. Erstens gehen Sie Lesen Sie so viele tutorials finden Sie auf FFT, Autokorrelation, Wavelets. Obwohl ich bin immer noch am kämpfen mit DSP habe ich bekommen, einige Erkenntnisse aus dem folgenden.
https://www.coursera.org/course/audio der natürlich nicht ausgeführt wird, im moment aber die videos sind immer noch verfügbar.
http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf Diplomarbeit über die Entwicklung eines pitch-Erkennungs-Algorithmus.
http://dsp.stackexchange.com eine ganze Website gewidmet, um digitale signal Verarbeitung.
Wenn, wie mir, du hast nicht genug Mathematik, um vollständig zu Folgen, die Tutorien geben Sie nicht auf, wie einige der Diagramme und Beispiele noch mir geholfen, zu verstehen, was Los war.
Nächsten test-Daten und Test. Schreiben Sie selbst eine Bibliothek, die generiert test-Dateien zu verwenden, bei der Prüfung Ihres Algorithmus/s.
1) Eine super einfache Sinus-generator. So sagen Sie sind auf der Suche schreiben YAT(Noch ein Weiterer Tuner), dann verwenden Sie Ihre Sinus-generator, um eine Reihe von Dateien, um 440Hz sagen aus 420-460Hz, in unterschiedlichen Schritten und sehen, wie empfindliche und genaue code ist. Kann es lösen sich innerhalb von 5 Hz, 1Hz, feiner noch?
2) aktualisieren Sie Ihren Sinus-generator, so dass es fügt eine Reihe von schwächeren Obertöne zum signal.
3) als Nächstes werden Reale Welt Variationen über Obertöne. Während also für die meisten Saiteninstrumente Sie sehen eine Reihe von Oberschwingungen als einfache Vielfache der Grundfrequenz F0, die für Instrumente wie Klarinetten und Flöten, weil der Weg der Luft verhält sich in der Kammer der geradzahlige harmonische fehlen oder sehr schwach. Und für manche Instrumente F0 fehlt, aber kann bestimmt werden aus der Verteilung der anderen harmonischen. F0 sein, was das menschliche Ohr wahrnimmt, wie die Tonhöhe.
4) Werfen einige bewusste Verzerrung durch die Verschiebung des harmonischen peak-Frequenzen nach oben und unten in einer unregelmäßigen Weise
Der Punkt ist, dass, wenn Sie Dateien mit bekannten Ergebnisse dann einfacher zu überprüfen, dass das, was Sie bauen tatsächlich funktioniert, bugs abgesehen natürlich.
Gibt es auch eine Reihe von "Bibliotheken" gibt, mit sound-samples.
https://freesound.org aus dem Coursera-Serie erwähnt.
http://theremin.music.uiowa.edu/MIS.html
Weiter sich bewusst sein, dass Sie Ihr Mikrofon nicht perfekt, und es sei denn, Sie haben Tausende von dollars ausgegeben, die auf es wird eine ziemlich variable Frequenz-Antwort-Bereich. Insbesondere, wenn Sie arbeiten mit niedrigen Noten werden dann billigere Mikrofone, Lesen Sie den eingebauten diejenigen, die in Ihrem PC oder Handy haben, müssen mit erheblichen rolloff ab ca 80-100Hz. Für halbwegs gute externe, erhalten Sie möglicherweise nach unten, um 30-40Hz. Gehen Sie finden die Daten auf das Mikrofon.
Können Sie auch überprüfen, was passiert mit der Wiedergabe der Ton über die Lautsprecher und dann die Aufnahme mit Ihnen Lieblings-Mikrofon. Aber natürlich, wir reden über die 2 sets von Frequenzgang-Kurven.
Wenn es zur Leistung kommt, gibt es eine Reihe von frei verfügbaren Bibliotheken gibt, auch wenn Sie sich bewusst sein, der verschiedene Lizenzierungs-Modelle.
Vor allem nicht aufgeben, nachdem die ersten paar versuche. Viel Glück.
InformationsquelleAutor der Antwort TJA
Ich hatte ein ähnliches problem mit Mikrofon-Eingang für ein Projekt habe ich ein paar Jahre zurück - stellte sich heraus, dass durch eine DC-offset.
Stellen Sie sicher, entfernen Sie alle Voreingenommenheit, bevor Sie versuchen, FFT oder was auch immer andere Methode Sie verwenden.
Es ist auch möglich, dass Sie in der Durchfahrtshöhen oder clipping-Probleme.
Graphen sind der beste Weg, um zu diagnostizieren, die meisten Probleme mit audio.
InformationsquelleAutor der Antwort Dipstick
Hier ist der C++ source code für eine ungewöhnliche zwei-Stufen-Algorithmus, den ich entwickelt, die Echtzeit Erkennung der Tonhöhe auf polyphone MP3-Dateien, während gespielt wird auf Windows. Diese Kostenlose Anwendung (PitchScope Spielerverfügbar im web) wird Häufig verwendet, um zu erkennen, die Noten einer Gitarre oder Saxophon-solo auf einer MP3-Aufnahme. Der Algorithmus dient zur Erkennung der dominanten Tonhöhe (note), in jedem gegebenen moment in der Zeit in eine MP3-Datei. Hinweis onsets sind genau abgeleitet eine signifikante änderung in der dominanten Tonhöhe (eine note) zu jedem beliebigen Zeitpunkt während der MP3-Aufnahme.
Wenn eine einzelne Taste gedrückt wird, auf einem Klavier, was wir hören, ist nicht nur die Frequenz der lautlichen Schwingungen, aber ein composite mehrerer Schallwellen, die in verschiedenen mathematisch zugehörigen Frequenzen. Die Elemente dieser zusammengesetzten Schwingungen bei unterschiedlichen Frequenzen bezeichnet man als Oberschwingungen oder partialtöne. Zum Beispiel, wenn wir drücken Sie die Mittlere Taste " C " auf dem Klavier, die einzelnen Frequenzen der composite harmonischen start in 261.6 Hz als Grundfrequenz, 523 Hz wäre die 2. Harmonische, 785 Hz wäre der 3. Harmonischen, 1046 Hz wäre der 4. Harmonischen, etc. Die später Oberschwingungen sind ganzzahlige Vielfache der Grundfrequenz, 261.6 Hz ( ex: 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1046 ). Verbunden an der Unterseite, ist eine Momentaufnahme der tatsächlichen Oberschwingungen die auftreten, während der polyphone MP3-Aufnahme von einer E-Gitarren-solo.
Anstatt einer FFT, ich benutze eine modifizierte DFT-Transformation, mit logarithmischer Frequenz-Abstand, zuerst erkennen, um diese mögliche Oberschwingungen durch die Suche nach Frequenzen, mit peak-Werten (siehe Diagramm unten). Aufgrund der Art und Weise, dass ich Daten sammeln, um meine veränderte Log DFT, die ich NICHT anwenden, eine Windowing-Funktion, um das signal, noch hinzufügen und überlappen. Und ich habe die DFT so ist seine Frequenz-Kanäle sind logarithmisch gelegen, um direkt ausrichten mit den Frequenzen, wo die Obertöne werden erzeugt, indem die Noten auf einer Gitarre, Saxophon, etc.
Nun im Ruhestand, habe ich beschlossen, lassen Sie die Quelle code für mein pitch-Erkennungs-engine innerhalb einer kostenlosen Demo-app namens " PitchScope Spieler. PitchScope-Player ist über das Internet verfügbar, und Sie können herunterladen der ausführbaren Datei für Windows, um zu sehen, mein Algorithmus bei der Arbeit an einer mp3-Datei Ihrer Wahl. Den untenstehenden link, um GitHub.com führt Sie zu meinem full-source-code, wo Sie können sehen, wie ich erkennen, dass die Obertöne mit einer angepassten Logarithmischen DFT transformieren, und suchen Sie dann nach der Teiltöne (Obertöne), deren Frequenzen erfüllen die korrekte integer-Beziehung, die definiert, ein 'pitch'.
Mein Pitch Detection Algorithmus ist eigentlich ein zwei-stufiges Verfahren: a) Zunächst sind die ScalePitch erkannt wird ('ScalePitch' hat 12 mögliche pitch-Werte: {E, F, F#, G, G#, A, A#, B, C, C#, D, D#} ), b) und nach ScalePitch ermittelt, dann die Oktave wird berechnet, indem die Prüfung aller Oberschwingungen für die 4 möglichen Oktav-Kandidat Noten. Der Algorithmus dient zur Erkennung der dominanten Tonhöhe (note), in jedem gegebenen moment in der Zeit, in eine polyphone MP3-Datei. Meistens entspricht die Hinweise von einem instrumental-solo. Wer interessiert ist, im C++ - source-code für mein zweistufigen Pitch Detection Algorithmus vielleicht möchten Sie beginnen bei der Estimate_ScalePitch () - Funktion innerhalb der SPitchCalc.cpp Datei an GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
Unten ist das Bild, das von einer Logarithmischen DFT (erstellt von meiner C++ - software) für 3 Sekunden von einem Gitarren-solo auf eine polyphone mp3-Aufnahme. Es zeigt, wie die Obertöne erscheinen für einzelne Noten auf der Gitarre, beim spielen ein solo. Für jeden Hinweis auf dieses Logarithmische DFT wir sehen können, mehrere harmonische Erweiterung vertikal, da jede harmonische wird die gleiche Zeit haben-in der Breite. Nach der Oktave der note bestimmt wird, dann kennt man die Frequenz des Grundtons.
InformationsquelleAutor der Antwort James Paul Millard
Check-out aubio und open-source-Bibliothek, die mehrere state-of-the-art Methoden für die pitch-tracking.
InformationsquelleAutor der Antwort piem
Werfen Sie einen Blick auf diese Beispiel-Anwendung:
http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx
Mir ist klar, das app ist in C# und Sie müssen C++, und ich weiß, dies ist .Net/Windows und du bist auf einem mac... Aber ich dachte, seine FFT-Implementierung könnte ein Ausgangspunkt point. Versuchen Sie, vergleichen Sie Ihre FFT-Implementierung zu sein. (Er ist der iterative, breadth-first-version des Cooley-Tukey - FFT). Sind Sie ähnlich?
Auch, die "zufällig" Verhalten, das Sie beschreiben, könnte sein, weil du bist grabbing Daten zurückgegeben, die durch Ihre Soundkarte direkt ohne Montage die Werte aus dem byte-array richtig. Haben Sie Fragen, Ihrer Soundkarte, um die Probe 16-bit-Werte, und dann gab es ein byte-array um die Werte zu speichern? Wenn so, denken Sie daran, dass in zwei aufeinanderfolgenden bytes in das zurückgegebene array eine 16-bit-audio-sample.
InformationsquelleAutor der Antwort Christian Pedersen
Java-code für eine real-time real-Detektor ist verfügbar bei http://code.google.com/p/freqazoid/.
Es funktioniert Recht gut auf einem beliebigen computer mit post-2008 real-time Java. Das Projekt wurde fallen gelassen und konnte abgeholt werden durch eine andere Interessierte Partei. Kontaktieren Sie mich, wenn Sie möchten weitere details.
InformationsquelleAutor der Antwort James Beauchamp
Ich habe eine ähnliche Frage hier:
C/C++/Obj-C Real-time-Algorithmus, um festzustellen, Note (nicht die Tonhöhe) von Vocal Input
EDIT:
Performous enthält eine C++ - Moduls zur Echtzeit-Erkennung der Tonhöhe
Auch Yin Pitch-Tracking Algorithmus
InformationsquelleAutor der Antwort P i
Können Sie sich alles von instrument-Tuner? Meine herrlich kompakt guitar tuner ist in der Lage zu erkennen, die Tonhöhe der Saiten ziemlich gut. Ich sehe diese Referenz für eine Klavier-tunerdie erklärt, einen Algorithmus zu einem gewissen Grad.
InformationsquelleAutor der Antwort djna