Usage

As explained in the Working with the database tutorial the database is located at https://dev.qu.tu-berlin.de/projects/twoears-database, but you don’t have to download any files yourself as this is automatically performed by the Binaural simulator or by explicitly calling xml.dbGetFile(), for example:

filename = xml.dbGetFile('stimuli/anechoic/instruments/anechoic_cello.wav');
sig = wavread(filename);

All the data that is automatically downloaded is cached inside a temporary folder. You can get the position of this folder by executing xml.dbTmp and change it with xml.dbTmp('/path/to/tmp'). If you would like to clear the temporary folder you can execute xml.dbClearTmp. Before downloading a file from the remote database xml.dbGetFile first looks if you have a file on your computer in the exact relative position as specified, in this case ./stimuli/anechoic/instruments/anechoic_cello.wav, then it will look if you have a local copy of the database on your PC. The position of that database can be specified or seen by the xm.dbPath function. After that it looks inside the temporary cache for the file and only then downloads it.

Let us now assume that you want to have an HRTF in addition to our WAV-file and you want to convolve the HRTF with sig from above:

hrtffile = xml.dbGetFile('impulse_responses/qu_kemar_anechoic/QU_KEMAR_anechoic_3m.sofa');
% load your impulse response into a struct
hrtf = SOFAload(hrtffile);
% display some information about the impulse response
SOFAinfo(hrtf);
% plot a figure with the measurement setup
SOFAplotGeometry(hrtf);
% have a look at the size of the data
size(hrtf.Data.IR)
% get information about the measurement setup
hrtf.ListenerPosition       % position of dummy head
hrtf.SourcePosition         % position of loudspeaker
% head orientation of the dummy head + coordinate system and units
hrtf.ListenerView
hrtf.ListenerView_Type
hrtf.ListenerView_Units
% calculate the source position from a listener point of view
apparentSourceVector = SOFAcalculateAPV(hrtf);
% listen to the HRTF with azimuth of -90°
apparentSourceVector(91, 1)
SOFAplotGeometry(hrtf, 91);
soundOutput = [conv(squeeze(hrtf.Data.IR(91, 1, :)), sig) ...
               conv(squeeze(hrtf.Data.IR(91, 2, :)), sig)];
sound(soundOutput, hrtf.Data.SamplingRate);

You could do the same by not using the SOFA API directly, but by using only functions from the Binaural simulator:

% Load HRTF data set
hrtf = simulator.DirectionalIR( ...
    xml.dbGetFile('impulse_responses/qu_kemar_anechoic/QU_KEMAR_anechoic_3m.sofa'));
% Get a the HRTF for an azimuth of 80° (this is to the left of you)
impulseResponse = hrtf.getImpulseResponses(80);
figure;
plot(impulseResponse.left(1:400), '-b');
hold on;
plot(impulseResponse.right(1:400), '-r');
% Listen to the output signal
outputSignal = [conv(impulseResponse.left, sig) ...
                conv(impulseResponse.right, sig)];
sound(outputSignal, hrtf.SampleRate);

In the daily use of the Two!Ears Auditory Model you might even never directly use the xml.dbGetFile() function as you specify files to use most likely inside a scene description file, see Configuration using XML Scene Description. For example, in order to use the same HRTF from above you have to add the following address to your scene configuration:

<scene HRIRs="impulse_responses/qu_kemar_anechoic/QU_KEMAR_anechoic_3m.sofa">

The Binaural simulator will then automatically call the xml.dbGetFile() function in order to get the desired HRTF.