Optimierungsfrage

Fragen und Antworten, Beispiele

Moderator: herw

Antworten
Benutzeravatar
Triton
synthesist
Beiträge: 58
Registriert: 1. August 2010, 17:22
Wohnort: Gießen
Kontaktdaten:

Optimierungsfrage

Beitrag von Triton »

Hallo. Bin bislang kein Experte, was den Fluss in Cells angeht. Habe einen Biquadfilter in Direktform 1 und 2 implementiert und 1 ist schneller und ich weiß nicht warum. Vielleicht hab ich ja einen elementaren Fehler drin.

Hier ist ein Beispiel, wo die Dinger jeweils zu Tschebyscheff-Bandpässen der Ordnung 24 verbaut sind. Ernüchternd ist der Vergleich zu den eingebauten Macros (auch als 24Pol-Kaskade im Ensemble, jedoch bekomme ich die Umrechnung nicht hin, d.h. die verhalten sich im Beispiel wie hintereinandergeklemmte einfache 1Pole).
Some Filters3Test.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Optimierungsfrage

Beitrag von herw »

Triton hat geschrieben:Hallo. Bin bislang kein Experte, was den Fluss in Cells angeht. Habe einen Biquadfilter in Direktform 1 und 2 implementiert und 1 ist schneller und ich weiß nicht warum. Vielleicht hab ich ja einen elementaren Fehler drin.

Hier ist ein Beispiel, wo die Dinger jeweils zu Tschebyscheff-Bandpässen der Ordnung 24 verbaut sind. Ernüchternd ist der Vergleich zu den eingebauten Macros (auch als 24Pol-Kaskade im Ensemble, jedoch bekomme ich die Umrechnung nicht hin, d.h. die verhalten sich im Beispiel wie hintereinandergeklemmte einfache 1Pole).
Some Filters3Test.zip
Hallo Triton,
leider kann ich dazu inhaltlich gar nichts beitragen, aber für diejenigen, die etwas Hintergrundwissen haben möchten, habe ich mal einen Link gesetzt:
http://www.krucker.ch/Skripten-Uebungen ... Filter.pdf (Seite 3-1). Ob dieser Text gut ist, kann ich nicht beurteilen.

Für mich ist die Abfolge der Lese-Schreib-Vorgänge in den Speicherzellen nicht klar. Bitte bedenke, dass das Auslesen eines Speichermoduls (read-write in core) nichts mit der Reihenfolge der OBC-Anordnung zu tun hat; d.h. das Auslesemodul kann überall in einer OBC-Kette stehen. Müssen dort nicht z^-1 Module eingebaut werden? Leider habe ich keinen systematischen Schimmer in Sachen Filter - sorry.

Übrigens findest Du in Reaktor Spark und Reaktor Prism jede Menge an Filtertypen.
Filter.jpg
Da kann man sich was abkucken.

ciao herw
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
Triton
synthesist
Beiträge: 58
Registriert: 1. August 2010, 17:22
Wohnort: Gießen
Kontaktdaten:

Re: Optimierungsfrage

Beitrag von Triton »

Hi. Ooh. Vielen Dank. Zu den im Spark verbauten Biquad-Filtern, da werd ich mal die Augen offenhalten, die in die Finger zu kriegen. In genau so einen Biquad HP würd ich nämlich gern mal reingucken.

Bin im Moment am mich durchwuseln durch die ganzen Ebenen, also Z- und S-. Die beiden Makros sind von der Funktion her identisch und stellen jeweils den Kern eines Biquads (das ist sozusagen die allgemeinste Form eines 2Pol-Filters) dar. Den einzigen Teil, der mit Audiorate bzw. überhaupt mit Audio durchlaufen wird. Die Direktform 1 berechnet die Formel

y = a0*x + a1*x[-1] + a2*x[-2] + b1*y[-1] + b2*y[-2],

wobei x der Eingabe- und y der Ausgabestream ist und z.B. x[-1] den zwischengespeicherten Eingabewert von einer Runde vorher.
Die ganzen Koeffizienten a0,...,b2 werden dem Ding entsprechend vorbereitet (was mir rechnerisch fürchterliche Kopfschmerzen macht). Bei der Form 1 (richtig geradeaus) braucht man vier Zwischenwerte (2 von In und 2 von Out). Von Form 2 hatte ich mir einen Geschwindigkeitsgewinn versprochen, die wird berechnet nach

w = x + b1*w[-1] + b2*w[-2] und dann
y = a0*w + a1*w[-1] + a2*w[-2].

Kommt tatsächlich das gleiche y raus. Theoretisch und auch in der Cell. Ich dacht nur, man spart zwei Zwischenspeicherungen und würde entsprechend Tempo gewinnen, war aber nicht so. So ein Read-Write-Duo übernimmt die z^-1 - Funktion.

Der Ablauf soll so eine Art Push sein: Wert x kommt oben per In rein, triggert das Auslesen von w[-1], der sich in w[-2] schreibt, aber vorher (wegen der Master-Slave-Anordnung) das alte w[-2] ausliest. Die drei Werte werden dann oben zusammengebaut und (als neues) in w[-1] geschrieben und andererseits mit den alten w[-1] und w[-2] zu y verrechnet. Ich glaub, bei letzterem Schritt läuft irgendwas krumm.

Viele Grüße
Benutzeravatar
herw
moderator
Beiträge: 3122
Registriert: 13. März 2006, 18:28
Wohnort: Dortmund

Re: Optimierungsfrage

Beitrag von herw »

Du kannst sehr leicht in die Filter hineinschauen; Stephan Schmitt hat zu Weihnachten den Vorläufer von Spark (CHA-OSC) in die UL gesetzt:

http://www.native-instruments.com/forum ... p?t=100434

Im 8-Pol-Filter findest Du die entsprechenden Filter; sie sind sehr übersichtlich gestaltet und gut nachzuvollziehen.

ciao herw
Antworten