Frage

Ich versuche, Echtzeit Tonhöhenerkennung eines Benutzers zu tun, zu singen, aber ich laufe in einer Menge von Problemen. Ich habe versucht, viele Methoden, einschließlich FFT ( FFT Problem (Returns zufällige Ergebnisse) ), und Autokorrelations ( Autocorrelation Tonhöhenerkennung kehrt zufällige Ergebnisse mit MHK-Eingang ), aber ich kann nicht ein gutes Ergebnis alle Methoden scheint, zu geben. Kann jemand ein Verfahren zur Echtzeit-Pitch-Tracking vorschlagen oder wie auf ein Verfahren zur Verbesserung der ich bereits habe? Ich kann nicht scheinen keine guten C / C ++ Methoden zur Echtzeit Tonhöhenerkennung zu finden.

Danke,

Niall.

Edit:. Just zu beachten, ich habe überprüft, dass die Mikrofoneingangsdaten korrekt sind, und dass, wenn eine Sinuswelle unter Verwendung der Ergebnisse sind mehr oder weniger die richtige Tonhöhe

Edit: Sorry, das ist zu spät, aber im Moment, im dem autocolleration visualisieren, indem die Werte aus dem Ergebnis-Reihe nehmen, und jeder Index, und Auftragen der Index auf der X-Achse und den Wert auf der Y-Achse (beide geteilt durch 100.000 oder so etwas, und im mit OpenGL), die Daten in eine VST-Host-Plugging und VST-Plugins verwendet, ist keine Option für mich. Im Moment sieht es genauso wie einige zufällige Punkte. Bin ich es richtig tun, oder können Sie mir bitte zeigen einige Code torwards es oder mir helfen, dafür zu verstehen, wie die rohe Audiodaten und Autokorrelationsdaten zu visualisieren.

War es hilfreich?

Lösung

einen Schritt zurück ... Um diese Arbeiten Sie muss Finde einen Weg heraus Zwischenschritte dieses Prozesses zu zeichnen. Was Sie versuchen zu tun ist nicht besonders schwer, aber es ist fehleranfällig und knifflig. Clipping, Windowing, schlechte Verkabelung, Aliasing, DC-Offsets, die falschen Kanäle, die seltsame FFT Frequenzachse, Impedanzunstimmigkeiten, Bildgröße zu Lesefehlern ... wer weiß. Aber wenn man die Rohdaten dargestellt werden können, und dann die FFT plotten, alles wird klar.

Andere Tipps

Ich fand mehr Open-Source-Implementierungen von Echtzeit-Pitch-Tracking

Es gibt auch einige Pitch-Tracker gibt, die nicht für die Echtzeit ausgelegt werden könnte, aber kann verwendbar sein, auf diese Weise für alle, die ich kenne, und auch nützlich sein könnte als ein Hinweis auf Ihre Echtzeit-Tracker vergleichen:

Ich weiß, diese Antwort wird nicht alle glücklich zu machen, aber hier geht.

Dieses Material ist hart, sehr hart. Zum einen gehen, wie viele Tutorials lesen, wie Sie auf FFT finden, Autokorrelation, Wavelets. Obwohl ich immer noch mit DSP ich kämpfen, ich habe einige Erkenntnisse aus der folgenden erhalten.

https://www.coursera.org/course/audio der Kurs ist nicht zur Zeit läuft, aber die Videos sind noch verfügbar.

http://miracle.otago.ac.nz/tartini/papers/ Philip_McLeod_PhD.pdf Arbeit über die Entwicklung eines Tonhöhenerkennungsalgorithmus.

http://dsp.stackexchange.com eine ganze Seite der digitalen Signalverarbeitung gewidmet ist.

Wenn Sie wie ich Sie nicht genug Mathematik zu tun haben zu folgen, um vollständig die Tutorials nicht geben, da einige der Diagramme und Beispiele half mir immer noch zu verstehen, was los war.

Als nächstes sind Testdaten und Prüfung. Schreiben Sie sich eine Bibliothek, die Testdateien Verwendung bei der Überprüfung Ihres Algorithmus erzeugt / s.

1) Eine Super einfacher reiner Sinuswellengenerator. Also sagen Sie zu schreiben YAT suchen (Yet Another Tuner) dann Sinus-Generator verwenden, um eine Reihe von Dateien, um 440Hz sagen wir von 420-460Hz in unterschiedlichen Schritten zu erstellen und sehen, wie sensibel und präzise Code ist. Kann es innerhalb von 5 Hz, 1 Hz, feiner noch?

lösen

2) Dann aktualisieren Sie Ihren Sinus-Generator, so dass es eine Reihe von schwächeren Harmonischen zu dem Signal hinzufügt.

3) Als nächstes sind reale Welt Variationen Harmonischen. Während also für die meisten Saiteninstrumente finden Sie eine Reihe von Harmonischen als einfache Vielfache der Grundfrequenz F0, für Instrumente wie Klarinetten und Flöten sehen wegen der Art, wie die Luft verhält sich in der Kammer der geraden Harmonischen fehlen oder sehr schwach. Und für einige Instrumente F0 fehlt, kann aber von der Verteilung der anderen Harmonischen bestimmt werden. F0 zu sein, was das menschliche Ohr wahrnimmt, wie Pech.

