VIRTUAL SOUND POSITIONING 3D MULTISOURCE - 98 30 335, F750 Franz Zotter - IEM Institut für Elektronische Musik

Die Seite wird erstellt Johannes Klemm
 
WEITER LESEN
Verarbeitungsalgorithmen in                                IEM
Computermusik und Akustik UE   Institut für Elektronische Musik

VIRTUAL SOUND POSITIONING 3D MULTISOURCE

Betreuer:                              Franz Zotter
Piotr Majdak                           98 30 335, F750
                                       Projekt 12
                                       22.07.2002
Abstract:

Within this project a binaural headphone signal should be rendered
from a mono input signal. Head related impulse responses and data
from a room simulation shall be used to create a spatial sounding
signal. The coloring of sound due to reflection is processed by using
an arbitrary first order filter.

                           Kurzbeschreibung:

In diesem Projekt wird ein Kopfhörersignal aus einem Monosignal
gerendert. Mit kopfbezogenen Impulsantworten (HRIRs) und Daten
einer Raumsimulation soll ein räumlich klingendes Signal berechnet
werden. Die Färbung eines Schallsignals bei der Reflexion soll durch
einen allgemeinen Filter 1. Ordnung berücksichtigt werden.

                         BESCHREIBUNG
1.     Problem und Aufgabenstellung
       Virtual Sound Positioning 3D Multisource:
Ziel des Projektes ist die Erstellung von räumlich klingenden
Kopfhörersignalen aus einem Schallsignal und Parametern, die aus einer
Raumsimulation gewonnen werden.

     1.1 Raumsimulation (Spiegelquellenprinzip)
Die Raumsimulation soll dabei die akustischen Reflexionen eines Raumes
berechnen.
Über das Spiegelquellenprinzip ist es möglich das Schallfeld, welches
durch ein Schallereignis in einem begrenzten Raum hervorgerufen wird,
im einfacheren freien Schallfeld nachzubilden. Voraussetzung dafür ist die
kugelförmige Schallausbreitung von der Schallquelle und geometrische
Reflexion an den Raumwänden.
Der erste Schritt bei der Nachbildung des Raumes ist die Positionierung
der ursprünglichen Schallquelle im freien Schallfeld.
Reflexionen des Schalls an den Raumbegrenzungsflächen (Boden, Wände,
Decke) werden durch Einbringen weiterer Schallquellen rekonstruiert.
Die ersten dieser zusätzlichen Schallquellen, die Spiegelquellen
1. Ordnung, gewinnt man durch einfache Spiegelung (Reflexion) der
Direktschallquelle an den Raumbegrenzungsflächen.
Werden nun diese Spiegelquellen weiter am Raum gespiegelt, gelangt
man zu den Spiegelquellen 2. und höherer Ordnung, welche mehrfach
reflektierte Schallstrahlen nachbilden. Üblicherweise wird nach einer
vorgegebenen Ordnung von Reflexionen abgebrochen.
Weil der Schall durch Reflexion gefärbt wird, muss das in der Berechnung
für jede Ordnung von Spiegelquellen einbezogen werden.
Die hier verwendete Raumsimulation arbeitet mit dem
Spiegelquellenprinzip und kann, unter der Vorgabe einer Raumgeometrie,
der höchsten zu berechnenden Ordnung und der Position der
Direktschallquelle die Spiegelquellen, ihre Position und Ordnung
berechnen.

     1.2 HRIRs:
Die Kopfbezogene Impulsantworten (HRIRs) wurden mit einem Kunstkopf
an der Stelle der Außenohren gemessen. Durch entsprechende
Positionierung der Messschallquelle (MLS-Messung) wurden für
ausreichend viele Einfallsrichtungen Impulsantworten gemessen.
Diese Impulsantworten eines KEMAR-Kunstkopfes stehen hier zur
Verfügung. Sie erlauben es ein Schallsignal durch Faltung mit einem
bestimmten Paar von Impulsantworten, in einer bestimmten Richtung zum
Hörer zu Positionieren.

     1.3 Virtual Sound Positioning:
Wird ein Schallsignal mit einem geeigneten Paar von Impulsantworten
(linkes und rechtes Außenohr) gefaltet, erhält man ein Kopfhörersignal.
Je nach Wahl dieser beiden Impulsantworten ist es möglich das
Schallsignal in einer bestimmten Einfallsrichtung zu positionieren.
Unter Annahme von Symmetrie zwischen linkem und rechtem Ohr, genügt
es die Impulsantworten für ein Ohr zu kennen.

