TUTORIAL COMPLEX AUDIO

ELECTRIC OPRPHEUS ACADEMY
TUTORIAL COMPLEX AUDIO

Motto: "Der Musiker ist dem Mathematiklehrer entlaufen", sagt Adorno. Kann sein, dann aber bitte auch dem Musiklehrer, sag ich.

Vorbemerkung

An kaum einem anderen mathematischen Thema scheiden sich die Geister so sehr, wie an dem der complexen Zahlen. Die Menschheit scheint in zwei Teile gespalten: die einen, die das verstehen; die anderen, die das nie verstehen werden (oder wollen).
Die sensiblen Musiker/innen, verschont man gerne mit solchen Sachen (siehe Motto). Dennoch meine ich: Wer sich unter A,B,C Töne vorstellen kann, sollte es ohne grössere Schwierigkeit auch unter 1,2,3 können (noch besser: unter 0,1,2). Und wer in der Lage ist, den Flächeninhalt seines Wohnzimmers zu berechnen, um den Quadratmeterpreis der Miete zu überprüfen, sollte auch in der Lage sein, zu verstehen, was complexe Zahlen sind ...

Einleitung

Jede reelle Zahl lässt sich bekanntlich als Punkt auf einer Geraden darstellen, 0 in der Mitte, links die negativen Zahlen, rechts die positiven. Genauso lässt sich jede complexe Zahl als Punkt auf einer Fläche darstellen, 0 in der Mitte, waagrecht der 'reelle' Anteil (x-Achse), senkrecht der 'imaginäre' Anteil (y-Achse). Mehr ist nicht dran ! - wiewohl die algebraischen Implikationen, die sich daraus ergeben, Generationen von Mathematikern beschäftigt haben.
Carl Friedrich Gauss (1777-1855), der an der Entwicklung der complexen Algebra massgeblich beteiligt war, bemerkte einmal: die complexen Zahlen seien vielleicht bloss deshalb so schwer zu verstehen, weil ihre Benennungen ('complex', 'reell', 'imaginär') so unglücklich gewählt sind.

C.F.Gauss (Wiki Commons)

Wie wahr ! Die 'imaginären' Zahlen sind nicht minder real wie die 'reellen' ! Dennoch behalte ich die Bezeichnungen bei, weil sie sich weltweit eingebürgert haben. (Auf Deutsch schreibe ich aber complex stets mit 'c', wenn das Zahlenformat gemeint ist).

Nun könnte man einwenden: Das ist schon wieder so eine Erfindung weltfremder Akademiker, mit der man Schüler quält, wie Kinder aus gutem Haus, die gar nicht Klavier spielen wollen, mit Beethoven und Chopin.
Weit gefehlt ! - Wenn man Dinge des Alltags erklären oder beschreiben will, begegnet einem die complexe Darstellung auf Schritt und Tritt.
[Eigentlich erstaunlich, dass die grosse Finanzwelt das noch nicht entdeckt hat. Andererseits aber auch gut so. Möge sie doch bis zu ihrem hoffentlich baldigen Ende ihr Adam Riese-Alphabet zelebrieren.]
Nehmen wir ein einfaches Pendel: Es wird einmal in Bewegung gesetzt und ist ab da sich selbst überlassen. Seine Energie nimmt von der Initiierung an kontinuierlich ab. Die Art der Energie wechselt dabei aber ständig. Hat das Pendel seinen tiefsten Punkt erreicht, dann ist seine 'potentielle' Energie (die der Lage) gleich 0, während seine 'kinetische' Energie (die der Bewegung) ein Maximum aufweist, denn das ist der Moment, in dem seine Geschwindigkeit am grössten ist. Ist das Pendel an einem Umkehrpunkt angelangt, dann ist seine kinetische Energie gleich 0 (die Geschwindigkeit kehrt sich in diesem Moment von einer Richtung in die andere um), dafür zeigt aber die potentielle Energie ein Maximum.
Die Energie selber, ist, wie gesagt, konstant (oder nimmt von einem Moment zum anderen geringfügig ab) - ihre Richtung ändert sich zyklisch ! Complex.

Auch in elektrischen Netzwerken gibt es solche Vorgänge: der Wechsel der Energie in einem Schwingkreis, einem Oszillator, einem Filter. Kein geringerer als Charles Proteus Steinmetz (1865-1923) hat die complexe Anschauung in die Elektrotechnik eingeführt. Über den genialen Elektroingenieur sind viele Anekdoten im Umlauf (man kann sie im Netz nachlesen). Hier ein rares Foto: Einstein, Tesla, Steinmetz (rechts vorne):

