Tonerkennung per Software möglich?



  • bergvagabund schrieb:

    Dieses Jahr auf der Musikmesse hat die Münchner Firma Celemony erstmalig ein derartiges Plugin vorgestellt und die Fachwelt in ganz großes Staunen versetzt, da es als physikalisch unmöglich galt, aus einem komplexen Klanggemisch (Akkord) die einzelnen Töne einzeln zu extrahieren

    Äh, warum denn das? Ich kann mir gut vorstellen, dass sowas derzeit nicht annähernd vernünftig in Echtzeit machbar ist, aber "physikalisch unmöglich"? Ist doch nur eine Frage des Zeitfensters, der Signalqualität und der Rechenleistung, oder?

    Hier das echt beeindruckende Video dazu:
    http://www.celemony.com/cms/index.php?id=dna&L=1

    Das ist ein Werbevideo für ein fix-fertiges Produkt. Es würde mich sehr wundern, wenn es nicht auch eine Menge Arbeiten dazu gäbe, bei denen ähnliches bereits gemacht wurde.

    Ich würde mich aber erst mal darauf beschränken, einen einzelnen Ton zu bestimmen (also ein Stimmgerät zu entwickeln). Dies ist auch schon schwierig genug.

    Nein, das ist für mich völlig uninteressant. Natürlich komme ich darum nicht herum, brauche ja mal eine simple Proof-Of-Concept-Implementierung, aber das ist ja keine Programmierübung, wenn ich das nicht für zumindestens drei Töne gleichzeitig in Echtzeit hinbekomme, kann ich das nicht gebrauchen, dann würde ich einfach in MIDI-Hardware investieren. (Fände ich aber natürlich schade.)

    Korbinian: Hm, wie hättest Du das denn gemacht? Gaußkurven an die Peaks anzulegen, erschien mir in meiner grenzenlosen Naivität und Erfahrungslosigkeit eigentlich recht schnell als die praktikabelste Lösung. Habe aber bestimmt einen Haufen Schwierigkeiten auf dem Weg dorthin unterschätzt bzw. gar nicht miteinbezogen.



  • Ich habe mir übrigens jetzt ein bisschen was zu Celemony durchgelesen. Als interessante Neuheit wurde in diversen Artikeln eigentlich auch polyphonische Tonhöhenanpassung als Neuheit bezeichnet, als polyphonische Tonerkennung. Ersteres ist natürlich anspruchsvoller, aber mir geht es ja "nur" um die Erkennung, dh. ich kann eine Menge Daten komplett verwerfen, die Melodyne korrekt behandeln und ins Pitch Shifting miteinbeziehen muss.



  • Wenn Du ein Instrument hast, welches ein sehr obertonarmes Klangspektrum besitzt (z.B. eine Kirchenorgel mit den der Wellenlänge entsprechnenden Pfeiffen) dann wirst Du mit dieser Methode vielleicht Erfolg haben.
    Aber speziell die Gitarre ist in dieser Hinsicht superkomplex. Man hat vollkommen unharmonische Resonanzen des Holzes. Außerdem schwingen immer die anderen Seiten ein bisschen mit.
    Die Frage ist nach welchen Bedingungen willst Du im Spektrum die Peakdetection machen? Welchen Peak zählst Du mit dazu und welchen nicht? Wo legst Du den Schwellwert hin? Wo beginnt das Rauschen? Selbst die Auswertung mit dem Auge (optisch) ist mit dieser Methode meist nicht möglich.
    Und die Peaks mit Gaußkurven zu fitten bringt einem da auch nicht weiter. Das Problem bleibt zu bestimmen, welchen Peak ich mitzähle und welchen nicht.

    Physikalisch ist das bei bloser Betrachtung des Spektrums deshalb schon nicht möglich, weil man ja anhand der Peaks nicht beurteilen kann, ob es sich bei der Frequenz um den Grundton eines bestimmten Tones handelt, oder z.B. um die Oberwelle eines anderen Tones im Akkord. Desweiteren gibt es z.B. beim Klavier auch Untertöne (mitschwingen der Tiefen Saiten beim Anschlag eines höheren).

    Speziell bei Instrumenten bei denen sich das Spektrum über die Zeit stark verändert (z.B. alle percussiven Instrumente wie Gitarre, oder Klavier) sind besonders schwierig in der Grundtonbestimmung. Ist die Gitarre mal eingeschwungen, wirds leichter.



  • Man kann ja einige Vereinfachungen annehmen.
    😉 wir suchen 1-6 Toene (= Mittelwerte der gefitteten Gausskurven)
    😉 die gefundenen Mittelwerte kann man dann noch "runden" indem man auf die naechste "sinnvolle" Hz zahl geht (also die Zuordnung Ton => Note macht)
    😉 Harmonische treten ja logischerweise in den hoeheren Oktaven auf, also suchen wir erstmal in der untersten auftretenden (also filtern wir vorher mal auf lowpass)

    Ich hab jetzt noch keine Spektren/Cepstren von Gitarrenklaengen angeschaut, also hab ich grad keine Intuition wie ich weitermachen wuerde. Vielleicht interessiert dich aber das hier, nman: www.korbinian-riedhammer.de/~sikoried/mfccvisualizer um man ein bisschen Anschauung fuer die Daten zu bekommen. Man muesste v.a. sehn, ob sich die Daten dann gut fitten lassen (und eben mal ne gute menge Frames plotten und die Verteilungen drauflegen).

    Das ganze interessiert mich jetzt uebrigens irgendwie, werd mal morgen etwas damit rumspielen. Wenn du ein paar Samples fuer mich haettest waers prima 🙂

    Edit: Eine andere interessante herangehensweise waere, indem man per kombinatorik ausrechnet, welche Tonkombinationen ueberhaupt moeglich sind (man hat ja in der regel nur 1 hand zum greifen auf 6 seiten) und diese dann synthetisiert, und dann eine next-neighbor suche drauf macht 🙂



  • Korbinian schrieb:

    😉 die gefundenen Mittelwerte kann man dann noch "runden" indem man auf die naechste "sinnvolle" Hz zahl geht (also die Zuordnung Ton => Note macht)

    Hm, damit waere ich ehrlich gesagt eher vorsichtig, immerhin kann man auf der Gitarre ja auch sehr schön Saiten ziehen und so auch eine Menge Töne zwischen zB. einem G und einem G# produzieren. Die sind mir zwar nicht unbedingt alle wichtig, aber zumindest ein Ton zwischen G und G# wäre dringend nötig (mehr wäre natürlich besser).

    Ansonsten gefallen mir die Vereinfachungen recht gut.

    www.korbinian-riedhammer.de/~sikoried/mfccvisualizer um man ein bisschen Anschauung fuer die Daten zu bekommen. Man muesste v.a. sehn, ob sich die Daten dann gut fitten lassen (und eben mal ne gute menge Frames plotten und die Verteilungen drauflegen).

    Cool, danke! 🙂

    Das ganze interessiert mich jetzt uebrigens irgendwie, werd mal morgen etwas damit rumspielen. Wenn du ein paar Samples fuer mich haettest waers prima 🙂

    Ich werde mal schaun, was sich diese Woche machen lässt. Am liebsten hätte ich ja ein möglichst trockenes Signal, also Gitarre direkt in die Soundkarte. Dazu muss ich aber wohl noch den Instrumentenlevel auf Line-Level hieven und ich habe das dumpfe Gefühl, dass die unterschiedlichen Impedanzen auch ein bisschen
    unpraktisch werden könnten. Wird wohl darauf hinauslaufen, dass ich den Line-Out-Ausgang meines Verstärkers abgreifen werde und versuchen werde, ein möglichst sauberes und trockenes Signal hinzubekommen.

    Eine andere interessante herangehensweise waere, indem man per kombinatorik ausrechnet, welche Tonkombinationen ueberhaupt moeglich sind (man hat ja in der regel nur 1 hand zum greifen auf 6 seiten) und diese dann synthetisiert, und dann eine next-neighbor suche drauf macht 🙂

    Das ist zwar eine witzige Idee, aber das fällt für den allgemeinen Anwendungsfall flach, gibt ja auch eine Menge alternative Tunings. Falls die Erkennung mehrerer gleichzeitiger Noten nicht sehr zuverlässig ist, könnte man natürlich sowas mit den gängigsten Wald-und-Wiesen-Akkorden machen.



  • Ich bin gespannt, was bei deinem Projekt am Ende rauskommt. Soweit ich weiß, scheitert es meistens daran, dass die Tonerkennung nur rudimentär funktioniert, weil z.B. bei der Gitarre immer Obertöne entstehen, die das Klangbild "verfälschen", oder (und das finde ich eigentlich noch problematischer) die Gitarre eigentlich niemals _komplett_ richtig gestimmt ist. Es gibt da diesen Spruch: "Gitarristen stimmen Ihr halbes Leben lang ihre Gitarre, die andere hälfte spielen sie falsch" 🙂
    Aber trotzdem natürlich gutes Gelingen!

    P.S: Der E-Dur Akkord auf der Gitarre (1. Lage) setzt sich aus den Tönen [E] [H] [E] [GIS] [H] [E] (siehe dein ersten Post) 🤡



  • W0lf schrieb:

    Ich bin gespannt, was bei deinem Projekt am Ende rauskommt.

    Ich werde für das aktuelle Projekt wohl auf MIDI-Pickups setzen, die Tonerkennung vom Analogsignal ist einfach ein viel zu großer Unsicherheitsfaktor.

    Allerdings werde ich die Schnittstelle allgemein genug halten, dass ich irgendwann später auch einfach das Analogsignal verwenden kann, falls die Erkennung (die ich als Nebenprojekt weiterverfolgen möchte) performant und zuverlässig genug ist.

    die Gitarre eigentlich niemals _komplett_ richtig gestimmt ist.

    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.

    P.S: Der E-Dur Akkord auf der Gitarre (1. Lage) setzt sich aus den Tönen [E] [H] [E] [GIS] [H] [E] (siehe dein ersten Post) 🤡

    Hoppla, ja, hab mich um eine Saite verzählt.



  • 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.


Anmelden zum Antworten