4) in irgendeiner absichtlichen Verzerrung Werfen durch die harmonischen Spitzenfrequenzen nach oben und unten in einer irregulären Weise verschiebt

Der Punkt ist, dass, wenn Sie Dateien mit bekannten Ergebnissen erstellen dann ist es einfacher zu überprüfen, dass, was Sie bauen tatsächlich funktioniert, Bugs abgesehen natürlich.

Darüber hinaus gibt es eine Reihe von „Bibliotheken“ da draußen enthalten Hoerproben. https://freesound.org von der Coursera Serie oben erwähnt. http://theremin.music.uiowa.edu/MIS.html

Als nächstes bewusst sein, dass das Mikrofon nicht perfekt ist und es sei denn, Sie Tausende von Dollar dafür ausgegeben haben, werden einen ziemlich variable Frequenzgang Bereich aufweisen. Insbesondere, wenn Sie mit tiefen Noten dann billiger Mikrofone arbeiten, müssen die eingebaut diejenigen in Ihrem PC oder Telefon lesen, erhebliche rolloff ab etwa 80-100Hz. Für einigermaßen gute externe, vielleicht bekommen Sie 30-40Hz nach unten. Gehen Sie die Daten auf Ihrem Mikrofon finden.

Sie können auch überprüfen, was passiert, den Ton über die Lautsprecher zu spielen und dann mit Ihnen Lieblings Mikrofon aufnehmen. Aber natürlich jetzt sprechen wir über zwei Sätze von Frequenzgangkurven.

Wenn es um Leistung geht, gibt es eine Reihe von frei verfügbaren Bibliotheken da draußen, obwohl do bewusst sein, die verschiedenen Lizenzmodelle.

Vor allem gibt sie nicht nach dem ersten paar Versuchen auf. Viel Glück.

Ich hatte ein ähnliches Problem mit Mikrofoneingang an einem Projekt, das ich vor ein paar Jahren - stellte sich heraus, aufgrund eines DC sein Offset

.

Achten Sie darauf, jede Voreingenommenheit entfernen, bevor FFT versuchen oder eine andere Methode was auch immer Sie verwenden.

Es ist auch möglich, dass Sie in lichter Höhe oder Clipping-Probleme ausgeführt werden.

Graphs ist der beste Weg, die meisten Probleme mit Audio zu diagnostizieren.

Hier ist die C ++ Quellcode für einen ungewöhnlichen zweistufigen Algorithmus, dass ich erdacht, die tun können, Echtzeit Pitch-Erkennung auf polyphone MP3-Dateien, während auf Windows gespielt werden. Diese kostenlose Anwendung ( PitchScope Spieler , über das Internet erhältlich) wird häufig zu erkennen, die Noten einer Gitarre oder Saxophon-Solo auf einer MP3-Aufnahme verwendet. Der Algorithmus soll die dominierende Tonhöhe (eine Musiknote) zu einem bestimmten Zeitpunkt innerhalb einer MP3-Musikdatei zu erfassen. Hinweis Anläufe sind genau durch eine wesentliche Änderung der dominierenden Tonhöhe (eine Musiknote) zu einem bestimmten Zeitpunkt während der MP3-Aufnahme zu entnehmen.

Wenn eine einzelne Taste auf einem Klavier gedrückt wird, was wir hören ist nicht nur eine Frequenz der Schallschwingung, sondern ein Composite von mehreren Schallschwingungen bei unterschiedlichen mathematisch bezogenen Frequenzen auftreten. Die Elemente dieses Verbundes von Schwingungen mit unterschiedlichen Frequenzen werden als Harmonische oder partials. wenn wir die mittleren C-Taste auf dem Klavier, die einzelne Frequenzen des Verbunds der Harmonischen Zum Beispiel drücken, werden bei 261,6 Hz als die Grundfrequenz beginnen, 523 Hz der zweite Harmonische sein würde, 785 Hz würde den dritten Harmonische sein, 1046 Hz würde der 4. Harmonische sein, usw. die späteren Harmonischen sind ganzzahlige Vielfache der Grundfrequenz 261,6 Hz (ex: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046). Verknüpfte an der Unterseite, ist eine Momentaufnahme der aktuellen Harmonische , die während eines polyphonen MP3-Aufnahme eines Gitarrensolo auftreten.

Statt einer FFT, verwende ich eine modifizierte DFT-Transformation, mit logarithmischem Frequenzabstand, zum ersten diesen möglichen erkennen Harmonische durch für Frequenzen mit Spitzenwerten suchen (siehe Abbildung unten). Aufgrund der Art und Weise, dass ich Daten für meine modifizierte Log DFT sammeln, ich habe nicht ein Windowing-Funktion auf das Signal anwenden, noch addieren und überlappen. Und ich habe die DFT erstellt, so dass ihre Frequenzkanäle logarithmisch angeordnet sind, um direkt align mit den Frequenzen, bei denen Harmonischen durch die Noten auf einer Gitarre erstellt werden, Saxophon, etc.

