Tonerkennung per Software möglich?
-
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 GrundtonHat 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.