mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Frequenzgang eines Audiosignals visualisieren


Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ms (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß.

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei so einer DFT muss man ja auch nicht unbedingt alle Frequenzen 
berechnen...

  http://de.wikipedia.org/wiki/Goertzel-Algorithmus

Pro Berechnung einer Spektralkomponente sind bei dem Goertzel-Algorithmus 
4N Additionen und 4N Multiplikationen notwendig. Vergleicht man diesen 
Aufwand mit dem Berechnungsaufwand bei der schnellen Fourier-Transformation 
ist der Goertzel-Algorithmus immer dann effizienter, wenn weniger als 5/6 
log2N Spektralkomponenten berechnet werden sollen.

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@T.H.
Super, wollte ich auch schon vorschlagen,nur ist mir der Name nicht mehr 
eingefallen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter K. (peter26)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Audio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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 :)

Autor: Peter K. (peter26)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Hewlett (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.