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