(Quelle: Wiki Commons)

Zur Beschreibung einer complexen Zahl benötigen wir demnach zwei Zahlenwerte, die Koordinaten des Zahlenpunktes in der Ebene. Rechtwinkelige Koordinaten (auch 'karthesische' Koordinaten, oder 'xy-Darstellung').
Alternativ dazu gibt es die Darstellung in Polarkoordinaten ('rphi-Darstellung') durch den Abstand des Punktes vom Nullpunkt (Radius) und einen Winkel (Phase).
Letztere ist gerade für die musikalische Anwendung von immenser Bedeutung. Somit wären wir endlich beim Thema.

complex audio

Wir wissen was ein Sinuston ist, wir wissen, wie eine Sinusschwingung aussieht. Ganz einfach, weil uns das vertraut ist. Nichtsdestoweniger eine ziemlich komplizierte Wellenform. Man versuche einmal so eine Welle händisch zu zeichnen, oder mit Schablonen, wie die Illustratoren der alten Akustiklehrbücher, die nicht selten unbeholfene Kurven aus Halbkreisen zusammengebastelt haben !

Warum ist gerade diese komplizierte Wellenform für uns gehörsmässig die einfachste Schwingungsform, die es gibt ? - warum nicht ein Rechteck, ein Dreieck, oder sonst etwas grafisch Einfacheres ??
Ganz einfach, weil sie auf die elementarste geschlossene Bewegung in der Ebene zurückzuführen ist: eine Kreisbewegung mit konstanter Geschwindigkeit.
Ihr Abstand zum Nullpunkt, ihr Radius, ist in jedem Moment konstant (wir nehmen ihn als Lautstärke wahr); ihre Drehgeschwindigkeit ist in jedem Moment konstant (wir hören sie als Frequenz).

Was aber, wenn die Drehung in die andere Richtung geht ? - Hört sich genauso an ! Auch die Projektion auf die eine Achse ist genauso wie vorher, die Projektion auf die andere Achse ist invers (umgepolt). Man spricht daher auch von 'positiven' und 'negativen' Frequenzen, die gehörsmässig zunächst tatsächlich nicht unterscheidbar sind.
Wahrnehmbare Phänomene entstehen erst, wenn sich solche positiven und negativen Frequenzen überlagern. Dann haben wir es nämlich mit Verstärkungen und Auslöschungen in verschiedenen Achsen der Ebene zu tun. (Zweikanal-stereo lässt sich so deuten, wie wir später sehen werden).

Umgekehrt betrachtet kann man sagen:
Jedes mono-Signal lässt sich als Kombination von links- und rechtsdrehenden Frequenzen mit der jeweils halben Amplitude interpretieren.
In der einen Achse ergänzen sie sich zu dem vorgegebenen Verlauf, in der anderen Achse löschen sie sich perfekt aus.

* * *

An einem Beispiel:

sfload monosound.wav
view.
FFT
opt
view.

Ein mono-sound im zeitlichen Verlauf (Buffer size=18, 262144 samples, ca. 5.4 Sekunden):



Die Fouriertransformation davon:



Waren es zuvor 1/4 Million samples in der Zeitebene, so haben wir nun 1/4 Million Frequenzen im Spektrum (lineare Darstellung) - davon eine Hälfte linksdrehend , die andere Hälfte rechtsdrehend.
Ganz links bei 0hz beginnend bis zur Mitte (Grenzfrequenz 22050hz) die positiven Frequenzen; ab da gespiegelt bis ganz rechts (wieder 0hz) die negativen Frequenzen.
Sieht man sich die Zahlenwerte an (hotkey 'n'), dann sieht man eindeutig, dass die Amplituden der positiven und die der entsprechenden negativen Frequenzen gleich sind. (Lediglich der Imaginärteil ist invertiert, 'conjugiert complex').
Setzt man nun eine Bufferhälfte 0, z.B. die rechte (upper), alle negativ drehenden Frequenzen, dann müsste man zu dem ursprüngliche rein reellen mono-Signal die imaginäre Komponente rekonstruieren können. So ist es auch. Im VASP script:

