AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Echtzeit Audio-Filterung
Thema durchsuchen
Ansicht
Themen-Optionen

Echtzeit Audio-Filterung

Ein Thema von Schneider-Huetter · begonnen am 9. Mär 2006 · letzter Beitrag vom 11. Mär 2006
Antwort Antwort
Schneider-Huetter

Registriert seit: 5. Mär 2004
97 Beiträge
 
Delphi 7 Personal
 
#1

Echtzeit Audio-Filterung

  Alt 9. Mär 2006, 16:42
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

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!
Gruß Schneider-Huetter
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Echtzeit Audio-Filterung

  Alt 9. Mär 2006, 23:49
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Echtzeit Audio-Filterung

  Alt 10. Mär 2006, 00:02
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Schneider-Huetter

Registriert seit: 5. Mär 2004
97 Beiträge
 
Delphi 7 Personal
 
#4

Re: Echtzeit Audio-Filterung

  Alt 10. Mär 2006, 10:22
Danke erst mal!
Zitat:
An solch eine Echtzeit wirst du unter Windows, egal wie, nicht ran kommen
Ich hatte ähnliches schon befürchtet
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.
Gruß Schneider-Huetter
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#5

Re: Echtzeit Audio-Filterung

  Alt 10. Mär 2006, 13:15
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
  Mit Zitat antworten Zitat
Schneider-Huetter

Registriert seit: 5. Mär 2004
97 Beiträge
 
Delphi 7 Personal
 
#6

Re: Echtzeit Audio-Filterung

  Alt 10. Mär 2006, 15:48
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
Gruß Schneider-Huetter
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: Echtzeit Audio-Filterung

  Alt 11. Mär 2006, 12:35
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 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