3D-ambisonic implementierung auf pd

ritsch.sontacchi.zmölnig
institut für elektronische musik und akustik

abstract

eine modulare dreidimensionale spatialization-engine, in die auch problemlos raumsimualtionsalgorithmen eingebunden werden können

ambisonic als intensitäts-spatialisation schien im rahmen von raumklanginstallationen mit >1 rezipienten besonders geeignet. weiters ermöglicht die besondere struktur von ambisonic signalen eine gute, einfach zu realisierende raumsimulation (verhallung)
  1. codieren einer mono-quelle auf 8-kanal ambisonic
  2. generieren und zumischen von 3d-hall
  3. berücksichtigung der kopfhaltung
  4. wiedergabe auf lautsprecherarray
  5. miscellaneous

generierung von räumlichen signalen

aus einer mono-schallquelle mit zugehöriger position (r, phi, theta bezüglich hörerposition) in einem virtuellen raum soll ein ambisonic-signal gerendert werden
dabei wurden die quellen in der horizontalebene (xy-ebene) mit ambisonic 3.ordnung (1+6 kanäle: W,  X, Y, U, V, S, T) codiert, in der vertikalebene mit ambisonic 1.ordnung (1+1 kanäle: W,  Z).

object slot

dieses object beinhaltet sowohl eine mono-quelle (object player~) als auch die eigentliche mono->ambisonic-codierung (object ambisonic~)

object player~

dient als mono signalquelle; durch beliebige andere mono-signalgeneratoren ersetzbar

object ambisonic~

hier wird das mono-signal auf 8-kanal-ambisonic codiert
das mono-signal (inlet1) wird in abhängigkeit von der position (inlet2) und einem abklingkoeffizienten-triple (inlet3) gewichtet, wodurch die einzelnen ambisonic-kanäle erzeugt werden. die gewichte für die jeweiligen kanäle werden im object pos2weights berechnet
object pos2weights
berechnet die gewichte zur ambisonic codierung anhand folgender formulae::
W_factor 0.707
X_factor (r0/r)^k1 * cos (phi) * sin (theta)
Y_factor (r0/r)^k1 * sin (phi) * sin (theta)
Z_factor (r0/r)^k1 * cos (theta)
U_factor (r0/r)^k2 * cos (2*phi) * sin (theta)
V_factor (r0/r)^k2 * sin (2*phi) * sin (theta)
S_factor (r0/r)^k3 * cos (3*phi) * sin (theta)
T_factor (r0/r)^k3 * sin (3*phi) * sin (theta)

r, phi und theta sind die koordinaten der schallquelle in bezug auf die besucherin. man beachte, daß die (phi=0)-achse nicht gleichzusetzen ist mit der blickrichtung, sondern eine von der kopfdrehung unabhängige referenz darstellt (zb: x-achse des raumes)
die abklingkoeffizienten k1, k2 und k3 bestimmen die abnahme der lokalisierung mit zunehmender entfernung der quelle vom ohr
der bezugsabstand r0 ist der minimal-abstand zwischen einer schallquelle und der schallsenke

verhallung und raumsimulation

aus der summe aller ambisonic-codierten quellen sollte ein 3dimensionales hallsignal generiert werden (die alternative, für jede einzelne virtuelle schallquelle ein 3dimensionales hallsignal zu generieren, muss als unökonomisch abgetan werden)
im folgenden wird ein dreistufiger hallalgorithmus zur generierung von 3d-hall beschrieben
  1. erste reflexionen
  2. diffuse reflexionen
  3. distanzsteuerung

object 3dreverb~

das ambisonic-hall-signal wird aus der summe aller W-kanäle (inlet1), die einen mono-mixdown ohne jeglicher rauminformation darstellt, gewonnen
da eine exakte lokalisation der spiegelquellen sinnlos (da auch in der "echten" welt nicht so wahrgenommen) als auch unmöglich (da ja die einzelnen quellen zu einer summenquelle zusammengefasst wurden) ist, begnügen wir uns damit, das 3d-hall signal mit ambisonic 1.ordnung zu codieren
folgende raumspezifische koeffizienten können gesetzt werden (inlet2) :
dBgain_refl anteil der ersten reflexionen in dB
dBgain_diff anteil des diffusfeldes in dB
roomX länge des simulierten raumes
roomY breite des simulierten raumes
roomZ höhe des simulierten raumes
alpha_refl tiefpass-dämpfung für erste reflexionen [0..100]
feedback feedback verstärkung für das diffuse schallfeld in dB
alpha_diff tiefpass-dämpfung für diffuse reflexionen [0..100]