clear.u "lösche die obere (=rechte) Bufferhälfte
FFT-    "Rücktransformation
opt
view.

Obere Bufferhälfte gelöscht:



Rücktransformation:



Der reelle Teil (grau) bleibt unverändert; der neue Imaginärteil (rot) enthält alle Frequenzen um 90 Grad phasenverschoben - sozusagen den cosinus zu jedem sinus jeder Frequenz.
In der x/y-Darstellung zeigt sich folgende complexe Bewegung (ein Ausschnitt von 100ms):



Damit haben wir eine 'Hilbert-Transformation' durchgeführt, benannt nach dem deutschen Mathematiker David Hilbert (1862-1943).

David Hilbert (foto Wiki Commons)

Die Hilbert-Transformation erlaubt sozusagen die Rekonstruktion des Imaginärteiles einer Schwingung, von der ursprünglich nur der reelle Teil gegeben ist. (Sie unterscheidet sich von unserer Methode step by step nur durch einen Amplitudenfaktor und durch die Sonderbehandlung der Offset 0hz und der Grenzfrequenz). Abgespeichert wird das wie ein stereo-Signal: links Realteil, rechts Imaginärteil.
Für unsere Ohren klingen die beiden Komponenten weitgehend gleich. Zusammen bilden sie eine zweidimensionale Bewegung in der Zeit - eben eine complexe Schwingung.
Selbstverständlich geht das in VASP auch in einem Schritt:

sfload sus.wav
HILB
view.

* * *

Schön und gut, aber wozu das alles ?
Viele Effekte, Transformationen oder Modulationen arbeiten intern complex; viele sind anders gar nicht durchführbar; manche funktionieren complex besser als reell. Analytische Prozesse, wie Hüllkurven- oder Peak-Detektoren, arbeiten complex wesentlich zuverlässiger und genauer. Nichtzuletzt sind alle spektralen Phänomene nur complex verständlich, wenn man die Zusammenhänge von Frequenz und Zeit ihrem Wesen nach erfassen will.
Ein Muss für DSP-Programmierer; sehr zu empfehlen für Benutzer von Software, die genauer wissen wollen, was sie erwarten und was sie verlangen können; eine enorme Bereicherung für die experimentelle Klangbearbeitung.
In VASP arbeiten die meisten Routinen complex (manche können wahlweise complex oder reell ausgeführt werden). In diesem Sinne sind alle wichtigen Register grundsätzlich zweikanalig ausgeführt.

* * *

Die oben beschriebene Hilbert-Transformation benutzt eine ganzheitliche FFT, um in die Frequenzebene zu gelangen, in der die Auslöschung der negativen Frequenzen stattfindet. Das ist in einem Realtime-Kontext natürlich nicht möglich. Anstelle der Hilbert-Transformation verwendet man hier ein 'Allpass-Filter', ein Filter, das - wie der Name schon sagt - alle Frequenzen gleichermassen durchlässt, aber mit bestimmten Phasenverschiebungen. Es hat einen input und zwei outputs. Alle Frequenzen im zweiten output sind zu denen im ersten genau 90 Grad phasenverschoben.
[Achtung: Das ist keine Zeitverschiebung, kein delay ! - Wenn man es so sehen will, dann könnte man höchstens sagen, dass jede Frequenz ein anderes delay hat.]
Ganz genaugenommen erhält das Signal im einen output -45 Grad Phasenverschiebung, im anderen +45 Grad - zueinander eben die benötigten 90 Grad.
Auch so ein Filter ist in VASP verfügbar:

sfload monosound.wav
hilb "Hilbert allpass

Dieses Filter ist ein 6-poliger Allpass mit den Koeffizienten nach Bernie Hutchins.

