VIRTUAL SOUND POSITIONING 3D MULTISOURCE - 98 30 335, F750 Franz Zotter - IEM Institut für Elektronische Musik
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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