Jetzt im Ruhestand ist, hat ich beschlossen, meinen Pitch-Erkennungs-Engine, den Quellcode zu veröffentlichen innerhalb eines kostenlosen Demo-App namens PitchScope Spieler . PitchScope Player ist im Internet verfügbar, und Sie konnten die ausführbare Datei herunterladen für Windows meinen Algorithmus bei der Arbeit auf einer MP3-Datei Ihrer Wahl zu sehen. Der Link unten, um GitHub.com werden Sie zu meiner vollständigen Quellcode führen, wo man sehen kann, wie ich die Harmonischen mit einem benutzerdefinierten erkennen logarithmisch DFT-Transformation, und dann für partials (Harmonische) buchen, der Frequenzen erfüllen die richtige ganzzahlige Beziehung, die eine definiert " Pitch‘.

My Pitch-Erkennungsalgorithmus ist eigentlich ein zweistufiges Verfahren: a) Zunächst wird die ScalePitch erkannt wird ( 'ScalePitch' hat 12 mögliche Tonhöhenwerte: {E, F, F #, G, G #, A, A #, B, C, C #, D, D #}) b) und nach ScalePitch bestimmt wird, dann ist die Octave berechnet wird, indem alle Harmonischen für die 4 möglichen Octave-Candidate Anmerkungen zu untersuchen. Der Algorithmus soll die dominierende Tonhöhe (eine Musiknote) zu einem bestimmten Zeitpunkt innerhalb einer polyphonen MP3-Datei zu erfassen. Das entspricht in der Regel der Noten eines Instrumentalsolo. Wer sich für die C ++ Quellcode für meine Zweistufige Pitch Detektionsalgorithmus möchten am Estimate_ScalePitch () Funktion innerhalb der SPitchCalc.cpp Datei auf GitHub.com starten. https://github.com/CreativeDetectors/PitchScope_Player

Im Folgenden finden Sie das Bild einer logarithmisch DFT (erstellt durch meine C ++ Software) für 3 Sekunden eines Gitarrensolo auf einer polyphonen MP3-Aufnahme. Es zeigt, wie die Harmonischen für einzelne Noten auf einer Gitarre erscheinen, während ein Solo zu spielen. Für jeden Hinweis auf diese logarithmisch DFT können wir seine mehrfachen Harmonischen sehen sich vertikal erstreckende, weil jeder harmonic wird die gleiche Zeitbreite haben. Nachdem die Oktave der Note bestimmt ist, dann wissen wir, um die Frequenz des Grundes.

 image description hier

eingeben

Schauen Sie sich aubio und Open-Source-Bibliothek, die für die Pitch-Tracking mehrere state-of-the-art Methoden enthält.

Werfen Sie einen Blick auf diese Beispielanwendung:

http://www.codeproject.com/KB/audio-video /SoundCatcher.aspx

Ich weiß, die App in C # ist, und Sie müssen C ++, und ich weiß, das ist .Net / Fenster und du bist auf einem Mac ... Aber ich dachte, seine FFT Implementierung könnte ein Start-Referenzpunkt sein. Versuchen Sie, Ihre FFT-Implementierung sein zu vergleichen. (Sein ist die iterative, Breiten ersten Version von Cooley-Tukey-FFT). Sind sie ähnlich?

Auch die „random“ Verhalten Sie beschreiben könnte sein, weil Sie Daten greifen durch Ihre Soundkarte wieder direkt, ohne die Werte aus dem Byte-Array Montage richtig. Haben Sie bitten, Ihre Soundkarte Probe 16-Bit-Werte, und dann gab es ein Byte-Array in die Werte zu speichern? Wenn dem so ist, daran erinnern, daß zwei aufeinanderfolgende Bytes in der zurückgegebene Array bilden eine 16-Bit-Audio-Sample.

Java-Code für eine Echtzeit-Real Detektor finden Sie unter http://code.google.com / p / freqazoid / .

Es funktioniert ziemlich gut auf jedem Computer laufen nach 2008 Echtzeit-Java. Das Projekt wurde fallen gelassen und gepflückt werden könnte durch eine interessierte Partei auf. Treten Sie mit mir, wenn Sie weitere Details.

Ich habe hier eine ähnliche Frage gestellt:

C / C ++ / Obj-C Echtzeit-Algorithmus Hinweis zu ermitteln (nicht Pitch) von Vocal Input

EDIT:

Performous enthält einen C ++ Modul für Echtzeit-Tonhöhenerkennung

Auch Yin Pitch-Tracking-Algorithmus

Können Sie sich etwas von Instrument-Tuner an? Meine herrlich kompakte Gitarrentuner kann die Tonhöhe der Saiten ziemlich gut erkennen. Ich sehe diesen Verweis auf einen Klavierstimmer , der einen Algorithmus zu einem gewissen Grad erklärt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top