[Man kann diesem Mann nicht genug danken ! Filtertheorie hin, Filtertheorie her - Design von guten, effizienten IIR-Filtern erfordert neben Fachkenntnis auch ein gerüttelt Mass an Erfahrung und Intuition. Hutchins, ein Lehrer für Elektrotechnik, hat so um 1975 diese Koeffizienten veröffentlicht, nachdem Harald Bode und Bob Moog bereits Ende der 60er einen frequency shifter mit so einem, allerdings viel einfacherem Filter vorgestellt hatten. (Ich verwendete einen 'Bode Frequencyshifter' in den 70ern. Das darin eingebaute analoge Allpassfilter kam an das von Hutchins erweiterte nicht heran. Georg Danczul - der dem Kreis der E.O.A. kein Unbekannter mehr ist - hat mir damals einen Shifter mit wesentlich genaueren analogen Filterbänken nachgebaut). Wer sich für Analogelektronik interessiert, sollte sich jedenfalls Bernie Hutchins' ELECTRONOTES nicht entgehen lassen: http://electronotes.netfirms.com ]

So ein IIR-Filter, egal ob analog oder digital, ist nicht phasenlinear und hat einen 'lag' - ein kurze Zeitverzögerung (in diesem Falle 2 bis 3 samples). Das heisst, das Originalsignal bleibt nicht exakt erhalten, sondern wird durch ein anderes, allerdings sehr ähnliches ersetzt. Da führt kein Weg daran vorbei.
Anders in VASP: Hier ist das Filter bidirektional ausgeführt. Das Original bleibt im linken Kanal (Realteil) exakt erhalten und der rechte Kanal bekommt die 90°-Phasenverschiebung. Wie auch bei manchen anderen Filtern lässt sich die Bidirektionalität probehalber auch aufheben, durch vorangestellte - und =.
=hilb bidirektional (default)
-hilb unidirektional

Hier das Spektrum des Filters. Blau: die positiven Frequenzen, rot: die negativen.



Man sieht, der Frequenzgang der positiven Frequenzen ist praktisch linear, der der negativen verschwindet, ausser in den Bereichen unterhalb von 15hz und oberhalb von 15khz. (Nicht wundern über die 6db Anhebung der blauen Kennlinie - das hat seine Richtigkeit).
Das VASP script für obigen Versuch:

size=18
set 10000s:512      "Preisfrage: Warum gerade eine Amplitude 512 ?
hilb
FFT
viewspec (blue)
mirr
viewspec+ (red)

Wäre das Filter völlig perfekt, sowie die spektrale Operation HILB, dann wäre die rote Kennlinie nicht vorhanden, alle negativen Frequenzen hätten die Amplitude 0. Für ganz heikle Fälle, vor allem extrem tiefe Signale, ist HILB zu empfehlen.

stereo als complex betrachtet

In der Rundfunktechnik verwendet man, seit stereo gesendet wird, einen sogenannten 'Phasenkorrelator'. Das ist ein Oszilloskop, an dem man sieht, wie die Phasen im Stereosignal insgesamt liegen. Die Faustregel ist: Es soll alles möglichst in der Hauptdiagonale (von links unten nach rechts oben) pendeln. Dann ist es auch mit Monogeräten halbwegs verlustfrei anhörbar. Liegen starke Anteile in der anderen Diagonale, dann muss man mit Auslöschungen rechnen.
Die xy-Grafik in VASP ist im Grunde so ein Phasenkorrelator, nur langsamer, sodass man die Entwicklung der complexen Wellen nachvollziehen kann. (hotkey 'b' für die schnelle Variante, 'x' für die langsame)


Ein Signal, das nur im linken Kanal liegt, zeigt in der xy-Darstellung nur Bewegung entlang der x-Achse (waagrecht)


Im rechten Kanal nur Bewegung in der y-Achse (senkrecht)


Ein Signal, das genau in der stereo-Mitte liegt, zeigt sich als Bewegung in dieser Diagonale


Zeigt sich die Bewegung in der anderen Diagonale, dann sind die Phasen zwischen links/rechts vertauscht. - Grundsätzlich kein Problem. Aber wenn man die beiden Kanäle zusammenmischt, löschen sie sich aus. Soetwas kann durch fehlerhafte Kabel entstehen, kann aber auch gewollt sein ('stereo enhancer')

Ein normales, mit zwei Mikrofonen aufgenommenes Signal sieht in der xy-Darstellung etwa so aus:



Complex betrachtet, ist das ein Gemisch aus positiv drehenden und negativ drehenden Kreisbewegungen unterschiedlicher Frequenz. (Was 'positiv' und was 'negativ' ist, ist Definitionssache. Üblicherweise bezeichnet man die Drehrichtung gegen den Uhrzeigersinn als 'positiv').
Mit VASP kann man das Gemisch trennen:
alf (alias filter), ein modifizierter Hilbert Allpass, filtert die positiven Frequenzen heraus und unterdrückt die negativen; alf- macht genau das Gegenteil.
Zusammengenommen bilden sie wieder das Original.


linksdrehend

+


rechtsdrehend

=


complex = stereo

'Aliasfilter' heisst die Routine eben deshalb, weil man im complexen Bereich die 'Aliasfrequenzen' 1. Ordnung an der entgegengesetzten Drehrichtung erkennt. (Die Aliasfrequenzen 2. Ordnung haben dummerweise wieder dieselbe Drehrichtung, usw.).
Die Routine ist aber auch noch in einem anderen Modus verfügbar: alf.split
Dabei wird der Realteil der positiven Frequenzen in den linken Kanal gelegt, der Realteil der negativen Frequenzen in den rechten. Das Ergebnis ist ein modifiziertes stereo-Panorama. Das lässt sich auch mehrmals wiederholen und es ergibt immer wieder neue stereo-Situationen. Hier das script:

size=20
sfload frank.wav
hilb
alf.split
ovp
alf.split
ovp
alf.split
ovp
alf.split
ovp
............

Das sollte man sich nach Möglichkeit im Kopfhörer anhören.
Ausgangsklang ist die Aufnahme einer Blasmusikkapelle, die ich mit 2 Mikrofonen von meinem Fenster aus gemacht habe. In der Folge ändert sich die Panoramaaufspaltung, es ändern sich subtile Bewegungsrichtungen, manchmal auch die Positionen der Reflexionen an den Häuserwänden.

complex audio in VASP

Wie bereits erwähnt, arbeiten nahezu alle Routinen in VASP grundsätzlich complex. Es wird aber ein bewusster Umgang damit erwartet. Das heisst, wenn man mit rein reellen Klängen arbeitet (mono, nicht complex aufbereitet), passiert auch etwas - unter Umständen aber nicht das, was man erwartet. Am Beispiel frequency-shift:

sfload monosound.wav
fshift 1000hz

Die Operation wird complex ausgeführt, das Resultat ist aber nichts anderes als die altbekannte Ringmodulation mit den bekannten zwei Seitenbändern, die die typische Rauigkeit bewirken. (Unnötigerweise ist dann im anderen Kanal auch noch eine Phasenverschiebung davon ...). Zur linearen Frequenzverschiebung, dem eigentlichen frequency-shift, wird es erst, wenn man das mono-Signal complex aufbereitet:

sfload monosound.wav
hilb
fshift 1000hz
oder:
sfload complexsound.wav
fshift 1000hz

Der bewusste Umgang mit complex audio ist die Grundlage von VASP!

Eine Liste der Routinen, die complex aufbereitete Signale benötigen, ist alleine schon deshalb sinnlos, weil es fast alle sind. Nicht zuletzt nennt man ein Signal das nur Frequenzen einer Drehrichtung enthält, ein 'analytical signal', weil es die Grundlage für eine Vielzahl von Klanganalysen ist.

complexes Spektrum

Das Spektrum eines Klanges, auch wenn dieser nur mono, also rein reell ist, ist immer complex. Man kann den Versuch machen:

sfload monosound.wav
FFT
clear.y
FFT-
view.

Was kommt da raus ? - Schritt für Schritt:




Das Gemisch eines Klanges mit seiner Zeitumkehrung ! (Egal, ob dieser Klang selber mono oder stereo wäre.

Die Fouriertransformation arbeitet grundsätzlich nur complex !

[Es gibt eine reele FFT, meistens RFT oder RFFT genannt. Ein verbreiteter Irrtum unter Programmierern ist, dass diese ein rein reelles Spektrum liefere. Keineswegs ! Man erspart sich bloss die Berechnung der oberen Bufferhälfte des Spektrums, weil die im Falle eines mono-Klanges symmetrisch identisch zur ersten ist.]

Auch in VASP gibt es eine RFFT. Diese ist in so einem Fall einfach doppelt so schnell, dafür bleibt die obere Hälfte im Spektrum leer. Man kann sie mit einem nachfolgenden symm.cjg rekonstruieren.

Wie wir wissen, kann das Spektrum als eingenständiger Klang betrachtet und als solcher gehört und verwendet werden. Dieser Klang ist in jedem Fall complex. er besteht für gewöhnlich aus einem Gemisch aus links- und rechtsdrehenden Frequenzen. Für viele Spektrale Operationen ist es aber von Vorteil, wenn nur Frequenzen einer Drehrichtung enthalten sind. (Damit hier kein Knopf im Hirn entsteht: Was wir im Spektrum als Frequenzen hören, sind in der Zeitebene Zeitpunkte, einzelne Samples - und umgekehrt >> SPILLING THE BEANS #9 Dellenhammer & Beulenhammer).
Um ein solchermassen 'analytisches Spektrum' zu erhalten, brauchen wir nichts weiter tun, als die zweite Bufferhälfte in der Zeitebene leer lassen, oder löschen durch clear.u (das ist sozusagen die triviale Methode einer Hilbert-Transformation im Spektrum).

Ein berühmtes Beispiel einer complexen Operation im Spektrum ist der sogenannte Faltungshall (convolution). Dabei werden die Spektren zweier Klänge moduliert, das heisst, sample für sample multipliziert. Und natürlich ist diese Multiplikation complex, sonst käme eine Verhallung in beiden Zeitrichtungen raus ...
Hier das VASP script für die convolution zweier beliebiger Klänge. (Es ist lediglich darauf zu achten, dass im Buffer Platz dafür ist, denn das Ergebnis ist so lange, wie beide Klänge zusammen):

A:
sfload klang1.wav
FFT
B:
sfload klang2.wav
FFT
vmul
FFT-

vmul ist eine solche complexe Multiplikation des Inhaltes (Vektors) im einen Buffer mit dem im anderen Buffer. Natürlich lässt sich das auch als Macro schreiben: CONV. In der ausformmulierten Form besteht aber die Möglichkeit, noch ins Spektrum einzugreifen, etwa den typisch matten Klang einer convolution durch einen Compressor boost zu korrigieren.

A:
sfload klang1.wav
FFT
B:
sfload klang2.wav
FFT
vmul
boost 1.5,10hz
FFT-

(1.5 ist der Kompressionsfaktor; die 10hz daneben haben nichts mit den spektralen Frequenzen zu tun, sie sind eine Filtereinstellung für den Hüllkurvendetektor, der in boost verwendet wird).

complex audio in AMP

So wie man sich bei den alten analogen Effektgeräten (dem Bode-Frequencyshifter beispielsweise) nicht darum kümmern musste, dass sie intern complex arbeiten, so muss man das auch bei den AMP Kernmodulen (objects) nicht. Alle Module, die complex arbeiten, haben standardmässig ein Allpassfilter eingebaut. Sie erhalten einen mono-input und liefern einen mono-output, wenn nicht explizit anders deklariert.

i1=monosound.wav (m)
k1=fshift (m,*i1)
out=test.wav (m,*k1)

Das ginge explizit auch so (der doppelte Stern ist ein complexer patch):

i1=monosound.wav (m)
k1=hilb (*i1)
k2=fshift (m,**k1)
out=test.wav (m,*k2)

oder so:

i1=complexsound.wav (s)
k1=fshift (m,**i1)
out=test.wav (m,*k1)

oder so, wenn man ein complexes Resultat erhalten möchte:

i1=monoklang.wav (m)
k1=fshift (c,*i1)
out=test.wav (2:2,*k1)

Im Grunde muss man sich in AMP nicht darum kümmern und es gibt auch keine complexen Parameter (sie können aber, wenn wer will und sich auskennt, complex verknüpft werden).
Hat man mehrere Module hintereinandergeschaltet, die intern complex arbeiten, dann ist es allerdings ungeschickt, wenn man immer wieder die complexe Ebene verlässt und in jedem Modul erneut ein Allpassfilter strapaziert. Da ist es besser, man deklariert den output der betreffenden Module complex.
Hier das vollständige script mit einem Phasenbeschleuniger (spin) und dem Frequencyshifter (fshift) mit nachgeschaltetem Aliasfilter (.alf)

i1=monoklang.wav (m)
k1=spin (c,*i1)        "liefert complexen output durch c
k2=fshift.alf (m,**k1) "übernimmt complexen output durch **
out=test.wav (m,*k2)   "liefert aber wieder einen mono output
seg=1
dur: 10
k1.rate: 4
k2.freq: 1000

* * *

Somit steht dem Abenteuer complex audio nichts mehr im Wege ...

akueto
G.R.

(c) Günther Rabl 2011-13




Mathematischer Anhang

Eine kurze Übersicht über die complexe Algebra für Leute, die selber programmieren wollen. Wie die meisten wissen, programmiere ich in FORTRAN (und habe aus guten Gründen auch nicht vor zu einer anderen Sprache zu wechseln). In FORTRAN gibt es von Anbeginn an den Datentyp complex, der genauso behandelt werden kann, wie jeder andere Datentyp auch. Alle complexen Rechenoperationen werden so maschinennahe wie möglich ausgeführt. Man benötigt keine functions dazu und muss keine Bibliotheken einbinden. Wenn A,B und C complexe Zahlen sind, dann kann ich ohne weiteres schreiben:
A = B + C
A = B * C
sogar
A = B ** C (die FORTRAN Schreibweise für A istgleich B hoch C)
Dennoch ist es gut zu wissen, wie die Zusammenhänge sind.


C,D .... complexe Zahlen
x,y,a,b ... reelle Zahlen
i ..... das Symbol für imaginär i=√-1
R ..... der Radius oder Absolutbetrag (reell)
φ ..... der Winkel phi (reell)
π ..... die Zahl pi (3.14159...)
n ..... eine beliebige ganze Zahl

i = -1
i
2 = -1
(-i)
2 = -1
log(i) = π/2
±2nπ (zyklisch)

C = x+iy; D=a+ib
C' = cjg(C) = x-iy "conjugiert complex"
C+D = (x+a) + i(y+b)
C*D = (x*a-y*b) + i(x*b+y*a)
C/D = C*D'/|D|2 = ((x*a+y*b)+i(y*a-x*b))/(a2+b2)

R = |C| = √(x2+y2)
φ = arccos(x/R) = arcsin(y/R) = arctan2(y,x)
C = R * (cosφ+isinφ) = R * eiφ
log(C) = log(R) + iφ
exp(C) = eR*cosφ * eiR*sinφ
√C = √R * eiφ/2
CD = eD*log(C) = exp((a*log(R)-b*φ)+i(a*φ+b*R))

Zusammenhang von Kreisfunktionen und Hyperbelfunktionen:

sin(iφ) = isinh(φ)
cos(iφ) = cosh(φ)
sinh(iφ) = isin(φ)
cosh(iφ) = cos(φ)

sinh(φ) = (eφ-e-φ)/2
cosh(φ) = (eφ+e-φ)/2
tanh(φ) = (eφ-e-φ)/(eφ+e-φ)

Einige dieser Funktionen, wie zum Beispiel die complexe Wurzel und der complexe Logarithmus haben bekanntlich unendlich viele Lösungen. Allerdings hat der pfiffige Leonhard Euler (1707-1783) schon vor 250 Jahren eine Kontroverse zwischen Leibnitz und Bernoulli bereinigt, indem er den Nachweis erbrachte, dass auch der Logarithmus von positiven reellen Zahlen unendlich viele Lösungen hat - aber nur eine einzige reelle daruntern. log(x) = log(x) + i2nπ, wobei n eine beliebige ganze Zahl ist und die bekannte reelle Lösung, wenn n=0 ist.
Im Kontext gibt es aber immer eine naheliegende Lösung, wenn man davon ausgeht, dass die Differenz der Phasen zweier benachbarter samples nicht grösser als π und nicht kleiner als -π sein darf. Dadurch sind auch so schöne Effekte möglich, wie die Mittelwert-Modulationen vmerge.rms und vmerge.gmean
vmerge.rms C = √(A2+B2)
vmerge.gmean C = √(A*B)
Ausprobieren !

Wer einen der Meisterkurse absolviert hat oder den Einführungskurs VASP/AMP, hat auch ein unscheinbares Programm namens UC erhalten ('universal calculator'). Das ist ein 'Taschenrechner', der reell, complex und auch in Primquotienten betrieben werden kann. Die Umschaltung dafür ist !R, !C und !PQ
Alle sind in RPN ('reverse polish notation'). Die will ich hier nich lang und breit erklären, nur soviel:
Wenn man auf einem normalen Taschenrechner schreiben würde
5
+
7
=

dann schreibt man das in RPN
5
enter
7
enter
+
Desgleichen
5; +; 7; +; 3; +; 2; =
kann man in RPN schreiben:
5; enter; 7; enter; 3; enter; 2; enter; +; +; +

Complexe Zahlen gibt man mit underscore _ ein.
5+i2 schreibt man einfach 5_2
Auch die Eingabe in Polarkoordinaten ist möglich.
3(cos(45°)+isin(45°)) schreibt man 3_45deg oder 3_0.7854rad