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.