2.       Programmteile und Funktionen
     2.1 Das Projekt:
         Virtual Sound Positioning, 3D Multisource:
Für einen Abhörpunkt des simulierten Schallfeldes soll nun das Signal
berechnet werden, das ein dort positionierter Hörer wahrnehmen könnte.
Bei der Zusammenstellung des Schallfeldes aus Spiegelschallquellen wird
hier für jede Spiegelquelle berücksichtigt:
     •   Einfallsrichtung für den Hörer (Azimut und Elevation)
     •   Distanz zum Hörer, um die entfernungsabhängige Schalldämpfung
         berechnen zu können
     •   Verzögerung des Schalls am Ort des Hörers; eigentlich mit
         Distanz / Schallgeschwindigkeit gegeben, wird hier aber trotzdem
         explizit gefordert
     •   Ordnung der Spiegelquelle, um die Klangfärbung bei Reflexion zu
         berücksichtigen
     •   Filterkoeffizienten, welche die oben genannte Klangfärbung
         beschreiben (Filter 1. Ordnung)
     •   Eingangssignal in Mono
Im Algorithmus werden stufenweise die Spiegelquellen nullter Ordnung bis
zur höchsten Ordnung abgearbeitet.
Dabei wird das Eingangssignal für jede höhere Ordnung gefiltert, was der
Klangfärbung durch Reflexion entspricht. In weiterer Folge wird mit dem
erhaltenen Signal für jede Spiegelquelle ein Binauralsignal berechnet, die
dazu verwendeten Impulsantworten entsprechen der jeweiligen
Einfallsrichtung.
 Weil nicht für alle Raumrichtungen eine HRIR vorliegt, werden die
verfügbaren HRIRs verwendet, die den tatsächlichen Einfallswinkeln am
ehesten entsprechen.
Dieses Signal wird dann mit gegebener Verzögerung und Distanz
verschoben (fraktionales Delay) und abgeschwächt (1/r).
Für die bearbeitete Spiegelquelle kann nun das fertige Signal ins
anfänglich leere Ausgangssignal durch Addition eingefügt werden.

Schleife für jede Ordnung i (beginn bei 0)
  Wenn Ordnung 0, dann Eingangssignal=filtere(Eingangssignal)
  Schleife für jede Quelle k der Ordnung i
       Finde beste HRIR für Einfallsrichtung der Quelle k, linkes Ohr
       Finde beste HRIR für Einfallsrichtung der Quelle k, rechtes Ohr
       Sig=filtere(Eingangssignal, HRIR(k, rechtes + linkes Ohr) )
       Sig=verzögere(Sig, Verzögerung(k))
       Sig=1/Distanz(k)*Sig
       Ausgangssignal=Ausgangssignal+Sig
  Ende
Ende

function out=projekt(in,hrir,hrir_index,a,b,sources,fs)
3D Multisource Binaural Sound Positioning

hrir            .... HRIRs for azimut and elevation. The HRIRs should be in
                the colums of this matrix. [HRIR1(:), HRIR2(:),...]
hrir_index      .... index vector vor HRIR-Matrix with elevation (1st column)
                and azimut(2nd column)
                 should be defined in degree!! [azimuth1, elevation1;
                azimuth2, elevation2;...]
a, b            .... filter coefficients for reflecting surfaces
                (only one filter type possible for all reflections in common
                a: iir filter part, b: fir filter part -> type help filter!)
in              .... mono input signal
sources         virtual sources-
                colums of sources:[radius, azimut, elevation, order, delay]
fs              .... Samplingrate
out             .... binaural (stereo) output signal

AUFRUF Beispiel:
[in,fs,b]=wavread(‘bach.wav’);
load kemar_3D; load kemar_3dindex; load sources;
hrir=kemar_128; hrir_index=kemar_3dindex;

[b,a]=cheby1(1,5,5000/44100*2);
imp=[1;zeros(99,1)];   % Rendern einer Raumimpulsanwort (spart Rechenzeit)
ir=projekt(imp,hrir,hrir_index,a,b,sources,fs);
out=fftfilt(ir,in); out=out/max(max(out));
2.2 ZUSATZROUTINEN:
Zum Einbinden des Projektes in eine sinnvolle Umgebung wurden
Zusatzprogramme implementiert, welche im Wesentlichen die Simulation
von Spiegelquellen umfassen.

        2.2.1.      3D Raumsimulation
                    mit dem Spiegelquellenprinzip
