Hallo Ich möchte die Intensität der verschiedenen Frequenzen in einem Audiosignal darstellen, so wie man es von diversen Audiogeräten kennt. (Wie nennt man sowas eigentlich?) Dargestellt werden sollen etwa 15-30 Frequenzen über den Audiofrequenzbereich (vermutlich in exponentiellen Abständen: 30 Hz, 60 Hz, 120 Hz, ..., 16 KHz), jeweils als Bargraph. Es gibt nun verschiedene Möglichkeiten dies zu implementieren: FFT - Vorteil: Man hat bereits alle Frequenzinformationen, z.B. um einen Mittelwert über benachbarte Frequenzen zu berechnen o.ä. - Nachteil: Um die Frequenzen über 2 Grössenordnungen darstellen zu können, muss man die FFT über 1024 Werte ausrechnen - obwohl man eigentlich nur 15-30 braucht. Korrelation: Man korreliert das einkommende Signal einfach mit den interessierenden Frequenzen. - Vorteil: Man braucht nur die 15-30 Frequenzen, die interessieren. - Nachteil: Ich bin nicht ganz sicher, vermute aber, dass benachbarte Frequenzen dann total untergehen. Im schlimmsten Fall ist also ein Ton zwischen zwei angezeigten Frequenzen und wird so gar nicht erfasst. Bandpässe: Man erstellt für jede Frequenz einen Bandpass und misst die Intensität des herauskommenden Signals. - Vorteile: Vermutlich recht einfach zu implementieren als FIR-Filter, es können mehrere benachbarte Frequenzen in das jeweilige Output-Signal eingehen. Daher tendiere ich eigentlich zur dritten Methode mit den Bandpässen. Kann man das so machen? Oder habe ich etwas entsscheidendes übersehen? Gruss Michael
Du willst dir das Spektrum eines Audiosignals ansehen. Die dinger nennt die das Anzeigen nennt man in der Messtechnik Spectrum Analyzer. In der HiFi Branche wirds gerne als Equalizer bezeichnet. Also ich würds mit FFT machen, alles andere ist im Aufwand zu groß.
Kann ich nur beipflichten. Du benötigst sonst 30 Bandpassfilter mit hoher Ordnung, wenn du das auf einem System implementieren willst, dann ist der Rechenaufwand höher als bei einer FFT.
Bei so einer DFT muss man ja auch nicht unbedingt alle Frequenzen berechnen... http://de.wikipedia.org/wiki/Goertzel-Algorithmus
1 | Pro Berechnung einer Spektralkomponente sind bei dem Goertzel-Algorithmus |
2 | 4N Additionen und 4N Multiplikationen notwendig. Vergleicht man diesen |
3 | Aufwand mit dem Berechnungsaufwand bei der schnellen Fourier-Transformation |
4 | ist der Goertzel-Algorithmus immer dann effizienter, wenn weniger als 5/6 |
5 | log2N Spektralkomponenten berechnet werden sollen. |
@T.H. Super, wollte ich auch schon vorschlagen,nur ist mir der Name nicht mehr eingefallen.
Na ob sich der Aufwand unterscheidet? Bei N-Samples und m-Spektrallinien benötigt der Görzelalgorithmus 4*N*m Multiplikationen und Additionen. Die Güte ist meiner Meinung nach nicht einstellbar. Mit je einem IIR Biquad (Koeffizienten als Bandpass mit hoher Güte ist ebenfalls so genau) fallen 5*N*m Multiplikationen und Additionen an. Vorteil der Biquads ist die freie Wahl der Koeffizienten für verschiedene Güten. Insgesamt würde ich dir zu den IIR-Filter raten. Bei der FFT oder dem Goerzelalgorithmus muss immer ein komplettes Paket von Daten aufeinmal berechnet werden (Frame). Bei langem Paket gewinnst Du in der Frequenzauflösung, verlierst aber die Wiederholrate und umgekehrt. Hinsichtlich des Speicherbedarfs benötigt Goerzel die volle Samplelänge im internen Ram, der IIR jedoch nur 2*N Worte. Beispiel FFT 7 Goerzel: 44100 Hz Abtastrate 1024 Samples -> 44100 2 1024 Samples = 21,5Hz Pakete pro Sekunde 44100 2 1024 Samples = 21,5Hz Frequenzauflösung Bei Erhöhung der Sampleanzahl um den Faktor 4 sinkt deine Widerholrate auf 5Hz aber, deine Frequenzauflösung steigt (dann auch 5Hz).
Habe vergessen das Wesentliche herauszustellen: Mit IIR Filtern bekommst Du einen kontinuierlichen Datenstrom. Die Latenzen in den einzelnen Pfaden hängt von der Gruppenlaufzeit jedes einzelnen Filters ab. Insgesamt kannst Du aber eine viel schnellere Reaktionszeit erreichen. Mich ärgert das bei einigen MediaPlayern, dass die Visualisierung teilweise deutlich hinter dem eigentlichen Musiksignal zurückbleibt. Mir ist das insbesondere deshalb unverständlich, da gerade bei MP3 die Daten schon Paketweise mit ihren Frequenzkomponenten vorliegen und für die Wiedergabe in den Zeitbereich transformiert werden müssen.
Hallo, Ein Lösungsansatz wär sicherlich um auf einzelne Frequenzkomponenten deines Signal zu kommen ... wenn du das Signal in Zeilenform hat bzw. bei mehreren in Matrizenform und einfach einen Spaltenvektor mit gleicher Zeilenanzahl wie die Signallänge darauf multiplizierts. Def von DFT ist ~ sum(0:N-1) sig[n] * e(-j*omega*n); Also generiere dir einen vektor -> spaltvekt= exp(-j*omega*n); wobei n = 1:N-1 geht und omega ergibt sich aus 2*pi*f/fs; Diesen Spaltenvektor multiplizierst du dann auf deinen Signalvektor -> siglv * spaltvekt. Kontrolle: (1,N) * (N,1) = 1,1; also ein Skalar. Hoffe du kannst damit etwas anfangen. lg Peter
@ Peter Das ist ja letzten Endes das, was die FFT, DFT, Goertzel oder Wavelets ausmacht. Das Problem all dieser Ansätze ist, dass man eine Folge von Samples zu einem willkürlichen Zeitpunkt aus dem Datenstrom herausschneitet und alle Frequenzen analysiert. Im Prinzip liefern die Transformationen ein Spektrum zu einem periodischen Zeitsignal - d.h. einem Signal das so aussieht, als würde man die N samples bis ins Unendliche widerholen. Und das leider mit der Unstetigkeit die zwansgläufig zwischen erstem und letztem Sample besteht. Daher sollte man die Zeitdaten vor der Transformation mit einer Fensterfunktion an den Rändern zu null zwingen. Diese Operation benötigen Rechenzeit und Speicher :)
@ Michael Ich weiss jetzt ned wirklich was du damit sagen willst, ich verstehe das du über den Leakageeffekt sprichst aber was ich beschrieben habe ist doch genau die DFT nur für einzelen Stützstellen. Frage ist natürlich hier interessant ob ich hier irgendwie die Signalamplitude rückgewinnen kann ... da ja die DTFT eines rechteckig abgeschnittenen Signals immer eine Sincfunction beiinhaltet also die Signalenergie verschmiert -> DFT tastet diese ja dann ab und ich denke sogar bei passender Fensterlänge (d.h DTFT wird an Nullstellen abgetastet ausser Mainpeak) kommst du nicht direkt auf die Signalamplitude sondern ich denke da muss noch ein Faktor bezüglich des Fensters sein. lg Peter
Bei einer FFT / DFT oder was auch immer von 1024 Samples brauchst Du 1024 Speicherstellen. Ist auf einem DSP interessant, nicht so auf dem PC. Bei 44100 kHz braucht man 1024 / 44100Hz = 23ms um seinen Puffer mit Daten zu füllen, hat aber nur 43Hz Frequenzauflösung. Mit den oben beschrieben 30Hz, 60Hz, etc sind 2048 Samples besser: 2048 / 44100Hz = 46ms Puffer füllen, 21,5Hz Frequenzauflösung Dann kommt die Rechenzeit hinzu, bis man die Transformation (welcher algo auch immer) gerechnet hat. Will man nun noch die Ausschläge im Equalizer noch etws smoother machen, ist man leicht bei einem Delay von 100ms. Und DAS bedeutet, dass die Ausschläge auf dem EQ der Musik deutlich nacheilen. Hast Du schon mal einen Film gesehen, bei dem Bild und Ton 100ms verschoben sind? Mich nervt so etwas tierisch!
In der Praxis legt man an den Eingang des Verstärkers eine Wobbelgenerator der den Übertragungsbereich abdeckt. Am Ausgang des Verstärkers kommt ein Oszilloskop. Mit Hilfe eines zweiten Generators kann man dann Frequenzmarken setzen und die Amplitude am Oszilloskop bei der bestimmten Frequenz ablesen. Es reicht aber auch ein normaler einfacher Tongenerator am Eingang, man stellt die Frequenz ein und liest die Amplitude am Oszi ab. Das geht aber eben nur punktweise, es ist nicht wie beim Wobbeln die ganze Durchlasskurve sichtbar.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.