![]() |
Echtzeit Audio-Filterung
Hallo zusammen!
Ich habe folgendes Problem: Ich würde gerne das Summensignal (oder auch nur das Wavesignal) des Windows-Mixers abfangen und dann in Echtzeit (also während eines Abtastschritts) mit einem IIR-Filter bearbeiten. Das eigentliche Problem ist nun nicht das Filter, sondern wie ich an die Wave-Daten herankomme. Mein erster Ansatz war es, das Signal mit waveIn (WinAPI) bei 8Bit und 44,1 kHz in einen nur 1 Byte großen Puffer einzulesen und dann in der CallBack-Funktion zu filtern. Es hat sich jedoch gezeigt, dass die Callback-Funktion - warum auch immer - nur 100 mal pro Sekunde aufgerufen wird (mit Timer gemessen) - anstatt 44100 mal. D.h. also, dass ich bei 44,1kHz mindestens einen 410 Byte großen Puffer verwenden müsste ?? Das hat dann aber nicht mehr viel mit Echtzeit zu tun :gruebel: Kennt jemand von euch eine Möglichkeit, wie man schneller an die Daten kommen kann? Schön wäre es auch, wenn man die gefilterten Daten anstatt der Original-Daten an die Soundkarte schicken könnte (umschaltbar), wäre aber nur ein Zusatzfeature. Im Voraus schon mal Danke! |
Re: Echtzeit Audio-Filterung
An solch eine Echtzeit wirst du unter Windows, egal wie, nicht ran kommen. Selbst die großen (und teuren) Audioprogramme haben eine gewisse Latenz, die der Länge des Puffers entspricht. Dazu kommt noch, dass sehr viele Filter ja im Frequenzraum arbeiten, aber bei einem einzigen Sample hat du keine Frequenz ;). Es ist sicherlich anstrebsam den Puffer möglichst klein zu halten, und mit 410 Bytes bist du schon sehr sehr gut bedient. Rechne mal aus wie klein die Verzögerung dabei wäre. Zur Sicherheit würde ich den Puffer jedoch mindestens doppelt so groß machen, da 100 Mal pro Sekunde noch lang nicht garantiert, dass der Abstand zwischen je 2 Aufrufen immer identisch ist. Windows ist eben kein Realtime-OS, und kann dir das also so nicht garantieren. Ganz im Gegenteil - es ist sehr wahrscheinlich, dass du ständig unterschiedlich weit gefüllte Puffer bekommst.
Gruss, Fabian |
Re: Echtzeit Audio-Filterung
Wenn das ganze über WaveOut läuft könntest du einen Api-Hook auf WaveOutWrite (oder so ähnlich) setzen bzw. auf die Funktion PrepareHeader (oder so ähnlich). Dann könntest du die Daten bevor sie an die Soundkarte geschickt werden filtern.
|
Re: Echtzeit Audio-Filterung
Danke erst mal!
Zitat:
Zitat:
Das mit dem API-Hook werde ich mir mal ansehen, habe allerdings noch keine Erfahrung damit. |
Re: Echtzeit Audio-Filterung
Dein IIR Filter selber verhindert schonmal "Echtzeit". So wie ich IIR/FIR Filter verstanden habe arbeiten diese selber mit einem "Buffer" von mehreren Samples. Meistens 32 bis 256 Samples. D.h. also das der IIR Filter selber erst nach 32-256 Samples das Outputsample zur Verfügung stellen kann.
Gruß Hagen |
Re: Echtzeit Audio-Filterung
Das IIR-Filter benötigt bei 1. Ordnung nur jeweils ein "altes" Ein- und Ausgabe-Sample (bei 2. Ordnung zwei u.s.w.).
Delphi-Quellcode:
Siehe auch diverse Beispiele auf
var
Output : SmallInt = 0; oldOutput : SmallInt = 0; oldInput : SmallInt = 0; Function SinglePoleIIRLowPass( Input : SmallInt ) : Smallint; Const // Filter-Koeffizienten b0 = 0.15; b1 = 0.93; a1 = 0.85; Begin Output := round( b0*Input + b1*oldInput + a1*oldOutput ); oldOutput := Output; oldInput := Input; Result := Output; End; ![]() |
Re: Echtzeit Audio-Filterung
Mal ehrlich, hast du mal den Frequenzgang eines IIR/FIRs 1. Ordung angeschaut ? Dann kann man gleich auf den Filter verzichten. Die Filter die ich so benutzt habe waren minimal 64'ter Ordnung bzw weit größer.
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz