Tonerkennung per Software möglich?



  • nman schrieb:

    Ach, da mache ich mir keine Sorgen, dann muss man eben am Anfang der Analyse kurz mal alle Saiten der Reihe nach anschlagen und die Sache ist gegessen.

    Da gab es doch diese Firma in Amerika, die Gitarrenumbauten anbietet, in denen sie dann spezielle Pickups einbauen, die die Stimmung der Gitarre selbstständig übernehmen. Man konnte da verschiedene Tunings einprogrammieren und musste die Gitarre dann ein paar Mal komplett anschlagen, damit sie selbstständig das neue Tuning stimmte. Wäre bestimmt ganz interessant zu sehen, wie die das gemacht haben. Ich glaube sogar, dass Sie einen Teil Ihrer Technik offengelegt haben. Ich werde mal googlen danach, wenn ich den enstsprechenden Link finde, poste ich ihn hier.



  • Naja, mit einem Pickup die Tonhöhe einer einzelnen offenen Saite herauszufinden, ist ja trivial.



  • Korbinian schrieb:

    .filmor schrieb:

    Was spricht denn dagegen, eine FFT zu machen und dann Gaußkurven an die Peaks zu fitten? Ich seh' da grad' noch nicht die physikalische (?!) Unmöglichkeit.

    Verdammt, das klingt nach einer guten Idee... @nman das wuerd ich umbedingt ausprobieren, den Algorithmus dafuer (das fitten) hab ich rumliegen wenn du brauchst :)Es gibt auch nette Verfahren automatisch die Anzahl peaks zu finden, bei der Gitarre ists einfach, ist von 1-anzahl seiten 😉

    Fand' die Idee auch gut, ich wollte nämlich selber mal sowas implementieren, bin aber nicht so recht dazu gekommen. Aktuell benutze ich leider einfach nur das Maximum über das Spektrum, was natürlich mitnichten gut funktioniert. Naja, bald sind Semesterferien, vielleicht komm' ich ja dann nochmal dazu 😉

    @bergvagabund: Ich sehe schon, was du meinst, aber kann man sich nicht dadurch, dass man etwas über die Klangerzeugung weiß die Sache vereinfachen? Zum Beispiel kann man bei Kenntnis der Obertonreihe für ein Instrument oder allgemein einen Klang (mir geht's dabei vor allem um die menschliche Stimme) dieses Muster an die bereits erkannten Peaks (die zu finden ist meines Erachtens schon relativ unproblematisch, zumindest von der Mathematik her kann man Rauschen recht gut von echten Peaks unterscheiden, ist halt etwas Feintuning) „anfitten“ bzw. matchen, womit man wohl schon ein recht anständiges Ergebnis bekommt.



  • .filmor schrieb:

    @bergvagabund: Ich sehe schon, was du meinst, aber kann man sich nicht dadurch, dass man etwas über die Klangerzeugung weiß die Sache vereinfachen? Zum Beispiel kann man bei Kenntnis der Obertonreihe für ein Instrument oder allgemein einen Klang (mir geht's dabei vor allem um die menschliche Stimme) dieses Muster an die bereits erkannten Peaks (die zu finden ist meines Erachtens schon relativ unproblematisch, zumindest von der Mathematik her kann man Rauschen recht gut von echten Peaks unterscheiden, ist halt etwas Feintuning) „anfitten“ bzw. matchen, womit man wohl schon ein recht anständiges Ergebnis bekommt.

    Also Anfangs habe ich auch nur über das Spektrum versucht, den Grundton zu bestimmen. Dies hat aber bei der Gitarre eigentlich nur dann halbwegs funktioniert, wenn die Saite gut eingeschwungen war und somit die Obertonreihe sich nur noch wenig über der Zeit ändert. Ich hatte auch jedesmal unterschiedliche Ergebnisse weil ich gar nicht so gleichmäßig die Gitarre anschlagen konnte. Vielleicht muss ich noch dazu sagen dass ich die Versuche mit einer Akustikgitarre und einem Mikrofon gemacht habe (ich denke mal dass sich eine E-Gitarre erheblich zahmer verhalten sollte).

    Mein Algorithmus sah anfangs so aus:
    - Bestimmung des lautesten Peaks (fpeakmax) im Spektrum (unter der Annahme dass der lauteste auch Bestandteil der Obertonreihe sein muss)
    - Dann über mehrere Iterationen bei den Frequenzen fpeakmax/2, fpeakmax/3, fpeakmax/4 usw. geprüft, ob auch an diesen Frequenzen Peaks vorhanden sind.
    - Der am weitesten "links" stehende Peak war somit mein Grundton

    Hat bei Tiefen Tönen (E2, A2) noch ganz gut funktioniert. Aber bei den höheren Tönen (z.B. G3 oder B3) hatte ich fast immer auch Peaks unterhalb der Grundfrequenz des eigentlichen Tons. Somit also für meine Zwecke unbrauchbar.

    Desweiteren hatte ich mir überlegt man könnte ja auch einfach hergehen und im Spektrum einfach den am weitesten "links" stehenden Peak heraussuchen. Hat aber noch viel schlechter funktioniert wie die obige Methode (besonders hinsichtlich höherer Töne).

    Wahrscheinlich müsste man um wirklich super Ergebnisse zu erzielen am Schluss alle Obertöne ermitteln (z.B. mit Hilfe des Autoleistungsspektrums) um anschließend mit Hilfe eines Schätzverfahrens (statistische Auswertung, eventuell in einem "lernenden" System) den Ton zu bestimmen. Leider habe ich momentan keinerlei Ahnung wie man an sowas herangehen könnte.



  • .filmor schrieb:

    ...ich wollte nämlich selber mal sowas implementieren, bin aber nicht so recht dazu gekommen. Aktuell benutze ich leider einfach nur das Maximum über das Spektrum, was natürlich mitnichten gut funktioniert.

    Ahja, gib mir deine Mail und ich schick dir den code...

    @bergvagabund, @.filmor
    Also jetzt ist schon ein paar mal F0 Bestimmung gefallen: Eigentlich geht diese recht unproblematisch aus dem Cepstrum. Schwierig ists bei menschlicher Stimme nur dass man staendig zwischen stimmhaften (Vokale, mit F0) und stimmlosen (Konsonanten, ohne F0) wechselt, was die Extraktion eben fehlerhaft macht. Sie ist weiterhin ungenau aufgrund Stimm= und Spracheigenschaften: Rauhigkeit (und aehnliches) und Prosodie. Nimmt man ein Instrument, gibt es natuerlich Vibrato, Glissandi und absichtliche verzerrung in die Zwischentoene (von Verzerrern bei Egitarren ganz zu schweigen). Aber gegeben ein "normales" szenario, mit einigermassen gut gestimmter Gitarre und "normalen" Griffen, sollte so eine erkennung schon moeglich sein. Ich sehe da eher noch schwierigkeiten dann auf die Notenlaengen zu kommen 🙂



  • Korbinian schrieb:

    Ahja, gib mir deine Mail und ich schick dir den code...

    Nickname-ohne-.@gmail.com
    Vielen Dank.

    Ich werd' mich wohl auch mal mit den dahinterliegenden mathematischen Gegebenheiten näher auseinandersetzen müssen (Cepstrum hab ich noch nie gehört), bisher kann ich nur bei der Fouriertransformation behaupten, dass ich da in etwa weiß was da weshalb passiert 😉



  • ahja, cepstrum ist nur nochmal FFT (oder dct oder sonstwas) auf das spektrum. manche nennen es auch modellspektrum. und du hast post.

    @bergvagabund: hast du da drueber eine arbeit oder sowas geschrieben? waere interessant zu lesen 🙂 vielleicht sollten wir mal die kraefte hier vereinen und das ganze nochmal versuchen zu stemmen...



  • Korbinian schrieb:

    ahja, cepstrum ist nur nochmal FFT (oder dct oder sonstwas) auf das spektrum. manche nennen es auch modellspektrum. und du hast post.

    nicht auf das log-Spektrum?



  • Korbinian schrieb:

    @bergvagabund: hast du da drueber eine arbeit oder sowas geschrieben? waere interessant zu lesen 🙂 vielleicht sollten wir mal die kraefte hier vereinen und das ganze nochmal versuchen zu stemmen...

    Nein nein, ich habe keine Arbeit darüber geschrieben. Audio ist einfach mein Hobby. Habe jahrelang Aufnahmen im Tonstudio gemacht und selbst in mehreren Bands gespielt. Deshalb sind alle meine bisherigen Projekte im Audiobereich angesiedelt. Momentan ists eben ein Stimmgerät wo es hauptsächlich im die f0 Bestimmung geht.

    Jester schrieb:

    nicht auf das log-Spektrum?

    Soviel ich weiss transformiert man das Ergebnis der Autokorrelation in den Spektralbereich, dann erhält man das Autoleistungsspektrum. Anschließend logarithmiert man das Autoleitungsspektrum und wendet schließlich auf das Ergebnis die inverse Fouriertransformation an. Das Cepstrum ist sozusagen eine Information über das Signal im Zeitbereich.



  • Kommt ganz drauf an welche Art Features man haben will. Generell ist Cepstrum einfach nur Spektrum vom Spektrum. Fuer die meisten akustischen Features (Spracherkennung, Tonerkennung) logarithmiert man um die logarithmische Wahrnehmung des menschlichen Ohrs zu simulieren. Nachdem die (i)FFT eine Transformation in Normalbasis ist, kann man auch ne andere Transformation nehmen, viele nehmen DCT oder Hartley. Autokorrelation ist glaub ich nicht mehr so aktuell was Features betrifft, war eher populaer als FFT noch langsam war und noch nicht so weitverbreitet.



  • Hmm, aber wenn man f(x) zweimal kontinuierlich fouriertransformiert bekommt man doch einfach f(-x) raus, irgendwas halbwegs analoges sollte sich ja dann auch bei der DFT ergeben.



  • Jo, sehe ich auch so.

    Wikipedia meint auch, man sollte logarithmieren, das ist ja auch irgendwo logisch.

    Durch das Logarithmieren werden zum Beispiel Amplitudenunterschiede zu einer additiven Konstante, die dann durch die erneute Fourier-Transformation nur noch bei den tiefen Frequenzen mitspielt. Lautstärke-Unterschiede lassen sich also ganz prima raufiltern mit sowas.



  • Jester schrieb:

    Jo, sehe ich auch so.

    Wikipedia meint auch, man sollte logarithmieren, das ist ja auch irgendwo logisch.

    Durch das Logarithmieren werden zum Beispiel Amplitudenunterschiede zu einer additiven Konstante, die dann durch die erneute Fourier-Transformation nur noch bei den tiefen Frequenzen mitspielt. Lautstärke-Unterschiede lassen sich also ganz prima raufiltern mit sowas.

    Wenn es einem nur um F0 geht, ist hier eine Gleitfenster Median-Normalisierung besser geeignet, da hierdurch Amplitudenunterschiede in den einzelnen Harmonischen nahezu equalisiert werden.



  • Tachyon schrieb:

    Jester schrieb:

    Jo, sehe ich auch so.

    Wikipedia meint auch, man sollte logarithmieren, das ist ja auch irgendwo logisch.

    Durch das Logarithmieren werden zum Beispiel Amplitudenunterschiede zu einer additiven Konstante, die dann durch die erneute Fourier-Transformation nur noch bei den tiefen Frequenzen mitspielt. Lautstärke-Unterschiede lassen sich also ganz prima raufiltern mit sowas.

    Wenn es einem nur um F0 geht, ist hier eine Gleitfenster Median-Normalisierung besser geeignet, da hierdurch Amplitudenunterschiede in den einzelnen Harmonischen nahezu equalisiert werden.

    Mir ging es hier rein um die Definition des Cepstrums. Da dürfte die echte Definition wohl schon am geeignetsten sein. 😉


Anmelden zum Antworten