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