Frequenzanalyse Grundton
-
Moin,
Ich habe neulich schon nach einer Bibliothek für Audioaufnahme gefragt und da ist es wohl nur höflich auch als Unregistrierter den gleichen Namen wieder zu verwenden, wenn ich zu einem zugehörigen Thema eine Frage habe.
Wie dort angedeutet habe ich bisher keine Erfahrung mit Audioprogrammierung und auch die Mathematik ist nicht unbedingt meine Stärke.
Dazu erstmal zum Problem: Der Grundton eines Audiosamples soll mit einer Referenzfrequenz verglichen und die relative Abweichung bestimmt werden.
Zuerst dachte ich mir, es würde ganz einfach werden: Fourier-Transformation, zu der es mit fftw eine sehr gute Bibliothek gibt, über die Samples jagen und dann aus dem Ergebnis die Grundfrequenz herauslesen, aber da habe ich mich wohl zu früh gefreut.
Zum Einen steigen Tonhöhen nicht linear sondern exponentiell, bei einer Oktave ist die Basis 2, so dass sich über mehrere Oktaven hinweg die Genauigkeit stark verändert. Zum Anderen ist eine Messungenauigkeit von weniger als ein paar Cent nur bei entsprechend hoher Auflösung der Analyse möglich, was den Prozessor zu stark belasten dürfte. Nach Durchstöbern der fftw Dokumentation bräuchte ich dann zudem auch sehr viele Samples, also entweder sehr große Frames (höhere Latenz) oder einen zusätzlichen Puffer in dem ich auch ältere Frames noch ablege.
Ich habe nach Lösungen gesucht, aber meine beschränkten Mathematischen Fähigkeiten machen mir da einen Strich durch die Rechnung. Selbst die Wikipediaartikel zu dem Thema Signalanalyseverfahren sind für mich zu großen Teilen unverständlich.
Gibt es eine Möglichkeit die Fourier-Transformation anzupassen, so dass gezielt auf einen Frequenzbereich und um diesen Frequenzbereich herum verteilte Bereiche analysiert wird?
Beim Durchlesen der Wavelet-Transformation ist mir zudem noch die vage Idee gekommen die Samples mit einer Cosinusfunktion der gewünschten Frequenz zu vergleichen. Dann müsste ich aber um die Abweichung der Frequenz zu bestimmen mehrere Durchgänge durchführen, also quasi blind suchen.
Als Elektroniker ist mir auch noch die Idee gekommen das Signal zu Glätten und dann die Spitzen oder die Nulldurchgänge zu zählen, so wie man eine Frequenzzählung in der Elektronik vorbereitet. Setzt man jedes Sample auf den Durchschnittswert aus den letzten n (n eine passende Zahl um die richtigen Frequenzen herauszufiltern) Samples, dann sollte das Signal geglättet sein (Stichwort Tiefpass). Man könnte diese Glättung auch ausschließlich auf Samples durchführen, die weit genug vom Nullpunkt (Gleichanteil) entfernt liegen und alle anderen Samples ignorieren (Stichwort Kippstufe). Durch eine Kombination aus Glättung und Kippstufe sollten eigentlich alle ungültigen Nulldurchgänge entfernt sein. Zudem könnte man die Messung ausschließlich vom ersten Nulldurchgang eines Frames zum letzten Nulldurchgang des Frames durchführen, um die Unschärfe innerhalb eines Frames zu kappen.
Letztere ist bis jetzt meine bevorzugte Vorgehensweise, da sie für mich dank Vorwissens leicht verständlich ist. Ist diese Methode "Wasserdicht"? sie scheint zumindest wesentlich weniger Rechenintensiv zu sein, als die ganzen mathematischen Verfahren wie Fourier-/Wavelet-/Cosinustransformation.
-
Ich habe jetzt zwar auch nicht die erleuchtende Lösung, aber:
Zum Anderen ist eine Messungenauigkeit von weniger als ein paar Cent nur bei entsprechend hoher Auflösung der Analyse möglich, was den Prozessor zu stark belasten dürfte.
FFTW steht nicht umsonst für "Fastest Fourier Transform in the West". Einfache Audiosignale, egal wie gut aufgelöst, jucken einen Prozessor so gut wie gar nicht.
-
Ich bin mir nicht sicher ob deine letzte Lösung das ist was du suchst, bzw. besser als die FFT-Methode ist.
Das Signal besteht ja nicht nur aus einer Frequenz, sondern aus dem Grundton, den Harmonischen und vielen weiteren Frequenzanteilen. D.h. wenn du einfach so die Durchgänge zählen würdest, hättest du ein Gemisch von all diesen Frequenzen.
Also musst du Filtern und zwar so, dass alle Frequenzen ausser der Grundfrequenz weggeschnitten werden (was du ja auch machen willst).
Filtern kannst du aber genausogut auch im Frequenzbereich, also FFT bilden und alle ungewollten Frequenzanteile auf null setzen und zurück transformieren. Von daher glaube ich nicht, dass du von der Genauigkeit etwas gewinnen kannst. Das heisst natürlich nicht, dass deine Methode schlecht ist, aber du musst aufpassen, dass du einen geeigneten Filter verwendest. Ausserdem: du musst nicht nur alle "zu hohen" Frequenzen rausfiltern, du musst ausserdem dran denken, dass dein Grundton nicht zu stark vom Filter betroffen ist, wenn er weiter von der Referenz weg liegt.Zur Geschwindigkeit, die FFT ist ein schneller Algorithmus (n log n, wenn ich das richtig im Kopf habe). Mit FFTW hast du eine effiziente Implementierung mit der du rumspielen kannst. Ich würde erst mal einige Tests wegen der Geschwindigkeit machen, bevor ich mir was eigenes überlegen würde.
-
@lustig
Warum nicht gleich einen Bandsperre-Filter unter Matlab/Octave entwickeln ?
-
bleibt die Frage: wie findet man den Grundton? nicht ganz trivial, selbst wenn das FFT-Spektrum vorliegt.
Der Grundton muß ja nicht die stärkste Frequenzkomponente im Spektrum sein (bei klassischen Musikinstrumenten kommt vor, daß die 1. Oberwelle stärker als die Grundwelle ist), und auch nicht die tiefste Frequenz (könnte ja Rumpeln, Rauschen oder andere Störgeräusche im Frequenzgemisch sein).
Das Gehör kann den Grundton "dazu-erfinden", selbst wenn die Oberwellen stärker sind als der eigentliche Grundton. Das könnte bei einer "musikalischen" 'Grundtonsuche ruhig berücksichtigt werden.
-
@Bitte ein Bit:
Das hatte ich schon irgendwie im Hinterkopf. Wenn man Matlab/Octave hat kann man das machen. Um das ganze von Hand / ohne Filter Design Toolboxen zu machen braucht man aber Signalverarbeitungsgrundlagen. Ausserdem weiss ich nicht, ob die Filter-Implementation effizienter wäre. Kommt natürlich auf die Filterlänge an.
Was ich eigentlich sagen wollte, war, dass man den Filter nicht als Alternative zur FFT anschauen sollte und hoffen, dass durch den Filter die Qualität besser wird. Und dass man mit Ad-Hoc Lösungen (wie die im ersten Post beschriebene) vorsichtig sein sollte.
-
SeppJ schrieb:
Ich habe jetzt zwar auch nicht die erleuchtende Lösung, aber:
Zum Anderen ist eine Messungenauigkeit von weniger als ein paar Cent nur bei entsprechend hoher Auflösung der Analyse möglich, was den Prozessor zu stark belasten dürfte.
FFTW steht nicht umsonst für "Fastest Fourier Transform in the West". Einfache Audiosignale, egal wie gut aufgelöst, jucken einen Prozessor so gut wie gar nicht.
Ich muss dazu noch Testläufe mit Testsamples durchführen, ob FFTW in Ordnung ist und eventuell mit einer Version der Frequenzzählung vergleichen.
lustig schrieb:
Ich bin mir nicht sicher ob deine letzte Lösung das ist was du suchst, bzw. besser als die FFT-Methode ist.
Das Signal besteht ja nicht nur aus einer Frequenz, sondern aus dem Grundton, den Harmonischen und vielen weiteren Frequenzanteilen. D.h. wenn du einfach so die Durchgänge zählen würdest, hättest du ein Gemisch von all diesen Frequenzen.
Also musst du Filtern und zwar so, dass alle Frequenzen ausser der Grundfrequenz weggeschnitten werden (was du ja auch machen willst).
Filtern kannst du aber genausogut auch im Frequenzbereich, also FFT bilden und alle ungewollten Frequenzanteile auf null setzen und zurück transformieren. Von daher glaube ich nicht, dass du von der Genauigkeit etwas gewinnen kannst. Das heisst natürlich nicht, dass deine Methode schlecht ist, aber du musst aufpassen, dass du einen geeigneten Filter verwendest. Ausserdem: du musst nicht nur alle "zu hohen" Frequenzen rausfiltern, du musst ausserdem dran denken, dass dein Grundton nicht zu stark vom Filter betroffen ist, wenn er weiter von der Referenz weg liegt.!rr!rr_. schrieb:
bleibt die Frage: wie findet man den Grundton? nicht ganz trivial, selbst wenn das FFT-Spektrum vorliegt.
Der Grundton muß ja nicht die stärkste Frequenzkomponente im Spektrum sein (bei klassischen Musikinstrumenten kommt vor, daß die 1. Oberwelle stärker als die Grundwelle ist), und auch nicht die tiefste Frequenz (könnte ja Rumpeln, Rauschen oder andere Störgeräusche im Frequenzgemisch sein).
Das Gehör kann den Grundton "dazu-erfinden", selbst wenn die Oberwellen stärker sind als der eigentliche Grundton. Das könnte bei einer "musikalischen" 'Grundtonsuche ruhig berücksichtigt werden.
Es geht in erster Linie um den Klang von Streichinstrumenten alleine. Und was ich dazu gefunden habe: Der gehörte Ton sollte dort gewöhnlich immer der dominante Ton sein. Der dominante Ton ist, außer beim Flageolettspiel, immer der Grundton. Die Obertöne sind bei diesen Instrumenten zudem sehr harmonisch, so dass bei gegebenem Grundton ihre Frequenz bekannt ist und eine Oktave über dem Grundton der erste Oberton auftritt. Flageolettspiel spielt für mich keine Rolle, genauso wie Akkorde.
Aus diesen Gegebenheiten kann man schon einiges vereinfachen.
lustig schrieb:
Zur Geschwindigkeit, die FFT ist ein schneller Algorithmus (n log n, wenn ich das richtig im Kopf habe). Mit FFTW hast du eine effiziente Implementierung mit der du rumspielen kannst. Ich würde erst mal einige Tests wegen der Geschwindigkeit machen, bevor ich mir was eigenes überlegen würde.
Frequenzzählung hätte, samt Aufbereitung wie vorgeschlagen, lineares Wachstum O(n).
Bitte ein Bit schrieb:
@lustig
Warum nicht gleich einen Bandsperre-Filter unter Matlab/Octave entwickeln ?Wie kann ich denn da eine Bandsperre anwenden? Einen Bandpass könnte ich mir sinnvoll vorstellen.
Ich hoffe ihr nehmt es mir nicht allzu übel, falls ich irgendwo Blödsinn erzähle. Ich lese mich erst seit ein paar Tagen in das Thema ein.
-
Audi O. schrieb:
Es geht in erster Linie um den Klang von Streichinstrumenten alleine. Und was ich dazu gefunden habe: Der gehörte Ton sollte dort gewöhnlich immer der dominante Ton sein.
Schau' mal in "Vorlesungen über Technische Akustik" von L.Cremer (Springer-Verlag 1971) rein, auf Seite 89 oben:
Das Spektrum einer Violine auf der leeren G-Saite (192 Hz).
Der Grundton ist dort nicht etwa lauter, sondern leiser als jede einzelne der ersten 12 Oberwellen (!!)
(ich zähle die Oktav-Oberwelle 2f als 1. Oberwelle, 3f als 2. Oberwelle usw)
heißt:
erst die 13. Oberwelle bei 2688 Hz (wenn ich mich nicht verzählt habe) ist leiser als der Grundton bei 192 Hz ...
So viel zum Thema "der Grundton ist am lautesten" - ist er eben nicht immer.
Das menschliche Gehör ist raffiniert ... erzeugt die Illusion eines Grundtons,
der so (oder so laut) gar nicht da zu sein braucht.
-
Zum Problem des Grundtons finden:
Soweit ich mich erinnere, geben Musikinstrumente Obertöne mit Frequenzen ab, die ganzzahligen Vielfachen der Grundtonfrequenz entsprechen. Wenn du also in deiner Aufnahme (fast) nur das Instrument hast, sollten sich im Spektrum Spektrallinien in konstanten Abständen bilden.
Wenn du dieses Spektrum wiederum fouriertrafost (siehe auch zB Begriff Cepstrum) erhälts du das Spektrum vom Spektrum. Dort sollte sich dann eine spezielle Spektrallinie abbilden, die die Periodizität deines Originalspektrums darstellt. Über diese kannst du den Grundton bestimmen.
-
!rr!rr_. schrieb:
Audi O. schrieb:
Es geht in erster Linie um den Klang von Streichinstrumenten alleine. Und was ich dazu gefunden habe: Der gehörte Ton sollte dort gewöhnlich immer der dominante Ton sein.
Der Grundton ist dort nicht etwa lauter, sondern leiser als jede einzelne der ersten 12 Oberwellen (!!)
(ich zähle die Oktav-Oberwelle 2f als 1. Oberwelle, 3f als 2. Oberwelle usw)
heißt:
erst die 13. Oberwelle bei 2688 Hz (wenn ich mich nicht verzählt habe) ist leiser als der Grundton bei 192 Hz ...
So viel zum Thema "der Grundton ist am lautesten" - ist er eben nicht immer.
Oh ja, habe mir in Audacity gerade mal so ein Signal selbst angeschaut. Das ist sehr ärgerlich, spricht dann aber eher gegen ein Betrachten im Frequenzraum, da im Zeitbereich doch ein deutlicher "Ruck" (vermutlich wenn das Bogenhaar die Saite "verliert") in der gewünschten Frequenz im Signal erkennbar ist, wenn die Saite sich vom Bogenhaar losreißt. außer...
Maxi schrieb:
Zum Problem des Grundtons finden:
Soweit ich mich erinnere, geben Musikinstrumente Obertöne mit Frequenzen ab, die ganzzahligen Vielfachen der Grundtonfrequenz entsprechen. Wenn du also in deiner Aufnahme (fast) nur das Instrument hast, sollten sich im Spektrum Spektrallinien in konstanten Abständen bilden.
Wenn du dieses Spektrum wiederum fouriertrafost (siehe auch zB Begriff Cepstrum) erhälts du das Spektrum vom Spektrum. Dort sollte sich dann eine spezielle Spektrallinie abbilden, die die Periodizität deines Originalspektrums darstellt. Über diese kannst du den Grundton bestimmen.
Ich war zuerst ein wenig verwirrt was aus einer Fouriertransformation einer Fouriertransformation wird, und habe ziemlich doof auf den Monitor geschaut. Aber jetzt hat es geläutet. Wenn ich das Sample vom Zeitbereich in den Frequenzbereich transformiere, ergeben die Spitzen der harmonischen Obertöne ein neues zyklisches Signal im Zyklus der Frequenz des Grundtons. Durch erneute Transformation in den Frequenzbereich (oder durch Messung der Abstände der Spitzen) komme ich an diese Frequenz. Wunderbar!