Dient zum Auffinden aller gewünschten Spiegelquellen zu einer frei
wählbaren einfachen Raumgeometrie und einer gegebenen
Direktschallquelle in kartesischen Koordinaten.

function sources=mirror_sources(source, room, maxorder)

3D Image Source Room Simulation

this function calculates the position of virtual sound sources (images)
 in a simple concert room due to one real sound source,
 to represent the early reflections, their delay and location

source                           ... position of the sound source in 3D coordinates
                                 [x,y,z] listening point ... (LISTENING PERSON) in
                                 the coordinate's origin [0,0,0] looking into x-
                                 direction [1,0,0]
room                             ... position of the eight corners of the concert
                                 hall (cell array)
                                 first row, floor coordinates, second row ceiling
                                 coordinates,
                                 sort each row like this: rear-left, rear-right,
                                 front right, front-left
                                 {[x1,y1,z1],[x2,y2,z2],[x3,y3,z3],[x4,y4,z4];
                                 [x5,y5,z5],[x6,y6,z6],[x7,y7,z7],[x8,y8,z8]}
maxorder                         ... gives the highest order for wich virtual sound
                                 sources should be computed
sources                          ... matrix with computed coordinates [x1,y1,z1;
                                 x2,y2,z2; x3,y3,z3; x4,y4,z4; x5,y5,z5; x6,y6,z6]
order                            ... vector containing the orders for each matrix
                                 row: [o1; o2; o3; o4; ....]

                                                            AUFRUF Beispiel:

                                                            room=
                                                            {[-3,-4,-1],[3,-4,-1],[3,2,-1],[-3,2,-1];...
                                                            [-3,-4,2],[3,-4,2],[3,2,2],[-3,2,2]};

                                                            sources=mirror_sources([0,1,0], room, 2);

                                                            Bild: Spiegelquellen eines
                                                            Würfelraumes mit einer
                                                            Schallquelle im Mittelpunkt.
                                                        0   (schematisch, bis zur 2.
  1.5     1
                                                            Ordnung)
              0.5     0   -0.5    -1               -2
                                       -1.5   -2
2.2.2.   Rekursive Formel
               zur Spiegelquellenberechnung
Berechnet Spiegelungen eines Punktes an Ebenen, welche durch je einen
Punkt und einen Normalvektor gegeben sind. Dabei sind die reflektierten
Punkte als Spiegelquellen, und die Ebenen als schallharte Wände eines
Raumes zu sehen.
function
newsources=reflection(source,order,newsources,maxorder,p,v,restriction)

3D Point Reflection Algorithm

 calculates a reflection on the plane defined by the point p and
 the normal vector v
P                              ... {[xpi,ypi,zpi];....} point of plane i
v                              ... {[xvi,yvi,zvi] ;....} must be a normed
                               vector (unity length!) normal vector of
                               plane I
maxorder, order                ... maximum order, order of input source
                               THIS ROUTINE IS TO BE USED FOR RECURSIVE
                               COMPUTATION, THE TERMINATION BASES ON THE
                               INPUT 'maxorder' and 'order'
newsources                     ... matrix with collected results of
                               computation containing image source
                               coordinates and orders
                               [xn1,yn1,zn1,order1; xn2,yn2,zn2,order2;
                               ...]
source                         ...      [xs,ys,zs]
restriction                    ... number of the surface no reflection
                               should be made on!
                               restriction=0 for zero order
newsources                     ... [xn1,yn1,zn1,order1;
                               xn2,yn2,zn2,order2; ...]

AUFRUF Beispiel:
p={[-3,-4,-1]; [-3,-4,-1]; [-3,-4,-1]; [3,-4,-1]; ...
  [3,2,-1]; [3,2,2]}
v={[0,-1,0]; [0,0,-1]; [-1,0,0]; [1,0,0]; ...
  [0,1,0]; [0,0,1]};
newsources=reflection([0,1,0],0,[0,1,0,0],2,p,v,0);

      2.2.3.   Umrechnung auf Kugelkoordinaten
function sources=sources_polar(sources)

3D Cartesian to Spherical Coordinates Conversion

turns all the kartesian coordinates in the rows of 'sources' into spherical
coordinates
[x1,y1,z1; x2,y2,z2;....]
-> [radius1, azimuth1, elevation1; radius2, azimuth2, elevation2,.....]
                                                                              y
                                                         z
AUFRUF Beispiel:
                                                                r
sources=sources_polar([0,1,0])                                          ϑ
                                                                    φ
(Es wurde hier eine leicht modifizierte
Version von Kugelkoordinaten verwendet)
                                                                          x
