digitale Filter
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
digitale Filter
Hi.
Ich möchte eine ganze Menge von wav-Dateien nachbearbeiten.
Ich möchte ein Tiefpass (am besten vermutlich 2-pol Bessel, 2 Pol Gauss wäre aber wohl auch OK, über andere Varianten, z.B. "State Variable" oder "Finite Impulse" könnte man nachdenken) darauf anwenden. Dabei soll die Eckfrequenz ständig variiert werden (in Abhängigkeit zur Sample-Nummer und/oder zur Amplitude). Nach der Rechnung soll das Ergebnis wieder in einer wav-Datei abgespeichert werden.
Verarbeitungsteil also:
- Input zwei Arrays: InSample und Eckfrequenz
- Output ein Array: OutSample
Kennt jemand eine leicht verständliche Anleitung für so einen Algorithmus ?
(Ein "State Variable" Filter ist mathematisch leicht zu beschreiben (besteht nur aus zwei Integralen mit Rückkopplungen) und vermutlich entsprechend leicht zu programmieren. Ob das aber die ideale Lösung ist, kann ich nicht beurteilen. "Finite Impulse" soll Stabilitäts-Vorteile haben, ist vielleicht aber klanglich schlecht und die Theorie dahinter anscheinend ganz schön dick.)
Gruß und Dank
Ich möchte eine ganze Menge von wav-Dateien nachbearbeiten.
Ich möchte ein Tiefpass (am besten vermutlich 2-pol Bessel, 2 Pol Gauss wäre aber wohl auch OK, über andere Varianten, z.B. "State Variable" oder "Finite Impulse" könnte man nachdenken) darauf anwenden. Dabei soll die Eckfrequenz ständig variiert werden (in Abhängigkeit zur Sample-Nummer und/oder zur Amplitude). Nach der Rechnung soll das Ergebnis wieder in einer wav-Datei abgespeichert werden.
Verarbeitungsteil also:
- Input zwei Arrays: InSample und Eckfrequenz
- Output ein Array: OutSample
Kennt jemand eine leicht verständliche Anleitung für so einen Algorithmus ?
(Ein "State Variable" Filter ist mathematisch leicht zu beschreiben (besteht nur aus zwei Integralen mit Rückkopplungen) und vermutlich entsprechend leicht zu programmieren. Ob das aber die ideale Lösung ist, kann ich nicht beurteilen. "Finite Impulse" soll Stabilitäts-Vorteile haben, ist vielleicht aber klanglich schlecht und die Theorie dahinter anscheinend ganz schön dick.)
Gruß und Dank
-
- Beiträge: 8
- Registriert: Do 26. Apr 2007, 02:04
- OS, Lazarus, FPC: Debian
- CPU-Target: 32/64
- Wohnort: 23566 Lübeck
Re: digitale Filter
Moin, mal abgesehen von entsprechender Lektüre würde ich den ersten Blick mal auf http://www.musicdsp.org/ richten, zwar eher die Praxis dort fündige Source Codes anzuwenden, anstatt sich tiefer mit der Theorie auseinanderzusetzen, jedoch unter gewisser Prämisse ebenso zielführend;)mschnell hat geschrieben:Hi.
[...]
Kennt jemand eine leicht verständliche Anleitung für so einen Algorithmus ?
(Ein "State Variable" Filter ist mathematisch leicht zu beschreiben (besteht nur aus zwei Integralen mit Rückkopplungen) und vermutlich entsprechend leicht zu programmieren. Ob das aber die ideale Lösung ist, kann ich nicht beurteilen. "Finite Impulse" soll Stabilitäts-Vorteile haben, ist vielleicht aber klanglich schlecht und die Theorie dahinter anscheinend ganz schön dick.)
Gruß und Dank
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: digitale Filter
MSEgui tsigfilter bietet diese Funktion. Dabei werden die Filter-Koeffizienten für das 2-polige IIR-Filter über die bilineare Z-Transformation aus den Grenzfrequenz- und Güte-Signalen gewonnen. Für einpoligen Hoch- und Tiefpass ist auch impulsinvariant möglich.
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: digitale Filter
ungetestet: http://forum.lazarus.freepascal.org/ind ... #msg126256
der Klassiker: http://www.nr.com/ (es gibt auch Pascal Code dazu)
der Klassiker: http://www.nr.com/ (es gibt auch Pascal Code dazu)
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: digitale Filter
Großartig !mse hat geschrieben:MSEgui tsigfilter bietet diese Funktion.
Ich habe die unit msefilter auch sofort gefunden.
Leider bindet die Unit alles mögliche ein, das für das eigentliche mathematische Verfahren nicht notwendig ist und lässt sich deshalb nur in einer kompletten MSEGUI Umgebung testen.

-Michael
Zuletzt geändert von mschnell am Fr 24. Jan 2014, 23:18, insgesamt 1-mal geändert.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: digitale Filter
Sieht recht gut aus.Scotty hat geschrieben:ungetestet: http://forum.lazarus.freepascal.org/ind ... #msg126256
Ich glaube allerdings kaum, dass es "out of the box" möglich ist mit jedem Sample die Grenzfrequenz des Filters zu variieren.
-Michael
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: digitale Filter
Vor vielen Jahren habe ich einen FFT-Filter programmiert, der das bei NR beschriebene Overlap/Save-Verfahren benutzt [1]. Der Grundgedanke besteht darin, den Input in kurze Segmente zu zerlegen und diese zu transformieren. Der Clue beim Überlappen ist, die Eigenschwingungen zu Beginn und Ende einfach nicht in den Output zu übernehmen. Also z.B. 512 Werte filtern, aber die ersten und letzten 128 des Ergebnis wegzuwerfen. Natürlich wird das Segment auch nur um 256 Werte verschoben. (Der allererste und -letzte Bereich wird typischerweise um sich selbst gespiegelt.)mschnell hat geschrieben:Ich glaube allerdings kaum, dass es "out of the box" möglich ist mit jedem Sample die Grenzfrequenz des Filters zu variieren.
Ähnlich könnte die Berechnung auch bei dir aussehen, wobei deine FIR-Parameter dann halt mit jedem Segment variieren. Das wird garantiert keine Bibliothek out-of-the-box machen - und ein wenig willst du ja noch selbst programmieren.

[1] http://de.wikipedia.org/wiki/Overlap-Save-Verfahren
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: digitale Filter
Die Filterfrequenz dynamisch zu verschieben ist ein typisches bei Synthesizern verwendetes Verfahren ("Hüllkurve"). Ich will jetzt aber nicht ein solches dezidiertes Audio-Werkzeug (wie SynthMaker) einsetzen.Scotty hat geschrieben:Ähnlich könnte die Berechnung auch bei dir aussehen, wobei deine FIR-Parameter dann halt mit jedem Segment variieren. Das wird garantiert keine Bibliothek out-of-the-box machen - und ein wenig willst du ja noch selbst programmieren.![]()
Also werde ich vermutlich was mit dem "Variable State Filter" machen. Der ist mathematisch leicht durchaubar, "Infinite" und ziemlich unkritisch (ich brauche ja keine hohe Güte). Die Steilheit des Tiefpasses im Übergangsbereich ist zwar nicht toll, sollte für mich aber ausreichen.
FFT brauct zwar weniger Rechenzeit als ein IIR Filter, das ist hier aber nicht kritisch.
-Michael