www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Equalizeranzeige am PC


Autor: Mr. Ask (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mir gerade eine Equalizeranzeige für das Eingangssignal 
Mikrofoneingangs des PCs programmieren. Das Mikrofonsignal kann ich 
bereits alle 100ms in ein float-Array einlesen. Dabei erhalte ich 
jedesmal 4410 Werte. Was also einer Abtastrate von 44100Hz entspricht. 
Soweit, so gut... nun möchte ich das Sigal in 10 Kanäle aufteilen und 
die Lautstärke dieser Kanäle nebeneinander grafisch darstellen (wie im 
Winamp):
Die Grenzfrequenzen der Känäle sollen folgende sein.
32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 und 16384

Nun habe ich erste Tests gemacht und über dieses Signal mal eine FFT 
drüberlaufen lassen, was auch funktioniert hat. Für die Anzeige muss ich 
ja aber wieder aus dem Frequenzbereich in den Zeitbereich wechseln. 
Meine Frage ist nun folgende: Kann ich nun einfach das FFT Signal in 10 
Teile splitten in welchen jeweils immer die Frequenzen zwischen den 
nächsten beiden Grenzfrequenzen vorhanden sind und die anderen 
Frequenzwerte (Real- und Imaginärteil) immer 0 setzen? Oder soll ich 
einen anderen Ansatz wählen und über das Mikrofonsignal 10 IIR Filter 
(immer mit der nächsten Grenzfrequenz) drüberlaufen lassen und so immer 
einen Teil des Signals wegnehmen?

Übrigens, das Ergebnis muss nicht sehr genau sein, da es sich nur um 
eine Anzeige handelt. Das Signal soll nicht mehr für weitere 
Berechnungen verwendet werden, aber natürlich wäre es schön, wenn die 
Anzeige schon etwas mit dem Signal am Mikrofoneingang zu tun hat ;-)

Dankeschön
Flo

Autor: Xeraniad X. (xeraniad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der folgende Vorschlag beschreibt eine reine Software-Lösung und gilt 
für einen Kanal.
Für Mehrkanalbetrieb kann alles entsprechend mehrfach aufgebaut werden.
Es ist keine Rücktransformation erforderlich.
Die Lösung ist exakt, aber nicht besonders komfortabel: bis zur ersten 
Anzeige werden 1.5 s Audio benötigt.
Es steht ein Ringpuffer zur Aufnahme von z. B. 15 Paketen à 4410 
Abtastwerte zur Verfügung.
Alle 100 ms trifft ein Paket mit 4410 Abtastwerten ein.
Falls der Ringpuffer noch nicht voll ist, wird das Paket darin 
gespeichert, sonst (nach 1½s), wird das älteste Paket mit dem neu 
eingetroffenen überschrieben.
Falls der Ringpuffer jetzt voll ist, stehen 15·4410 = 66150 Abtastwerte 
zur Verfügung.
Hiervon können die neuesten N = 2¹⁶ Abtastwerte als Realteile in ein 
Array c[65536] komplexer Zahlen geschrieben werden (die Imaginärteile 
werden mit 0.0 initialisiert).
Die 2¹⁶ Abtastwerte entsprechen der Periode T₀ = 65536÷44100 s und damit 
einer Frequenzauflösung von f₀ = 1÷T₀ = 44100÷65536 Hz ≈ 0.6729... Hz.
Die Zweierpotenz 2¹⁶ ermöglicht die Implementierung einer einfachen und 
effizienten FFT.
Nach Durchführung der FFT enthält c[] die komplexen Koeffizienten.
Den Gleich-Anteil c₀ ist reell, c₁ ist der komplexe Koeffizient für die 
Grundfrequenz f₀, c[k] ist der komplexe Koeffizient für die Frequenz 
k·f₀ und c[½·N] ist der (reelle) Koeffizient für die Nyquist-Frequenz, 
hier 2¹⁵·f₀ = 22050 Hz.
Für 1 ≤ k < ½·N gilt c[N-k] = conj(c[k]). Diese Koeffizienten c[k] mit 
½·N < k < N  entsprechen negativen Frequenzen und werden nicht 
verwendet.
c₀² ist ein Mass für die Leistung des Gleich"spannungs"anteils.
Für 0 < k ≤ ½·N ist ½·|c[k]|² = ½·{Re²(c[k])+Im²(c[k])} proportional zu 
der Leistung des Schwingungsanteils mit Frequenz k·f₀.
Die in c[k] enthaltene Phasen-Information arg(c[k]) = atan2 {Im(c[k]), 
Re(c[k])} wird hier nicht verwendet.
Die Frequenz bzw. der Frequenz-Index k wird einem der 10 definierten 
Histogramm-Balken mit Index i ∈ {0..9} zugeordnet und die Leistung in 
einem Array p[10] aufsummiert.
Anschliessend können die Leistungs-Summen p[i] logarithmiert, skaliert 
und in Histogramm-Darstellung als Balken graphisch dargestellt werden.

Autor: dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Xeraniad X. Super Erklärung ! Vielen Dank & Gruss dennis

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.