Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Two!Ears Auditory Front-End

The purpose of the Two!Ears auditory front-end (AFE) is to extract a subset of common auditory representations from a binaural recording or from a stream of binaural audio data. These representations are to be used later by higher modeling or decision stages. The AFE is capable of working in a block-based manner and can be used as a standalone software or together with other stages of the Two!Ears Auditory Model

The highlights of AFE are:

  • The framework operates on a request-based mechanism and extracts the subset of all available representations which has been requested by the user.
  • It can operate on a stream of input data. In other words, the framework can operate on consecutive chunks of input signal, each of arbitrary length.
  • The user request can be modified at run time, i.e., during the execution of the framework.


The files for the AFE are divided in three folders, ./doc, ./src and ./test containing respectively the documentation of the framework, the source code, and various test scripts. Once Matlab opened, the source code (and if needed the other folders) should be added to the Matlab path. This can be done by executing the following script in:

>> startAuditoryFrontEnd

If you are using the AFE together with other parts of the Two!Ears Auditory Model, it will automatically be started by

>> startTwoEars

Have a look at the documentation of the Two!Ears Auditory Model.

The AFE was developed under Matlab version (R2014a) and tested for backward compatibility down to Matlab version (R2012b).


The AFE is request-based: the user places one or more requests, and then informs the framework that it should perform the processing. The command requestList can be used to get a summary of all supported auditory representations that can be requested:

>> requestList
The following requests for Two ! Ears Auditory Front - End processing are
    currently valid :

The implementation of the AFE is object-oriented, and two objects are needed to extract any representation:

  • A data object, in which the input signal, the requested representation, and also the dependent representations that were computed in the process are all stored.
  • A manager object which takes care of creating the necessary processors as well as managing the processing.

Example of ILD computation

As an example, extracting the interaural level difference ild for a stereo signal sIn (e.g., obtained from a .wav file through Matlab’s wavread) sampled at a frequency fsHz (in Hz) can be done in the following steps:

% Instantiation of data and manager objects
dataObj = dataObject(sIn, fsHz);
managerObj = manager(dataObj);
% Request the computation of ILDs
sOut = managerObj.addProcessor('ild');
% Request the processing

Line 2 and 3 show the instantiation of the two fundamental objects: the data object and the manager. Note that the data object is always instantiated first, as the manager needs a data object instance as input argument to be constructed. The manager instance in line 3 is however an "empty" instance of the manager class, in the sense that it will not perform any processing. Hence a processing needs to be requested, as done in line 6. This particular example will request the computation of the inter-aural level difference ild. This step is configuring the manager instance managerObj to perform that type of processing, but the processing itself is performed at line 9 by calling the processSignal method of the manager class.

The request of an auditory representation via the addProcessor method of the manager class on line 6 returns as an output argument a handle to the requested signal, here named sOut. In the AFE framework, signals are also objects. For example, for the output signal just generated:

>> sOut

sOut =

    TimeFrequencySignal with properties :

      cfHz : [1 x31 double]
     Label : 'Interaural level difference '
      Name : 'ild'
Dimensions : 'nSamples x nFilters '
      FsHz : 100
   Channel : 'mono'
      Data : [267 x31 circVBufArrayInterface ]

This shows the various properties of the signal object sOut. To access the computed representation, e.g., for further processing, one can create a copy of the data contained in the signal into a variable, say myILDs:

>> myILDs = sOut.Data(:);

Note the use of the column operator (:). That is because the property .Data of signal objects is not a conventional Matlab array and one needs this syntax to access all the values it stores.

Change parameters for the requested representation

Each individual processors that is supported by the AFE can be controlled by a set of parameters. Each parameter can be accessed by a unique nametag and has a default value. A summary of all parameter names and default values for the individual processors can be listed by the command parameterHelper. For the ild processing the available parameters can be listed with

>> parameterHelper('ild')

Interaural Level Difference parameters:

    Name            Default   Description
    ----            -------   -----------
    ild_wname       'hann'    Window name
    ild_wSizeSec    0.02      Window duration (s)
    ild_hSizeSec    0.01      Window step size (s)

It can be seen that the ILD processor can be controlled by three parameters, namely ild_wname, ild_wSizeSec and ild_hSizeSec. A particular parameter can be changed by creating a parameter structure which contains the parameter name (nametags) and the corresponding value. The function genParStruct can be used to create such a parameter structure. For instance:

>> parameters = genParStruct('ild_wSizeSec', 0.04, 'ild_hSizeSec', 0.02) ;

parameters =
    ild_wSizeSec : 0.0400
    ild_hSizeSec : 0.0200

will generate a suitable parameter structure parameters to request the computation of ILD with a window duration of 40 ms and a step size of 20 ms. This parameter structure is then passed as a second input argument in the addProcessor method of a manager object. The previous example can be rewritten considering the change in parameter values as follows:

% Instantiation of data and manager objects
dataObj = dataObject(sIn, fsHz);
managerObj = manager(dataObj);
% Non - default parameter values
parameters = genParStruct('ild_wSizeSec', 0.04, 'ild_hSizeSec', 0.02);
% Place a request for the computation of ILDs
sOut = managerObj.addProcessor('ild', parameters);
% Perform processing

The ILD processor is further demonstrated by the script DEMO_ILD.m in the ./test folder.

More help

The complete functionality of the AFE is discussed in detail in the accompanying Online user manual.


The AFE is developed by Tobias May, Rémi Decorsière from Technical University of Denmark, Chungeun Kim from University of Technology Eindhoven, and the rest of the Two!Ears team.


The AFE is released under GNU General Public License, version 2.


This project has received funding from the European Union’s Seventh Framework Programme for research, technological development and demonstration under grant agreement no 618075.

EU Flag Tree