2.3 Testprogramme:
Zum einfachen Aufruf aller implementierten Funktionen gibt es 2
Testprogramme.

Im Code des ersten Testprogramms können die gewünschten Parameter für
den Raum und die Ordnung der Spiegelquellen eingestellt werden, um die
Spiegelquellen zu berechnen und danach wird das Rendering für einen Impuls
durchgeführt.
Die erhaltene Impulsantwort (Binauralsignal) wird als Parameter an das
Aufrufende Programm herausgeführt.

function impant=test_projekt

this script-alike matlab function is rendering a 3D room
with 8 corners, a sound source and a listening point (binaural headphone
signal).
the room and the computed sources are
being plotted with matlab's graphic tools.
it is allowed (even welcome) to change the definitions
within this code.
PARAMETERS TO BE CHANGED/VARIIED:
Order of Reflections, Room, Sound Source Location, Reflection Filter
Coefficients,...

the output of this program is a binaural headphone
signal in the 2 column vector 'impant' (IMPULSE RESPONSE)
THIS will only work if the files:
'kemar_3D.mat', 'kemar_3dindex.mat', 'mirror_sources.m',
'sources_polar.m', 'reflection.m', 'projekt.m' are available to matlab!

AUFRUF Beispiel:
impant=test_projekt;

Mit dem zweiten Testprogramm kann ein Audiosignal (wav-file) gerendert
werden. Die dazu verwendete Raumsimulation wird aus einer Matrix
‚sources.mat’ entnommen, welche die Spiegelquellen eines Raumes bis zur 5.
Ordnung enthält.
Zum sparen von Rechenzeit wird zuerst eine Impulsantwort generiert, dann die
Audiodaten damit gefaltet.

function [out,impant]=test_projekt2

this script-alike matlab function is rendering a 3D room
with 8 corners, a sound source and a listening point (binaural headphone
signal).
Here image sources up to 5th order will be used, that
are already computed and stored in the matrix 'sources.mat'

the output of this program is a binaural headphone
signal in the matrix 'out' and the impulse response 'impant'
THIS will only work if the files:
'bach.wav', 'sources.mat', 'kemar_3D.mat', 'kemar_3dindex.mat',
'mirror_sources.m',
'sources_polar.m', 'projekt.m', 'reflection.m' are available to matlab!

AUFRUF Beispiel:
[out, impant]=test_projekt2;
Beispiel für die Erzeugung einer längeren Impulsantwort:

       [out, imp]=test_projekt2;
       [b,a]=cheby1(1,5,5000/44100*2);
       a=conv(a,a); b=conv(b,b);
       noise=randn(2,22050);
       noise=filter(b,a,noise);
       noise=noise.*repmat(exp(-(0:length(noise)-1)/2500),2,1);
       imp=[imp(1:3000,:) ;noise’/max(max(noise))/10];

                                                                             Direktschallquelle und Spiegelquellen
                                                                             erster Ordnung eines Raumes mit einer
                                                                             schrägen linken Wand. Dabei sind die
                                                                             Reflexion an der vorderen und an der
                                                                       2
                                                                             linken Wand ca. gleich weit vom Hörer
                                                                             entfernt.
                                                                  1

                                                              0

                                                         -1

                                                   -2

                                              -3

0.3
                                                                             Impulsantwort bei Berücksichtigung der
                                                                             Spiegelquellen 1. Ordnung, insgesamt
0.2
                                                                             sind 7 Spitzen erkennbar (2 der
0.1
                                                                             insgesamt 7 Reflexionen [vordere+ linke
                                                                             Wand] treffen fast zum selben Zeitpunkt
  0                                                                          ein)
-0.1

-0.2

-0.3

-0.4

        1000   1500   2000   2500   3000   3500         4000          4500

       3.      Audiodateien-Beispiele :
            1. Ausschnitt aus einer Bach-Bourrée:
               “bach.mp3“         unbearbeitete Aufnahme (tonstudio Nachrichtentechnik)
               “bach_3d.mp3“      in einem Quaderraum mit einer schrägen Wand
                                  Reflexionen bis 5. Ordnung und cut-off 5000Hz
               “bach_3dgauss.mp3“ Impulsantwort von oben um exponentiell
                                         abklingendes Rauschen verlängert
            2. “impant.mat“       Matlab-Matrix mit 2 Stereo Impulsantworten. Selber
                                  Raum wie beim Bach-Beispiel (Variablen: imp, impant).
Sie können auch lesen