Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung | Blog RSS

Plug-in-Interna

Stand: 2011-01-26

VST von innen

Algorithmische Tricks

Schnelle Faltung, Faltung ohne Latenz. Insbesondere für den Faltunghall (convolution reverb) sind lange Signale (Länge N) mit langen Impulsantworten (einfachheitshalber hier auch als Länge N) zu falten. Naiv mit einer Summe von Produkten ist der Zeitaufwand O(N²). Besser mit FFT: 2*O(N Log N) für die Fourieranalyse, O(N) für das Produkt der Fourier-Transformierten, O(N Log N) für die Fouriersynthese. Vorsicht aber mit der FFT, weil die zirkular arbeitet. Um „Time Aliasing“ (z.B. Ende des Stücks am Anfang hörbar) zu vermeiden, muss genug Leerraum (Nullen) gelassen werden. Das kann man im Prinzip auch in Echtzeit machen (blockweise überlappende Faltung), hat aber massiv effektbedingte Latenz, weil immer ein kompletter FFT-Block als Eingangssignal vorliegen muss, bevor man rechnen kann. Im Prinzip latenzfreie Lösung: segmentierte Faltung (David McGrath, US-Patent 5.502.747 von 1996). Man teilt die Impulsantwort in Segmente. Nur das erste Segment muss sofort verarbeitet werden, mit einem relativ kurzen FIR-Filter. Die hinteren Segmente können für entsprechend große Teile des Originalsignals effizient per FFT gebündelt berechnet werden. Naheliegend ist, eine Kaskade von immer längeren Segmenten zu bilden.

Linearphasige Filter. In Echtzeit nicht ohne Latenz. Denn: Linearphasige Übertragungsfunktion H(omega) = r(omega)*exp(i omega T) mit reellem r und reellem T. Mit Fouriersynthese Impulsantwort h an der Zeit t-T und an der Zeit -t-T bestimmen. Man findet, dass diese beiden Werte für alle t gleich sein müssen (komplex Konjugieren!). Also ist die Impulsantwort symmetrisch um den Zeitpunkt T. Also im Echtzeitbetrieb Verzögerung um T. In Echtzeit ist T <= 0 nicht zu haben, weil die Impulsantwort für positive Zeiten null sein muss (Kausalität). Ebenfalls sieht man, dass ein echtzeitfähiges, exakt linearphasiges Filter nur FIR sein kann. Offline sind T=0 und IIR dagegen sehr einfach: Man lässt dasselbe Signal einmal vorwärts durch das Filter laufen und dann das gefilterte Signal noch einmal rückwärts. Die Wirkung des Filters in dB ist dann verdoppelt und linearphasig ohne Verzögerung.

Fractional Delay. Zum Beispiel für einen Chorus-Effekt oder das Physical Modeling einer Posaune benötigt man eine Verzögerung, die stufenlos modulierbar ist. Ein einfacher Zwischenpuffer kann aber nur auf eine ganze Zahl Samples gestellt werden. Ein perfektes Fractional Delay Filter lässt sich nicht in Echtzeit realisieren (Impulsantwort = verschoben abgetasteter sinc, also nicht kausal, auch nicht mit Latenz). Am einfachsten ist die Näherung mit einem Lagrange-Interpolator. Der Preis dafür ist ein Höhenabfall im Frequenzgang. Will man direkt ein Steuersignal für die Verzögerung haben, bietet sich an, es in einer Farrow-Struktur zu realisieren.

Gute Sitten

Nachtrag: Details zur blockweisen Verarbeitung

ASIO: Ringpuffer für Ein- und Ausgabe sind starr verkoppelt und haben nur zwei Slots (double buffering). Beispielprogramm. Latenzmessung.

Samplitude Hybrid Audio Engine: Der Aufwand für einen Audioalgorithmus ist typischerweise proportional zur Zahl der Samples. Der Aufwand für das Organisatorische (Verabeitungsfunktion aufrufen, Werte übergeben) ist dagegen typischerweise proportionale zur Zahl der Blöcke. Also sind längere Blöcke effizienter, denn bei gleicher Zahl an Samples braucht man dann weniger Blöcke. Aber längere Blöcke verlängern die Latenz. Idee: Spuren, die bereits aufgezeichnet sind, latenzkompensieren und mit großen Blöcken verarbeiten; Echtzeitsignale mit kurzen Blöcken verarbeiten. Demo mit Samplitude.