Forum: Digitale Signalverarbeitung / DSP / Machine Learning Equalizeranzeige am PC


von Mr. Ask (Gast)


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

von Xeraniad X. (xeraniad)


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.

von dennis (Gast)


Lesenswert?

@Xeraniad X. Super Erklärung ! Vielen Dank & Gruss dennis

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
Noch kein Account? Hier anmelden.