Tonerkennung per Software möglich?
-
Zum Beispiel, aber ein simples Zero-Padding sollte man auf keinen Fall machen.
-
Jester schrieb:
nman schrieb:
Aber im Grunde könnte das ja ganz brauchbar funktionieren, wenn ich mein 0.1s-Sample 10mal wiederhole und das dann als 1s-Sample verarbeite, oder?
Das kannst Du Die sparen. Das Signal, das Du transformierst wird sowieso periodisch fortgesetzt.
Hoppla, tatsächlich. Denkfehler der üblen Sorte, ich sollte wohl endlich irgendeine LVA dazu absolvieren.
Zum "Zero-Padding": Das war schon mit Fensterfunktion gedacht, stehe da leider noch mit der Terminologie noch etwas auf Kriegsfuß, unter anderem, weil mir die Grundlagen fehlen.
-
Also mit einer einfachen FFT wirst Du da keine gescheiten Ergebnisse erziehlen können.
Zunächst einmal muss man unterscheiden, ob man "nur" einen einzelnen Ton bestimmen will (Funktionsweise eines Stimmgeräts) oder mehrere Töne aus einem Akkord gleichzeitig bestimmen will.
Letzeres gibt es noch nicht so lange. 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 und damit auch editierbar zu machen. Hier das echt beeindruckende Video dazu:
http://www.celemony.com/cms/index.php?id=dna&L=1Ich 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.
Einfach aus dem Spektrum den Hauptpeak zu bestimmen funkioniert hier aber auch so gut wie gar nicht. Die Gitarre ist auch gleich eines der schwersten Instrumente, da meist der Grundton nicht der lauteste Peak ist, sondern meistens eine (wenn Du Glück hast harmonische) Oberwelle darstellt.
Der Fachausdruck in deutsch dazu heisst Grundtonbestimmung. Dies ist sogar ein relativ gut erforschtes Feld und zwar benötigt man die Grundtonbestimmung in der Sprachsignalverarbeitung.
Hier noch ein paar Begriffe nach denen Du erstmal schauen solltest:
- Autokorrelation
- Autoleistungsspektrum
- CepstrumDas ganze Feld ist durchaus anspruchsvoll was ich im Moment an meinem Stimmgerät Projekt erfahren darf
-
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.
-
.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
-
.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.
Kannst du das mal erklären?
-
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=1Das 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 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...