Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Echtzeit Audio-Filterung (https://www.delphipraxis.net/64894-echtzeit-audio-filterung.html)

Schneider-Huetter 9. Mär 2006 16:42


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!

dizzy 9. Mär 2006 23:49

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

SirThornberry 10. Mär 2006 00:02

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.

Schneider-Huetter 10. Mär 2006 10:22

Re: Echtzeit Audio-Filterung
 
Danke erst mal!
Zitat:

An solch eine Echtzeit wirst du unter Windows, egal wie, nicht ran kommen
Ich hatte ähnliches schon befürchtet :x
Zitat:

Dazu kommt noch, dass sehr viele Filter ja im Frequenzraum arbeiten, aber bei einem einzigen Sample hat du keine Frequenz
Das IIR-Filter speichert immer einen "alten" Abtastwert (bei 1. Ordnung), dadurch der Frequenzbezug.

Das mit dem API-Hook werde ich mir mal ansehen, habe allerdings noch keine Erfahrung damit.

negaH 10. Mär 2006 13:15

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

Schneider-Huetter 10. Mär 2006 15:48

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:
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;
Siehe auch diverse Beispiele aufMusicDSP

negaH 11. Mär 2006 12:35

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 23:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz