Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung |
Stand: 2012-02-05
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 zirkulär arbeitet. Um „Time Aliasing“ (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 Segement muss in 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 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 nochmal rückwärts. Die Wirkung des Filters in dB ist dann verdoppelt und linearphasig.
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 = verschobenen abgetasteter sinc, also nicht kausal, auch dann nicht, wenn man Latenz erlaubt). Am einfachsten ist die Näherung per Interpolation.
Historisch: Bandschleife mit rotierenden Wiedergabeköpfen; Eventide [„ihventaid“] Harmonizer (70er Jahre; Bezeichnung „Harmonizer“ wegen der Möglichkeit zur Rückkopplung)
SOLA: Synchronous Overlap and Add, auch mal ohne Synchronisation vorgeführt (Demo TimeScaleSOLA.m aus DAFX)
Phasenvocoder: Schätzung der wesentlichen Frequenz in einem FFT-Band per Phasendifferenz zum vorigen Fenster (Demo VX_pitch_bank.m aus DAFX); Sweeps und Vibrato verlagen Phase Lock zwischen benachbarten FFT-Bins
Tonhöhenkorrektur
(ohne Tonhöhenerkennung, allerdings werden fälschlicherweise
auch die Obertöne auf die chromatische Skala korrigiert) und
andere Effekte mit dem Phasenvocoder:
fOld
= max(1e-20,delta_phi/2/pi/n1*FS);
fNew =
440*2.^(round(12*log2(fOld/440))/12);
delta_psi = 2*pi*fNew/FS;
Formanterhaltung, indem man dem Ausgangssignal die grobe Form des Eingangsspektrums wieder aufprägt (Demo UX_pitch_pv_move.m aus DAFX)
Transientenerhaltung? (Demo UX_voiced.m aus DAFX)
Phasenkohärenz bei Mehrkanal?
zplane élastique (Ableton, Steinberg, Native usw.)
Phasenvocoder: IRCAM AudioSculpt, Beispiele
Sinusförmige Wellen: SPEAR
Celemony Melodyne
Prosoniq sonicWORX Isolate, Demo (mehr Handarbeit als Melodyne)
Einfachste Variante: N Mono-Audiospuren per Panpot auf M >= N Ausgangskanäle gemischt (keine Verzögerung, keine Filterung, kein Hall). Im Prinzip mit fester Mischung (ggf. phasenverkehrt) der Ausgangskanäle zu lösen. Bestimmung zum Beispiel über ICA (Independent Component Analysis): Man versucht, Anteile zu finden, die stochastisch möglichst unabhängig voneinander sind.
Schwierigere Variante: N Mono-Audiospuren per Panpot auf Stereo gemischt. Beispiel für einen Algorithmus: ADRess (Video, Beispiele).
Schwierigste Variante: N Klangerzeuger im realen Raum mit M << N Mikrophonen aufgenommen. Es kann nicht mehr darum gehen, die N Originalsignale zu berechnen (Was sollte auch das Originalsignal einer Aufnahme sein?), sondern N Signale zu errechnen, in denen jeweils möglichst nur eine Quelle zu hören ist (Hall? Filter?). Dieses Problem zu lösen verlangt wahrscheinlich eine Simulation der Vorgänge im Hirn (CASA, Computational Auditory Scene Analysis), insbesondere eine große Wissensbasis über Klänge.
Permutation als eines von vielen Problemen: Wenn man es tatsächlich schafft, M Audiosignale zu extrahieren, ist noch nicht klar, in welcher Reihenfolge das die gesuchten Ergebnisse sind. Abhilfe möglich, indem man Charakteristika vorgibt, z.B. dass das erste extrahierte Signal die Bassline sein soll. Schwieriger wird es noch bei einer Zerlegung, die im Frequenzraum arbeitet: Welche frequenzmäßig verschiedenen Teile gehören zum selben Signal?
Audionamix UnMixingStation (Demo)
Regler/Parameteränderungen ohne Zipper Noise: Parameterwerte filtern/interpolieren!
Bypass und alle anderen Umschaltungen ohne Knacken: Crossfade!
Bypass mit exakt gleicher Lautstärke: Lauter klingt besser!
Aliasing vermeiden, kritisch bei synthetischen Wellenformen, bei Verzerrer-Effekten und bei Filtern mit hoher Resonanz.
Die gemeldete Latenz einhalten, auch bei Bypass.
Bedienoberfläche läuft in eigenem Thread. Die Audio-Verarbeitung eines einzelnen Plug-ins auf mehrere Threads zu verteilen, ist wahrscheinlich keine gute Idee. Besser kann der Host sehen, welche Plug-ins unabhängig voneinander laufen können und die dann mit mehr Vorausschau auf Threads verteilen.