die ohrposition x=0..roomX, y=0..roomY und z=0..roomZ (inlet3) beeinflusst die verzögerung der ersten reflexionen als auch die richungsbewertung via distanzbewertung

object reflections~

erste reflexionen haben maßgeblich anteil am erleben der raumgröße
da hier die position der einzelnen schallquellen nicht (mehr) bekannt ist, außerdem nur ein summen-signal aller quellen vorliegt, wird die position der summenquelle mit der ohrposition gleichgesetzt. dadurch kann mit minimalem rechenaufwand ein guter eindruck der raumgröße vermittelt werden
die verzögerung der ersten reflexion einer bestimmten begrenzungsfläche ist also die zeit, die der schall von der ohrposition zur jeweiligen wand und wieder zurück braucht

object diffuse~

generiert in 10 stufen ein mono diffushall-signal, das zu gleichen teilen auf die sechs begrenzungsflächen verteilt wird

object hallnearwall~

in der nähe einer wand nimmt der anteil des halls aus der richtung dieser wand ab; dem wird durch gewichtung des hallanteils mit der relativen enfernung zur jeweiligen wand rechnung getragen
g(wand_i) (abstand von wand_i)/(summe aller abstände)

kopfdrehung und handstand

object rotation~

bis jetzt galt die annahme einer schallsenke, die nicht drehbar gelagert ist (daher entspricht auch die (phi=0)-achse nicht der blickrichtung). dies war insofern sinnvoll, als hallanteile natürlich unabhängig von der kopfdrehung immer von den jeweiligen wänden kommen
um eine virtuelle kopfdrehung um psi° zu ermöglichen, ist es nun notwendig, das gesamte (verhallte) schallfeld zu drehen. dies ist glücklicherweise durch multiplikation mit einer rotationsmatrix denkbar einfach :
10000000
0cos (1*psi)sin (1*psi)00000
0-sin (1*psi)cos(1*psi)00000
00010000
0000cos (2*psi)sin (2*psi)00
0000-sin (2*psi)cos(2*psi)00
000000cos (3*psi)sin (3*psi)
000000-sin (3*psi)cos(3*psi)

wiedergabe auf einem lautsprecherarray

das zur wiedergabe bestimmte lautsprecherarray sollte möglichst symmetrisch angeordnet sein, idealerweise entlang einer kugeloberfläche
natürlich muss das array kalibriert werden, um mögliche pegel- und laufzeitunterschiede an der ohrposition auszugleichen; idealerweise wäre auch eine klangfarben-kalibrierung (geeignete lautsprecherauswahl, equalizing) durchzuführen.
allgemein setzt sich das lautsprechersignal LS für einen lautsprecher mit dem azimuth alpha und der elevation beta wie folgt aus den ambisonic-kanälen (W, X, Y, Z, U, V, S, T) zusammen ::
LS G1*W*p1 + G2*[X*p2*cos(alpha)*cos(beta) + Y*p3*sin(alpha)*cos(beta) + Z*p4*sin(beta) + U*p5*cos(2*alpha)*cos(beta) + V*p6*cos(2*alpha)*cos(beta) + S*p7*cos(3*alpha)*cos(beta) + T*p8*sin(3*alpha)*cos(beta)]

die gewichte G1 und G2 sind abhängig von der anzahl N der lautsprecher und nach GERZON:
G1 = G2 = sqrt (8/3N)


daraus ergibt sich eine realraumspezifische dekodiermatrix (zb: object a2s_coeff_wien)

object ambisonic2speaker~

appliziert eine beliebige dekodiermatrix um aus den 8 ambisonic kanälen die 16 ausgangskanäle zu erhalten

object chan2spk16~

verteilt je einen ambisonic kanal gewichtet auf die lautsprecherkanäle

object speaker~

ausgabe eines lautsprechersignals auf den jeweiligen, mittels einer kalibriermatrix (zb: object spk_calibrate_wien) pegel- und delay-kalibrierten ausgang
hier wird auch die gesamtlautstärke in den signalweg eingerechnet

ansonsten


forum::für::umläute
Last modified: Thu Jul 27 13:53:52 CEST 2000