Analog zu dem bereits bestehenden Thema mit dem Hochpass und
einstellbarer Frequenz hätte ich auch eine Frage:
Ich möchte ein einstellbares gleichmäßiges Filter realisieren, welches
ab einer bestimmten Frequenz einen einstellbare Dämpfung beitzt.
Wie realisiere ich das grundsätzlich?
Ausgehend von einem einfachen IIR-Filter erster Ordnung erhalte Ich eine
wirksame Grenzfrequenz und ab dort einen Niedergang der Amplitude mit
6dB/Oktave bzw. 20dB/Dekade.
Wie erzeuge Ich ein Filter, das z.B. einstellbar 2,4 ... 10 dB pro
Dekade fällt?
Als Beispiel habe ich weisses Rauschen, dass kontinuierlich in Rosa
Rauschen überführt werden soll. Rosa Rauschen ist durch eine
1/f-Kennlinie gekenntzeichnet AFAIK. Das ist mir zu steil für meine
Signale.
Ansatzpunkt zum Einlesen?
Auf DSPrelated und ähnlichen Seiten bin ich leider nicht fündig
geworden.
Danke.
Moin,
So'n Filter wie du da haben willst ist halt was ziemlich exotisches. Da
wird's drauf rauslaufen, sich per Octave, Matlab oder aehnlichem solche
Filter naehrungsweise berechnen zu lassen.
Guck dir zB. mal die Funktionen fir2 und invfreqz bei Octave/Matlab an
und spiel' mit denen.
Gruss
WK
Das rosa Rauschen ist ja auch schon feiner als die normale Filterstufung
aufgelöst. Normale Filter haben pro frequenzbestimmendem Bauteil 6dB pro
Oktave, das rosa Rauschen nur 3dB. Da trickst man auch mit vielen
parallelgeschalteten RC-Gliedern, was etwa Jürgens Multibandfiltern
entsprechen würde.
Mal ne dumme Frage zu Filtern:
Wenn ich ein FIR nehme, dann haben die ja einen Filterkernel. Das ist
quasi eine Signalform. Wenn ich die Grenzfrequenz erhöhe, dann sieht das
rein optisch so aus, als würde diese Signalform "zusammengeschoben" also
die Breite ändert sich.
Kann man so ein variables FIR Filter bauen indem man diese Signalform
mit vielen Punkten ablegt in einem ROM und dann je nach erwünschter
Grenzfrequenz mal mehr und mal weniger äquidistante Punkte daraus als
Koeffizienten für den FIR nimmt? Also man sampelt quasi den Filterkernel
mal langsamer mit mehr Samplepunkten und mal schneller mit weniger
Samplepunkten ab. Diese Samplewerte sind dann die Koeffizienten für das
FIR.
Moin,
Ja. Kann man prinzipiell so machen; gibt aber auch aehnliche
Dreckeffekte, wie wenn man bei Samples einfach ein paar weglaesst, um
sie schneller abzuspielen.
Gruss
WK
Dergute W. schrieb:> Ja. Kann man prinzipiell so machen;
Wow, das war nur eine wilde Vermutung. Cool ... klar, ich würde da den
Kernel mit sehr viel mehr Punkten ablegen als am Ende gebraucht werden.
Z. B. 2k Punkte (passt schön in ein Xilinx BlockRAM) und dann werden
daraus maximal 64 Punkte für das FIR gesampelt.
Naja, man kann auch prinzipiell mit einer Kaffeemaschine Wuerstchen
warmmachen oder mit einem Buegeleisen einen Toast toasten. Hat aber
schon Gruende, warum man das ueblicherweise nicht so macht...
Gruss
WK
Meine Oma hat Würstchen tatsächlich im Wasserkocher erwärmt. Eier auch.
Aber gut, was ist dann eine einfache Methode um ein variables Filter zu
bauen? Die Idee von mir ist sehr einfach in einem FPGA umzusetzen.
Moin,
Gustl B. schrieb:> was ist dann eine einfache Methode um ein variables Filter zu> bauen?
Ich kenn' keine. Analog wie auch digital ist das immer mehr oder weniger
uneinfach.
Was brauchste fuer'n Filter, was muss das denn fuer feste Eigenschaften
haben, und an welchen Eigenschaften willst du variieren koennen?
Gruss
WK
Ne, ich brauche sowas nicht, ist nur ein Gedanke. Hier auf dem
Schreibtisch habe ich einen Mixer von Reloop. Der hat Effekte und kann
auch filtern, das macht der irgendwie digital und ich kann am Drehregler
die Grenzfrequenz einstellen.
Moin,
Das wird dann wohl eher nicht im FPGA laufen, oder wenn, dann halt in
einem FPGA mit einem DSPartigen Design drinnen. Hier hab' ich mal sowas
in primitiv als IIR (FIR mit tiefen Eckfrequenzen werden gerne mal
unangenehm lang) gepostet:
Beitrag "Re: adaptiv IIR Filter Koeffizienten ändern, wie?"
In einem FPGA denkbar waere auch so ein Ansatz, dass man das
Originalsignal auf eine hoehere Abtastfrequenz interpoliert, dann mit
einem sin/cos aus einem NCO mit variabler Frequenz 'raufmischt, durch
ein konstantes, aber steilflankiges Filter schaufelt und mit dem selben
sin/cos wieder runtermischt. Durch die Variation der NCO Frequenz wird
dann der Einfluss des Filters variiert. Konnte Opa schon analog mit zB.
2xECH81 und Quarzfilter aufbauen, waehrend Oma die Wuerstchen
heissmachte. ;-)
Gruss
WK
Gustl B. schrieb:> Wow, das war nur eine wilde Vermutung. Cool
Das kann man ja mit jeder Funktion machen, die irgendeinen Filter
darstellt und wird mitunter auch so gemacht. Bevor aber zu viel Euphorie
ausbricht:
In der Wellensynthese nennt sich das Formant-Shaping und ist bei
Synthies ein ziemlich alter Hut. :-)
Das hat man früher praktisch nur so gemacht, um CPU-Power zu sparen,
wenn man keine Zeit hatte, Filterkoeffizienten direkt zu berechnen. Es
ist im Prinzip dasselbe wie die hier diskutierte Interpolation von
Koeffizienten für Kaiser oder Hamming:
Beitrag "Re: Kaiser-Window Annäherung"
In Software hat es immer limits hinsichtlich der Rechenzeit und
letztlich ist es eine Frage der gewünschten Auflösung:
> ... klar, ich würde da den Kernel mit sehr viel mehr> Punkten ablegen als am Ende gebraucht werden.
Du brauchst nur 2 bis maximal 4 mal "mehr Punkte", wenn du verstanden
hast, wie die maximale Krümmung deiner Funktion aussieht (Stichwort
Oberwelle) und von welcher Qualität der Filter ist, mit dem du diese
Werte interpolierst.
Anzunehmenderweise wird man ein kubisches oder zumindest quadratisches
Filter verwenden, um die Koeffizienten zu interpolieren und selbige über
mindestens 2..4 Endpunkte = 6..12 Primärpunkte erstrecken. Dann wird das
sehr exakt.
Genau das mache ich z.B. in FPGAs indem Tabellen für DDS, Primärklänge
oder gesampeltes Material überabgetastet wird, bevor es in die Faltung
(Ringoszillator, FM-Modulator) kommt:
http://www.96khz.org/htm/realtimeresampler2.htm
Wenn man das voll flexibel machen möchte, sollte man sich aber wirklich
überlegen, ob man nicht die Koeffizienten direkt in Echtzeit berechnet,
zumal das in Prozessoren mit float sogar einfacher ist:
Gustl B. schrieb:> das macht der irgendwie digital und ich kann am Drehregler> die Grenzfrequenz einstellen.
Das dürfte aus performance-Gründen ein IIR sein. Aber auch da müssen die
Koeffizienten in Echtzeit umgerechnet werden, was mathematisch sogar
noch aufwändiger ist, als beim FIR. Zudem ergeben sich infolge der
Verwendung von zeitverschobenen Informationsspeichern quadratische und
kubische Terme in der Filtergleichung und somit z.T. massive
Phasenverschiebungen, wenn man die Parameter ändert. Das muss also
entsprechend hochaufgelöst passieren.
Und genau dafür braucht man regelrecht FPGAs und eine hohe
Abtastfrequenz, wenn es in Echtzeit gehen soll.
Was man dann praktisch auch braucht, ist eine fein aufgelöstete
Parametrierung, damit sich das wie ein analoger Filter verhält. Also
entweder intern alle Änderungen der Knöppe dämpfend interpolieren, oder
besser mit entsprechenden Raten und Auflösung übertragen:
http://www.96khz.org/oldpages/limitsofmidigranularity.htm
Tastet man das Material nicht auf entsprechenden Frequenzen ab, muss man
es smoothen, d.h. von einer Gleichung auf die andere überwechseln. Dazu
rechnet man in der Regel zwei Filter parallel und ändert die Amplituden
+ gfs auch die Phasen der Ausgänge, die sich dann abwechseln. Man kann
auch drei Filter nehmen und sie ein- und ausgleiten lassen, wobei mehr
Zeit zum Laden neuer Koeffs beim Durchfahren besteht.
Die klassische wavetable-Synthese funktioniert nach diesem Prinzip. Da
mitteln sich die Artefakte ein bischen weg, wenn man die Frequenz
verschiebt.
Ich hatte in einer Lautsprecher-Kompensationsanwendung für einen
C-programmierten 56k-DSP mal eine Lösung drin, die unterschiedlich lange
Tabellen verwendet und beim morphen überblendet.
Dann hat man beim reduzieren der Samples nicht smoothen müssen, sondern
konnte ganzzahlige Sprünge machen, was für die App reichte.
Dann gab es immer nur ganzzahlige Abtastungen der Tabelle, die passen
genutzt wurden, z.B. eine mit 64 Einträgen und eine mit 60 später noch
eine mit 63
Die 64er deckte alles mit 2, 4, ... 8, ....... 16, .... 32, 64 ab
Die 60er wurde bei 3, 5, 6, 10, 12, 15, 20, 30,
Die 63 deckt 7, 9 und 21 ab
etc.
Dergute W. schrieb:> Originalsignal auf eine hoehere Abtastfrequenz interpoliert, dann mit> einem sin/cos aus einem NCO mit variabler Frequenz 'raufmischt, durch> ein konstantes, aber steilflankiges Filter schaufelt und mit dem selben> sin/cos wieder runtermischt.
Kommt ein wenig drauf an, wie hoch die benötigten Frequenzen sind im
Bezug auf die Taktfrequenz des FPGAs. Ich fände jetzt die dynamisch
Änderung der Filterkoeffizienten einfacher.
In dem von dir gelinkten Beitragsstrang gibt es im Übrigen noch einen
link auf einen Baustein, der das auch macht:
Beitrag "Re: adaptiv IIR Filter Koeffizienten ändern, wie?">FIR mit tiefen Eckfrequenzen werden gerne mal unangenehm lang
Wenn es ein FIR sein muss, böte sich auch eine HBF-Kaskade an. Die sind
im FPGA auch gut zu machen, wenn man eine iterative pipeline verwendet.
Das klingt alles sehr gut, nur habe ich dafür zu wenig Ahnung. Bin nur
Hobbymensch ...
Von IIR lasse ich die Finger, das sieht in erster Näherung nach Voodoo
aus^^ klar, ist es nicht, aber FIR finde ich da deutlich angenehmer.
Jürgen S. schrieb:> Tastet man das Material nicht auf entsprechenden Frequenzen ab, muss man> es smoothen, d.h. von einer Gleichung auf die andere überwechseln. Dazu> rechnet man in der Regel zwei Filter parallel und ändert die Amplituden> + gfs auch die Phasen der Ausgänge, die sich dann abwechseln. Man kann> auch drei Filter nehmen und sie ein- und ausgleiten lassen, wobei mehr> Zeit zum Laden neuer Koeffs beim Durchfahren besteht.
Das klingt auch spannend.
Ich hätte den Kernel ja abgetastet, mit unterschiedlicher Samplerate je
nach gewünschter Grenzfrequenz, und das eben nicht nur einmal, sondern
laufend. Sprich in dem ersten Abtastdurchlauf fallen eben bestimmte FIR
Koeffizienten raus und direkt danach beginnt der nächste Abtastdurchlauf
und es fallen neue FIR Koeffizenten raus. Die sind zwar nicht sehr
unterschiedlich weil ja die Abtastgeschwindigkeit/Samplerate gleich
bleibt, aber es sind eben doch etwas andere neue Koeffizienten. Dadurch
wechselt das FIR sehr oft die Koeffizienten, die Grenzfrequenz bleibt
grob gleich, das wackelt aber alles minimal hin und her. Aus meiner
Sicht würde das auch dazu führen, dass es im Mittel gut aussieht.
Vielleicht ist das aber auch eine total doofe Idee^^
Gustl B. schrieb:> und das eben nicht nur einmal, sondern> laufend. Sprich in dem ersten Abtastdurchlauf fallen eben bestimmte FIR> Koeffizienten raus und direkt danach beginnt der nächste Abtastdurchlauf> und es fallen neue FIR Koeffizenten raus.
Das gibt Phasensprünge wie bei der DDS mit entsprechenden Auswirkungen.
Klar, wird sich das im Mittel mit Blick auf die Grundfrequenz
wegmitteln. Aber mit Blick auf die dabei erzeugten Störungen sind das
unharmonische Modulationen in der krassesten Form.
Für Audio z.B. vollkommen ungeeignet.
Selbst objektiv in der Stimmung passende Modulationen, ganzzahlige
Phasensprünge und Koeffizientenänderungen, die das Ziel haben gehört zu
werden, müssen rhythmisch sein und ein geringes Ausmaß haben, um
klanglich noch akzeptabel zu sein. Es gibt eigentlich nichts
Unangenehmeres als unkontrollierte Phasensprünge mit dem vollen Pegel.
Schaut dir mal meinen link oben auf die Jitterthematik an, wie das
aussieht.
Dergute W. schrieb:> Johann Wolfgang von Goethe schrieb:>> Erlaubt ist, was gefaellt.
Siehe seine Farbentheorie :-)