changeset 0:e34a535b9af0

Initial beta release.
author Christopher Hummersone <c.hummersone@surrey.ac.uk>
date Thu, 02 Mar 2017 09:44:08 +0000
parents
children a98f84abd5ba
files .gitignore .gitmodules .hgsub .hgsubstate Contents.m LICENSE.txt MASSEF.m MASSEFresults.m MASSEFseparator.m README.md Utilities/wavread.m Utilities/wavwrite.m help_html/helptoc.xml help_html/source/help_Example.m help_html/source/help_Index.m help_html/source/help_MASSEF.m help_html/source/help_MASSEF_evaluate.m help_html/source/help_MASSEF_execute.m help_html/source/help_MASSEF_install.m help_html/source/help_MASSEF_save.m help_html/source/help_MASSEF_start.m help_html/source/help_MASSEFresults.m help_html/source/help_MASSEFresults_algorithmInfo.m help_html/source/help_MASSEFresults_filter.m help_html/source/help_MASSEFresults_input.m help_html/source/help_MASSEFresults_merge.m help_html/source/help_MASSEFresults_mixtureInfo.m help_html/source/help_Separators.m help_html/source/publishHelp.m info.xml
diffstat 30 files changed, 4098 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,2 @@
+Utilities/PEASS
+Utilities/AMT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitmodules	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,4 @@
+[submodule "Library"]
+	path = Library
+	url = https://github.com/IoSR-Surrey/MatlabToolbox.git
+	branch = master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgsub	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,1 @@
+Library = [git]https://github.com/IoSR-Surrey/MatlabToolbox.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgsubstate	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,1 @@
+13e9ac3a66870e9c88862151d799f3d14d16b561 Library
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Contents.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,1678 @@
+% MASSEF
+% 
+%   Contents file for MASSEF and its subfolders.
+%   
+%   MASSEF
+%   info.xml
+%   LICENSE.txt
+%   MASSEF                               - Multichannel audio source separation evaluation framework
+%   MASSEFresults                        - A class for storing MASSEF results
+%   MASSEFseparator                      - Abstract base class for MASSEF separation algorithms
+%   README.md
+%   
+%   MASSEF/HELP_HTML
+%   help_Example.html
+%   help_Index.html
+%   help_MASSEF.html
+%   help_MASSEF_evaluate.html
+%   help_MASSEF_execute.html
+%   help_MASSEF_install.html
+%   help_MASSEF_save.html
+%   help_MASSEF_start.html
+%   help_MASSEFresults.html
+%   help_MASSEFresults_algorithmInfo.html
+%   help_MASSEFresults_filter.html
+%   help_MASSEFresults_input.html
+%   help_MASSEFresults_merge.html
+%   help_MASSEFresults_mixtureInfo.html
+%   help_Separators.html
+%   helptoc.xml
+%   
+%   MASSEF/HELP_HTML/HELPSEARCH-V3
+%   _1s.cfe
+%   _1s.cfs
+%   _1s.si
+%   segments.gen
+%   segments_1t
+%   
+%   MASSEF/HELP_HTML/SOURCE
+%   help_Example                         - Example
+%   help_Index                           - Multichannel audio source separation evaluation framework (MASSEF)
+%   help_MASSEF                          - MASSEF
+%   help_MASSEF_evaluate                 - MASSEF.execute
+%   help_MASSEF_execute                  - MASSEF.execute
+%   help_MASSEF_install                  - MASSEF.install
+%   help_MASSEF_save                     - MASSEF.save
+%   help_MASSEF_start                    - MASSEF.start
+%   help_MASSEFresults                   - MASSEFresults
+%   help_MASSEFresults_algorithmInfo     - MASSEFresults.algorithmInfo
+%   help_MASSEFresults_filter            - MASSEFresults.filter
+%   help_MASSEFresults_input             - MASSEFresults.input
+%   help_MASSEFresults_merge             - MASSEFresults.merge
+%   help_MASSEFresults_mixtureInfo       - MASSEFresults.mixtureInfo
+%   help_Separators                      - Separation Algorithms
+%   publishHelp
+%   
+%   MASSEF/LIBRARY
+%   classTemplate                        - Summary of this class goes on this H1 line
+%   functionTemplate                     - Summary of this function goes on this H1 line
+%   LICENSE
+%   README.md
+%   release-notes.md
+%   
+%   MASSEF/LIBRARY/+IOSR
+%   iosr.install                         - Set search paths, and download and install dependencies
+%   
+%   MASSEF/LIBRARY/+IOSR/+ACOUSTICS
+%   iosr.acoustics.irStats               - Calculate RT, DRR, Cte, and EDT for impulse response file
+%   iosr.acoustics.rtEst                 - Estimate reverberation time based on room size and absorption
+%   
+%   MASSEF/LIBRARY/+IOSR/+AUDITORY
+%   iosr.auditory.azimuth2itd            - Convert azimuth in degrees to ITD
+%   iosr.auditory.binSearch              - Conduct a binary search
+%   iosr.auditory.calcIld                - Calculate normalised interaural level difference
+%   iosr.auditory.chXcorr                - Calculate cross-correlograms with a wide range of options
+%   iosr.auditory.chXcorr2               - Calculate cross-correlograms with a range of options
+%   chXcorr2_c.c
+%   chXcorr_c.c
+%   iosr.auditory.createWindow           - Create a Hann or exp. window with specified onsets/offsets
+%   iosr.auditory.dupWeight              - Calculate duplex weighting coefficients for ITD and ILD
+%   iosr.auditory.erbRate2hz             - Convert ERB rate to Hz
+%   iosr.auditory.freqMulti              - Calculate frequency coefficient for ITD-azimuth warping
+%   iosr.auditory.gammatoneFast          - Produce an array of responses from gammatone filters via FFT
+%   iosr.auditory.hz2erbRate             - Convert Hz to ERB rate
+%   iosr.auditory.instItd                - Calculate instantaneous ITD
+%   iosr.auditory.iso226                 - ISO 226:2003 Normal equal-loudness-level contours
+%   iosr.auditory.itd2azimuth            - Convert ITD to azimuth
+%   iosr.auditory.lindemannInh           - Signal pre-processing for Lindemann's cross-correlation
+%   iosr.auditory.loudWeight             - Calculate loudness weighting coefficients based on ISO 226
+%   iosr.auditory.makeErbCFs             - Make a series of center frequencies equally spaced in ERB-rate
+%   iosr.auditory.meddisHairCell         - Calculate Ray Meddis' hair cell model for a number of channels
+%   iosr.auditory.perceptualCentroid     - Perceptual spectral centroid
+%   iosr.auditory.xcorrLindemann         - Cross-correlation based on Lindemann's precedence model
+%   xcorrLindemann_c.c
+%   
+%   MASSEF/LIBRARY/+IOSR/+BSS
+%   iosr.bss.applyIdealMasks             - Calculate and apply ideal masks via STFT
+%   iosr.bss.applyMask                   - Apply a time-frequency mask to an STFT
+%   iosr.bss.calcImr                     - Calculates the Ideal Mask Ratio (IMR)
+%   iosr.bss.calcSnr                     - Calculate the separation SNR
+%   iosr.bss.cfs2fcs                     - Calculate gammatone crossover frequencies
+%   iosr.bss.example                     - Determine STFT parameters
+%   iosr.bss.generateMixtures            - Generate arrays of mixtures from targets and interferers
+%   iosr.bss.getFullMask                 - Convert frame rate mask to a sample-by-sample mask
+%   iosr.bss.idealMasks                  - Calculate ideal time-frequency masks from STFTs
+%   iosr.bss.mixture                     - Class of sound source separation mixture
+%   iosr.bss.resynthesise                - Resynthesise a target from a time-frequency mask
+%   iosr.bss.source                      - Class of sound source separation source
+%   
+%   MASSEF/LIBRARY/+IOSR/+DSP
+%   iosr.dsp.audio                       - Abstract superclass providing audio-related properties and methods
+%   iosr.dsp.autocorr                    - Perform autocorrelation via FFT
+%   iosr.dsp.convFft                     - Convolve two vectors using FFT multiplication
+%   iosr.dsp.istft                       - Calculate the Inverse Short-Time Fourier Transform
+%   iosr.dsp.lapwin                      - Laplace window
+%   iosr.dsp.localpeaks                  - Find local peaks and troughs in a vector
+%   iosr.dsp.ltas                        - Calculate the long-term average spectrum of a signal
+%   iosr.dsp.matchEQ                     - Match the LTAS of a signal to an arbitrary spectral magnitude
+%   iosr.dsp.rcoswin                     - Raised cosine window
+%   iosr.dsp.rms                         - Calculate the rms of a vector or matrix
+%   iosr.dsp.sincFilter                  - Apply a near-ideal low-pass or band-pass brickwall filter
+%   iosr.dsp.smoothSpectrum              - Apply 1/N-octave smoothing to a frequency spectrum
+%   iosr.dsp.stft                        - Calculate the short-time Fourier transform of a signal
+%   iosr.dsp.vsmooth                     - Smooth a vector using mathematical functions
+%   
+%   MASSEF/LIBRARY/+IOSR/+FIGURES
+%   iosr.figures.chMap                   - Create a monochrome-compatible colour map
+%   iosr.figures.cmrMap                  - Create a monochrome-compatible colour map
+%   iosr.figures.multiwaveplot           - Stacked line plots from a matrix or vectors
+%   iosr.figures.subfigrid               - Create axis positions for subfigures
+%   
+%   MASSEF/LIBRARY/+IOSR/+GENERAL
+%   iosr.general.cell2csv                - Output a cell array to a CSV file
+%   iosr.general.checkMexCompiled        - Check if mex file is compiled for system
+%   iosr.general.getContents             - Get the contents of a specified directory
+%   iosr.general.updateContents          - Create a Contents.m file including subdirectories
+%   iosr.general.urn                     - Generate random number sequence without duplicates
+%   
+%   MASSEF/LIBRARY/+IOSR/+STATISTICS
+%   iosr.statistics.boxPlot              - Draw a box plot
+%   iosr.statistics.functionalSpreadPlot - Draw a functional plot showing data spread
+%   iosr.statistics.getRmse              - Calculate the root-mean-square error between input data
+%   iosr.statistics.laprnd               - Pseudorandom numbers drawn from the Laplace distribution
+%   iosr.statistics.qqPlot               - Quantile-quantile plot with patch option
+%   iosr.statistics.quantile             - Quantiles of a sample via various methods
+%   iosr.statistics.statsPlot            - An abstract superclass for classes that plot statistics
+%   iosr.statistics.tab2box              - Prepare tabular data for boxPlot function
+%   iosr.statistics.trirnd               - Pseudorandom numbers drawn from the triangular distribution
+%   
+%   MASSEF/LIBRARY/+IOSR/+SVN
+%   iosr.svn.buildSvnProfile             - Read data from files tagged with SVN keywords
+%   iosr.svn.headRev                     - Retrieve the head revision for specified files
+%   iosr.svn.readSvnKeyword              - Read data from a file tagged with an SVN keyword
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API
+%   history.txt
+%   readme.txt
+%   SOFAaddVariable
+%   SOFAappendText
+%   SOFAarghelper                        - Parse arguments for SOFA
+%   SOFAcalculateAPV
+%   SOFAcheckFilename
+%   SOFAcompact
+%   SOFAcompare                          - SOFASOFAcompare
+%   SOFAcompileConventions
+%   SOFAconvertCoordinates
+%   SOFAdbPath                           - DbPath=SOFAdbPath
+%   SOFAdbURL                            - DbURL=SOFAdbURL
+%   SOFAdefinitions
+%   SOFAexpand
+%   SOFAgetConventions
+%   SOFAgetVersion
+%   SOFAinfo                             - (Obj) gathers information about the SOFA object and display it
+%   SOFAload
+%   SOFAmerge
+%   SOFAplotGeometry                     - (Obj) plots the geometry found in the Obj
+%   SOFAplotHRTF                         - (OBJ, TYPE, CH) plots the CH channel of HRTFs given in OBJ
+%   SOFAsave
+%   SOFAspat
+%   SOFAstart
+%   SOFAupdateDimensions
+%   SOFAupgradeConventions               - SOFAcompatibility
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/CONVENTIONS
+%   GeneralFIR.csv
+%   GeneralFIRE.csv
+%   GeneralString.csv
+%   GeneralTF.csv
+%   MultiSpeakerBRIR.csv
+%   SimpleFreeFieldHRIR.csv
+%   SimpleFreeFieldSOS.csv
+%   SimpleFreeFieldTF.csv
+%   SimpleHeadphoneIR.csv
+%   SingleRoomDRIR.csv
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/CONVERTERS
+%   miro                                 - :: Measured Impulse Response Object
+%   SOFAconvertARI2SOFA                  - OBJ=SOFAconvertARI2SOFA(hM,meta,stimPar) converts the HRTFs described in hM, meta, and
+%   SOFAconvertBTDEI2SOFA                - OBJ=SOFAconvertBTDEI2SOFA(BTDEI) converts the HRTFs described in BT-DEI
+%   SOFAconvertCIPIC2SOFA                - Obj=SOFAconvertCIPIC2SOFA(CIPIC) converts the HRTFs described in the structure CIPIC
+%   SOFAconvertFHK2SOFA                  - OBJ=SOFAconvertFHK2SOFA(miroObj) converts the HRTFs described in miroObj
+%   SOFAconvertLISTEN2SOFA               - Obj=SOFAconvertLISTEN2SOFA(LISTEN, subjectID) converts the HRTFs described in LISTEN
+%   SOFAconvertMIT2SOFA                  - OBJ=SOFAconvertMIT2SOFA(root,pinna) loads the MIT HRTFs saved in a
+%   SOFAconvertSCUT2SOFA                 - OBJ=SOFAconvertSCUT2SOFA(root,pinna) loads the SCUT HRTFs saved in a
+%   SOFAconvertSOFA2ARI                  - OBJ=SOFAconvertSOFA2ARI(hM,meta,stimPar) converts the  HRTFs described in hM, meta, and
+%   SOFAconvertTUBerlin2SOFA             - OBJ=SOFAconvertTUBerlin2SOFA(irs) converts the HRTFs described in irs
+%   SOFAconvertTUBerlinBRIR2SOFA         - OBJ=SOFAconvertTUBerlin2SOFA(irs) converts the HRTFs described in irs
+%   SOFAhrtf2dtf                         - Converts HRTFs to DTFs (and CTFs)
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/COORDINATES
+%   hor2sph                              - Transform horizontal-polar to spherical coordinates
+%   nav2sph                              - Coordinate Transform
+%   sph2hor                              - Transform spherical to horizontal-polar coordinates
+%   sph2nav                              - Coordinate Transform
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/DEMOS
+%   demo_ARI2SOFA                        - SOFA API - demo script
+%   demo_BTDEI2SOFA                      - SOFA API demo script
+%   demo_CIPIC2SOFA                      - Copyright (C) 2012-2013 Acoustics Research Institute - Austrian Academy of Sciences;
+%   demo_FHK2SOFA                        - SOFA API - demo script
+%   demo_HpIR                            - SOFA API - demo script
+%   demo_LISTEN2SOFA                     - SOFA API - demo script
+%   demo_MIT2SOFA                        - SOFA API - demo script
+%   demo_SCUT2SOFA                       - SOFA API - demo script
+%   demo_SimpleFreeFieldHRIR2TF          - SOFA API - demo script
+%   demo_SingleRoomDRIROldenburg         - Demo for SingleRoomDRIR: save DRIR data from Uni Oldenburg (Office II) as
+%   demo_SOFA2ARI                        - SOFA API - demo script
+%   demo_SOFAexpandcompact               - SOFA API - demo script
+%   demo_SOFAHRTF2DTF                    - SOFA API - demo script
+%   demo_SOFAload                        - SOFA API - demo script
+%   demo_SOFAmerge                       - SOFA API - demo script
+%   demo_SOFAplotHRTF                    - - script demonstrating the usage of SOFAplotHRTF
+%   demo_SOFAsave
+%   demo_SOFAspat                        - SOFA API - demo script
+%   demo_SOFAstrings                     - Script for testing the string array feature of SOFA
+%   demo_SOFAvariables                   - SOFA API - script demonstrating the usage of variables in the API
+%   demo_TUBerlin2SOFA                   - SOFA API - demo script
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/HELPER
+%   deg2rad                              - Returns the given angle in radians
+%   isargchar                            - Tests if the given arg is a char and returns an error otherwise
+%   isargfile                            - Tests if the given arg is a file and returns an error otherwise
+%   isargstruct                          - Tests if the given arg is a struct and returns an error otherwise
+%   isoctave                             - True if the operating environment is octave
+%   rad2deg                              - Returns the given angle in degree
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/NETCDF
+%   NETCDFdisplay
+%   NETCDFload
+%   NETCDFsave
+%   
+%   MASSEF/LIBRARY/DEPS/SOFA_API/TEST
+%   test_SOFAall                         - SOFA API - test script
+%   
+%   MASSEF/UTILITIES
+%   wavread                              - Read an audio file
+%   wavwrite                             - Write an audio file
+%   
+%   MASSEF/UTILITIES/AMT
+%   amtauxdatapath                       - Path of the auxiliary data
+%   amtauxdataurl                        - URL of the auxiliary data
+%   amtbasepath                          - The base path of the AMT installation
+%   amtcache                             - Cache variables for later or retrieves variables from cache
+%   amtdisp                              - AMT-specific overload of the function 'disp'
+%   amtflags                             - Returns the start-up flags of the AMT
+%   amthelp                              - Help on the AMToolbox
+%   amtload                              - Load auxiliary data of a model
+%   amtmex                               - Compile Mex/Oct interfaces
+%   amtoolbox_version
+%   amtredofile                          - Determine if file should be redone
+%   amtstart                             - Start the Auditory Modeling Toolbox
+%   CHANGES.txt
+%   COPYING
+%   gpl-3.0.txt
+%   INSTALL
+%   README-for-SF.txt
+%   
+%   MASSEF/UTILITIES/AMT/ARG
+%   arg_absolutethreshold
+%   arg_adaptloop
+%   arg_amtcache
+%   arg_amtdisp
+%   arg_amtredofile
+%   arg_auditoryfilterbank
+%   arg_baumgartner2014                  - CP-Falgs:
+%   arg_dietz2011filterbank              - Parameters for filtering the haircell output
+%   arg_dietz2011interauralfunctions     - See Fig. 3c in Dietz (2011)
+%   arg_drnl                             - Parameters according to Lopez-Poveda and Meddis 2001
+%   arg_eicell                           - Temporal smoothing constant
+%   arg_ihcenvelope
+%   arg_langendijk2002comp
+%   arg_lindemann1986bincorr
+%   arginit
+%   
+%   MASSEF/UTILITIES/AMT/BINAURAL
+%   binauralinit
+%   breebaart2001preproc                 - Auditory model from Breebaart et. al. 2001
+%   dietz2011                            - Dietz 2011 binaural model
+%   enzner2008                           - Calculate HRIR set using the method of Enzner et al. (2008)
+%   georganti2013                        - Binaural spectral-magnitude difference standard deviation according to Georganti et al., (2013)
+%   lindemann1986                        - Calculates a binaural activation pattern
+%   lindemann1986centroid                - Calculates the centroid for a cross-correlation
+%   may2011                              - GMM-based estimation of azimuth direction for concurrent speakers
+%   takanen2013                          - Binaural auditory model by Takanen, Santala, and Pulkki 2013
+%   wierstorf2013                        - Estimate the localization within a WFS or stereo setup
+%   ziegelwanger2013                     - Time of arrival estimates
+%   ziegelwanger2013offaxis              - XXX
+%   ziegelwanger2013onaxis               - XXX
+%   ziegelwanger2014                     - Time of arrival estimates
+%   ziegelwanger2014offaxis              - Off-axis time-of-arrival model
+%   ziegelwanger2014onaxis               - On-axis time-of-arrival model
+%   
+%   MASSEF/UTILITIES/AMT/DEMOS
+%   demo_absolutethreshold               - Standards for absolute threshold of hearing
+%   demo_adaptloop                       - Show the effect of adaptation
+%   demo_baumgartner2013                 - Demo for sagittal-plane localization model from Baumgartner et al. (2013)
+%   demo_baumgartner2014                 - Demo for sagittal-plane localization model from Baumgartner et al. (2014)
+%   demo_drnl                            - Widening of filters in the DRNL
+%   demo_gammatone                       - Demo for gammatone.m
+%   demo_herzke2007                      - Filterbank example
+%   demo_hohmann2002                     - Filterbank example
+%   demo_jelfs2011                       - Binaural speech intelligibility advantage
+%   demo_joergensen2013                  - Demo for the multi-resolution speech-based envelope spectrum model
+%   demo_lindemann1986                   - Demo of the Lindemann binaural model
+%   demo_may2011                         - Demo of the model estimating the azimuths of concurrent speakers
+%   demo_takanen2013                     - Demo of the binaural model by Takanen, Santala and Pulkki
+%   demo_verhulst2012                    - Demo of the cochlear model calculating otoacoustic emissions
+%   demo_zilany2014                      - Demo of the Zilany et al., (2014) model
+%   demosinit
+%   
+%   MASSEF/UTILITIES/AMT/EXPERIMENTS
+%   exp_baumgartner2013                  - Figures from Baumgartner et al. (2013)
+%   exp_baumgartner2014                  - Figures from Baumgartner et al. (2014)
+%   exp_dietz2011                        - Experiments from Dietz et al. 2011
+%   exp_enzner2008                       - Creates figures like [Enzner2008, Fig. 2], [Enzner2009, Fig. 4]
+%   exp_gammatone                        - Creates various figures related to the Gammatone filters
+%   exp_georganti2013                    - Figures from Georganti et al. (2013)
+%   exp_hohmann2002                      - Figures from Hohmann (2012)
+%   exp_jelfs2011                        - Figures from Jelfs et al. (2011)
+%   exp_joergensen2011                   - Figures from Jørgensen and Dau (2011)
+%   exp_joergensen2013                   - Figures from Jørgensen, Ewert and Dau (2013)
+%   exp_langendijk2002                   - Experiment from Langendijk & Bronkhorst (2002)
+%   exp_lindemann1986                    - Figures from Lindemann (1986)
+%   exp_lopezpoveda2001                  - Figures from Lopez-Poveda and Meddis (2001)
+%   exp_roenne2012                       - Figures from Rønne et al. (2012)
+%   exp_spille2013                       - Experiments from Spille et al 2013. Model: Dietz et al 2011
+%   exp_takanen2013                      - Figures from Takanen, Santala, Pulkki (2013a,2013b)
+%   exp_verhulst2012                     - Compute figurs from the Verhulst paper
+%   exp_wierstorf2013                    - Figures from Wierstorf (2013)
+%   exp_ziegelwanger2013                 - Figures from Ziegelwanger and Majdak (2013)
+%   exp_ziegelwanger2014                 - Figures from Ziegelwanger and Majdak (2014)
+%   experimentsinit
+%   
+%   MASSEF/UTILITIES/AMT/FILTERS
+%   cqdft                                - FFT-based filter bank with constant relative bandwidth according
+%   Example_Filter                       - This example creates a 4th order gammatone filter with a center
+%   Example_Synthesis                    - This Example demonstrates how to create and how to use the combined
+%   filterbank_block                     - Process signal block in a filterbank
+%   filterbank_init                      - Wrapper around filter to multiple filters
+%   filterbankz                          - Filter bank with zero boundary condition
+%   filtersinit                          - P = mfilename('fullpath');
+%   gammatone                            - Gammatone filter coefficients
+%   gfb_analyzer_clear_state             - Reset filter states
+%   gfb_analyzer_new                     - Construct new analyzer object
+%   gfb_analyzer_process                 - Process input data
+%   gfb_analyzer_zresponse               - Frequency response
+%   gfb_delay_clear_state                - Clear delay lines
+%   gfb_delay_new                        - Create new delay object
+%   gfb_delay_process                    - Filterbank delay processing
+%   gfb_filter_clear_state               - Clear filters
+%   gfb_filter_new                       - Constructor of a cascaded gammatonefilter
+%   gfb_filter_process                   - Filter input data
+%   gfb_filter_zresponse                 - Filter response at freqenzy z
+%   gfb_mixer_new                        - Create new mixer
+%   gfb_mixer_process                    - [output, mixer] = gfb_mixer_process(mixer, input)
+%   gfb_set_constants                    - This file defines global constants for the matlab gammatone filterbank
+%   gfb_synthesizer_clear_state          - Synthesizer = gfb_synthesizer_clear_state(synthesizer)
+%   gfb_synthesizer_new                  - Create new synthesizer
+%   gfb_synthesizer_process              - [output, synthesizer] = gfb_synthesizer_process(synthesizer, input)
+%   may2011gammatone                     - Gammatone   Auditory filterbank
+%   may2011gammatoneinit                 - Initialize gammatone filterbank structure
+%   thirdoctrmsanalysis24                - THIRDOCTRMSANALYSIS  XXX Description
+%   ufilterbankz                         - Uniform Filter bank with zero boundary condition
+%   weightedaveragefilter                - Compute the weighted or self-weighted average
+%   
+%   MASSEF/UTILITIES/AMT/GENERAL
+%   audspecgram                          - Auditory spectrogram
+%   dbspl                                - RMS value of signal (in dB)
+%   extractsp                            - Sagittal plane (SP) HRTFs from measurement data
+%   generalinit
+%   itd2angle                            - Converts the given ITD to an angle using a lookup table
+%   itd2anglelookuptable                 - Generates an ITD-azimuth lookup table for the given HRTF set
+%   localizationerror                    - Compute psychoacoustic performance parameters for sound localization experiments
+%   modspecgram                          - Modulation spectrogram
+%   setdbspl                             - Set level of signal in dB
+%   sph2horpolar                         - From spherical to horizontal-polar coordinate system
+%   stmodspecgram                        - Spectro-Temporal Modulation spectrogram
+%   
+%   MASSEF/UTILITIES/AMT/HRTF
+%   hrtfinit
+%   
+%   MASSEF/UTILITIES/AMT/HRTF/BAUMGARTNER2013
+%   readme.txt
+%   
+%   MASSEF/UTILITIES/AMT/HRTF/BAUMGARTNER2014
+%   readme.txt
+%   
+%   MASSEF/UTILITIES/AMT/HRTF/WIERSTORF2013
+%   readme
+%   
+%   MASSEF/UTILITIES/AMT/HRTF/ZIEGELWANGER2013
+%   readme.txt
+%   
+%   MASSEF/UTILITIES/AMT/HRTF/ZIEGELWANGER2014
+%   readme.txt
+%   
+%   MASSEF/UTILITIES/AMT/HUMANDATA
+%   absolutethreshold                    - Absolute threshold at specified frequencies
+%   data_baumgartner2013                 - Data from Baumgartner et al. (2013)
+%   data_baumgartner2014                 - Data from Baumgartner et al. (2014)
+%   data_best2005                        - Listener averages of absolute polar angle error and SCC
+%   data_elberling2010                   - ABR wave V data as functon of level and sweeping rate
+%   data_glasberg1990                    - Notched-noise data for the ERB scale
+%   data_goode1994                       - Returns data points from the Goode et al. (1994) paper
+%   data_goupell2010                     - Localization performance in sagittal planes
+%   data_harte2009                       - Tone burst stimuli from Harte et al. (2009)
+%   data_joergensen2011                  - XXX
+%   data_langendijk2002                  - Data from Langendijk & Bronkhorst (2002)
+%   data_lindemann1986                   - Data points from the Lindemann (1986a) paper
+%   data_lopezpoveda2001                 - Data from Lopez-Poveda & Meddis (2001)
+%   data_macpherson2003                  - Listener averages of polar error rates
+%   data_majdak2010                      - Listener specific localization performance
+%   data_majdak2013                      - Listener specific localization in saggital planes
+%   data_majdak2013ctc                   - Listener-specific localization in sagittal planes
+%   data_middlebrooks1999                - Statistics about non-individualized HRTFs
+%   data_neely1988                       - ABR wave V data as functon of level and sweeping rate
+%   data_pralong1996                     - Head phone data from Pralong & Carlile (1996)
+%   data_roenne2012                      - Unitary response
+%   data_takanen2013                     - Data applied in the model by Takanen, Santala and Pulkki
+%   data_wierstorf2013                   - Data points from the Wierstorf (2013) book chapter
+%   data_ziegelwanger2013                - Data from Ziegelwanger and Majdak (2013)
+%   data_ziegelwanger2014                - Data from Ziegelwanger and Majdak (2014)
+%   data_zwicker1961                     - Data for the Bark scale
+%   humandatainit
+%   siiweightings                        - Compute the SII weightings
+%   speechpercentcorrect                 - Converts the overall SNRenv to percent correct
+%   
+%   MASSEF/UTILITIES/AMT/MEX
+%   comp_adaptloop.c
+%   comp_adaptloop                       - Computation of adaptation loops
+%   comp_karjalainen1996.c
+%   comp_may2011frameData.cpp
+%   comp_may2011frameData                - Private method, which is normally shadowed by the
+%   comp_may2011gammatone.cpp
+%   comp_may2011gammatone                - Comp_gammatone   Private method, which is normally shadowed by the
+%   comp_may2011xcorrNorm.cpp
+%   comp_may2011xcorrNorm                - Comp_xcorrNorm   Private method, which is normally shadowed by the
+%   comp_meddishaircell.c
+%   comp_zilany2007humanized.c
+%   comp_zilany2014_model_IHC.c
+%   comp_zilany2014_model_Synapse.c
+%   mexinit
+%   
+%   MASSEF/UTILITIES/AMT/MODELSTAGES
+%   adaptloop                            - Adaptation loops
+%   adaptloop_init                       - ADAPTLOOP   Adaptation loops
+%   adaptloop_run                        - COMP_ADAPTLOOP   Computation of adaptation loops
+%   auditoryfilterbank                   - Linear auditory filterbank
+%   baumgartner2013calibration           - Calibration of listener-specific sensitivity
+%   baumgartner2013pmv2ppp               - PMV to PPP conversion
+%   baumgartner2014calibration           - Calibration of listener-specific sensitivity thresholds to experimental performance
+%   baumgartner2014likelistat            - Likelihood estimation for evaluating model performance
+%   baumgartner2014parametrization       - - Joint optimization of model parameters
+%   baumgartner2014pmv2ppp               - PMV to PPP conversion
+%   baumgartner2014virtualexp            - Response patterns of virtual localization experiments
+%   culling2005bmld                      - Binaural Masking Level Difference
+%   dietz2011filterbank                  - Filterbank of Dietz 2011 binaural model
+%   dietz2011interauralfunctions         - Interaural stages of Dietz 2011
+%   dietz2011unwrapitd                   - Unwraps the given itd using the sign of the corresponding ild
+%   drnl                                 - Dual Resonance Nonlinear Filterbank
+%   eicell                               - Excitation-inhibition cell computation for the Breebaart model
+%   ffGn                                 - Fast (exact) fractional Gaussian noise and Brownian motion generator
+%   headphonefilter                      - Combined headphone and outer ear filter
+%   ihcenvelope                          - Inner hair cell envelope extration
+%   karjalainen1996                      - Non-linear adapation network
+%   langendijk2002comp                   - Comparison process according to Langendijk et al. (2002)
+%   lindemann1986bincorr                 - Cross-correlation between two input signals a la Lindemann
+%   may2011cbarlabel                     - Name   Short description..
+%   may2011classifyGMM                   - *********************  CHECK INPUT ARGUMENTS  ***********************
+%   may2011estAzimuth_GMM                - Select method for integrating localization information across time
+%   may2011findLocalPeaks                - FINDPEAKS finds peaks with optional quadratic interpolation [K,V]=(X,M,W)
+%   may2011fireprint                     - FIREPRINT Colormap that increases linearly in lightness (with colors)
+%   may2011frameData                     - FrameData   Frame data
+%   may2011interpolateParabolic          - InterpolateParabolic   Multi-channel parabolic interpolation
+%   may2011neuraltransduction            - Developed with Matlab 7.5.0.342 (R2007b). Please send bug reports to:
+%   may2011xcorrNorm                     - XcorrNorm   Normalized time-domain cross-correlation function
+%   mfc                                  - OLDFORMAT
+%   mfc2                                 - Generate all possible modulation frequencies
+%   middleearfilter                      - Middle ear filter
+%   modelstagesinit
+%   modfilterbank                        - Modulation filter bank
+%   modfilterbankepsm                    - Modulation filterbank, EPSM version
+%   optimaldetector                      - Generic optimal detector for the CASP and Breebaart models
+%   takanen2013contracomparison          - Enhanance the contrast between the hemispheres
+%   takanen2013cueconsistency            - Check the consistency before the cues are combined
+%   takanen2013directionmapping          - Map the directional cues to directions
+%   takanen2013formbinauralactivitymap   - Steer the "what" cues on a topographic map using the "where" cues
+%   takanen2013lso                       - Model of the lateral superior olive
+%   takanen2013mso                       - Model of the medial superior olive
+%   takanen2013onsetenhancement          - Emphasize the onsets on direction analysis
+%   takanen2013periphery                 - Process the input through the model of periphery
+%   takanen2013wbmso                     - Wideband MSO model
+%   wierstorf2013estimateazimuth         - Estimate the perceived azimuth using a binaural model
+%   
+%   MASSEF/UTILITIES/AMT/MONAURAL
+%   baumgartner2013                      - Model for sound localization in saggital planes
+%   baumgartner2014                      - Model for localization in saggital planes
+%   dau1996preproc                       - Auditory model from Dau et. al. 1996
+%   dau1997preproc                       - Auditory model from Dau et. al. 1997
+%   jepsen2008preproc                    - Auditory model from Jepsen et. al. 2008
+%   langendijk2002                       - Localization model according to Langendijk et al. (2002)
+%   langendijk2002likelihood             - Likelihood estimation for evaluating model performance
+%   monauralinit
+%   roenne2012                           - Simulates an ABR to any given stimulus
+%   roenne2012chirp                      - Simulate chirp evoked ABRs
+%   roenne2012click                      - Simulate ABR respone to click
+%   roenne2012tonebursts                 - Simulate tone burst evoked ABR wave V latencies
+%   verhulst2012                         - Process a signal with the cochlear model by Verhulst et. al. 2012
+%   viemeister1979                       - The Viemeister (1979) leaky-integrator model
+%   zilany2007humanized                  - Humanized auditory nerve model
+%   zilany2014                           - Auditory nerve (AN) model
+%   
+%   MASSEF/UTILITIES/AMT/OCT
+%   comp_adaptloop.cc
+%   comp_adaptloop_run.cc
+%   comp_meddishaircell.cc
+%   Makefile
+%   octinit
+%   
+%   MASSEF/UTILITIES/AMT/PLOT
+%   plot_baumgartner2013                 - Plot probabilistic prediction matrixes
+%   plot_baumgartner2014                 - Plot probabilistic prediction matrixes
+%   plot_baumgartner2014likelistat       - Plots likelihood statistics according to Langendijk et al. (2002)
+%   plot_joergensen2011                  - Plot Fig. 5 or 6 of Jørgensen and Dau (2011)
+%   plot_joergensen2013                  - Plot SRTs in the style of Fig. 2 from Joergensen et al., (2013)
+%   plot_langendijk2002                  - Plots pdf-matrixes with gray colormap according to Langendijk et al. (2002)
+%   plot_langendijk2002likelihood        - Likelihood statistics according to Langendijk et al. (2002)
+%   plot_lindemann1986                   - Plots the binaural output pattern of the lindemann model
+%   plot_roenne2012                      - Plot the output from the Roenne 2012 model
+%   plot_roenne2012chirp                 - Plot Fig. 6 or 7 of Rønne et al. (2012)
+%   plot_roenne2012tonebursts            - Plots Rønne et al. (2012) Fig. 5
+%   plot_ziegelwanger2013                - XXX Headline missing
+%   plot_ziegelwanger2014                - Plot time-of-arrival
+%   plotinit
+%   
+%   MASSEF/UTILITIES/AMT/SIGNALS
+%   bincorrnoise                         - Binaurally correlated noise
+%   bmsin                                - Generate a binaural modulated sinus
+%   competingtalkers                     - Load one of several test signals
+%   ildsin                               - Sinusoid with a interaural level difference (ILD)
+%   irns                                 - Generate iterated rippled noise
+%   itdildsin                            - Generate a sinusoid with a interaural time difference
+%   itdsin                               - Generate a sinusoid with a interaural time difference
+%   notchednoise                         - Generates a notched-noise-type masker
+%   perfectsweep                         - Create a sweep with constant magnitude spectrum
+%   signalsinit
+%   simulatedimpulseresponses            - Return a simulated impulse response
+%   transposedtone                       - Transposed tone test stimuli
+%   whitenoiseburst                      - Generate the noise signal used for the binaural model to predict the perceived
+%   
+%   MASSEF/UTILITIES/AMT/SPEECH
+%   jelfs2011                            - Predicted binaural advantage for speech in reverberant conditions
+%   joergensen2011                       - The speech-based envelope power spectrum model
+%   joergensen2011combineinformation     - Combine information
+%   joergensen2011multchansnrenv
+%   joergensen2011overlapadd3            - Y=OverlapAdd(X,A,W,S);
+%   joergensen2011PCtodSRT               - : calculates the SRT and change in SRT from the simulated percent correct
+%   joergensen2011sim                    - Simulate the experiments shown in figure 5 and 6 of Jørgensen and Dau (2011)
+%   joergensen2011specsub                - Usage: [output Nzeros] = joergensen2011sepsub(input,noise,W,padz,SP,factor,fs)
+%   joergensen2013                       - The multi-resolution sEPSM
+%   joergensen2013sim                    - Simulate the experiments shown in figure 2 of Jørgensen, Ewert and Dau (2013)
+%   speechinit
+%   taal2011                             - The Short-time objective intelligibility measure (STOI)
+%   
+%   MASSEF/UTILITIES/AMT/SRC
+%   adaptloop.c
+%   amtoolbox.h
+%   Makefile
+%   meddishaircell.c
+%   
+%   MASSEF/UTILITIES/AMT/SRC/VERHULST
+%   cochlea_utils.c
+%   cochlear_model.py
+%   make.bat
+%   makefile
+%   README.txt
+%   run_cochlear_model.py
+%   
+%   MASSEF/UTILITIES/AMT/SRC/VERHULST/OUT
+%   init
+%   
+%   MASSEF/UTILITIES/AMT/SRC/ZILANY5
+%   ANmodel                              - AN model - [Zilany, Bruce, Ibrahim and Carney] Auditory Nerve Model
+%   complex.c
+%   complex.h
+%   complex.hpp
+%   ffGn                                 - Fast (exact) fractional Gaussian noise and Brownian motion generator
+%   fitaudiogram2                        - Gives values of Cohc and Cihc that produce a desired
+%   mexANmodel
+%   model_IHC.c
+%   model_Synapse.c
+%   readme.txt
+%   testANModel                          - Model fiber parameters
+%   THRESHOLD_ALL_CAT.mat
+%   THRESHOLD_ALL_HUMAN.mat
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY
+%   deleteoutliers                       - [B, IDX, OUTLIERS] = DELETEOUTLIERS(A, ALPHA, REP)
+%   thirdpartyinit
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT
+%   AMTreadme.txt
+%   AUTHORS
+%   ChangeLog
+%   CITATION
+%   COPYING
+%   INSTALL
+%   INSTALL-Matlab
+%   INSTALL-Octave
+%   isoctave                             - True if the operating environment is octave
+%   ltfat_version
+%   ltfatarghelper                       - Parse arguments for LTFAT
+%   ltfatbasepath                        - The base path of the LTFAT installation
+%   ltfatgetdefaults                     - Get default parameters of function
+%   ltfathelp                            - Help on the LTFAT toolbox
+%   ltfatmex                             - Compile Mex/Oct interfaces
+%   ltfatsetdefaults                     - Set default parameters of function
+%   ltfatstart                           - Start the LTFAT toolbox
+%   ltfatstop                            - Stops the LTFAT toolbox
+%   mulaclab                             - Graphical interface for audio processing using frame multipliers
+%   NEWS
+%   README
+%   scalardistribute                     - Copy scalar to array shape for parameter handling
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/AUDITORY
+%   audfiltbw                            - Bandwidth of auditory filter
+%   auditoryinit
+%   audspace                             - Equidistantly spaced points on auditory scale
+%   audspacebw                           - Auditory scale points specified by bandwidth
+%   audtofreq                            - Converts auditory units to frequency (Hz)
+%   erbspace                             - Equidistantly spaced points on erbscale
+%   erbspacebw                           - Erbscale points specified by bandwidth
+%   erbtofreq                            - Converts erb units to frequency (Hz)
+%   freqtoaud                            - Converts frequencies (Hz) to auditory scale units
+%   freqtoerb                            - Converts frequencies (Hz) to erbs
+%   gammatonefir                         - Gammatone filter coefficients
+%   rangecompress                        - Compress the dynamic range of a signal
+%   rangeexpand                          - Expand the dynamic range of a signal
+%   semiaudplot                          - 2D plot on auditory scale
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/BLOCKPROC
+%   block                                - Initialize block stream
+%   blockana                             - Blockwise analysis interface
+%   blockdevices                         - Lists audio devices
+%   blockdone                            - Destroy the current blockstream
+%   blockfigure                          - Block figure object
+%   blockframeaccel                      - Precompute structures for block processing
+%   blockframepairaccel                  - Precompute structures for block processing
+%   blockpanel                           - Control panel
+%   blockpanelget                        - Get parameters from GUI
+%   blockplay                            - Schedules block to be played
+%   blockplot                            - Plot block coefficients
+%   blockprocinit                        - Add entry to the dynamic classpath if JVM is present
+%   blockread                            - Read one block from input
+%   blocksyn                             - Blockwise synthesis interface
+%   blockwrite                           - Append block to an existing file
+%   ltfatplay                            - Play data samples or a wav file
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/BLOCKPROC/JAVA
+%   blockproc.jar
+%   Makefile
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/BLOCKPROC/JAVA/NET/SOURCEFORGE/LTFAT
+%   ContFrame.java
+%   SpectFrame.java
+%   Utils.java
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/BLOCKPROC/JAVA/NET/SOURCEFORGE/LTFAT/THIRDPARTY
+%   JRangeSlider.java
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/BLOCKPROC/PRIVATE
+%   block_fwt                            - FWT func. wrapper for a block processing
+%   block_ifwt                           - IFWT wrapper for blockstream processing
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/COMP
+%   arg_filterbankdual
+%   arg_firwin
+%   arg_freqtoaud
+%   arg_fwt                              - Definput.flags.ext=  {'per','zpd','sym','symw','asym','asymw','ppd','sp0'};
+%   arg_fwt2
+%   arg_fwtcommon                        - Definput.flags.ansy = {'syn','ana'};
+%   arg_fwtext                           - Definput.flags.ext=  {'per','zpd','sym','symw','asym','asymw','ppd','sp0'};
+%   arg_groupthresh
+%   arg_ltfattranslate
+%   arg_normalize                        - Both 'null' and 'empty' do no scaling when normalize is called
+%   arg_pfilt
+%   arg_plotfilterbank
+%   arg_plotfwt
+%   arg_tfplot
+%   arg_thresh
+%   arg_uwfbtcommon                      - Filter scaling
+%   arg_wfbtcommon                       - Definput.keyvals.J = 1;
+%   assert_classname
+%   assert_groworder                     - Grow the order parameter
+%   assert_L                             - Validate lattice and window size
+%   assert_sigreshape_post               - Restore the original, permuted shape
+%   assert_sigreshape_pre                - Preprocess and handle dimension input
+%   assert_squarelat                     - Validate lattice and window size
+%   block_interface                      - Common block processing backend
+%   comp_atrousfilterbank_td             - Uniform filterbank by conv2
+%   comp_cellcoef2tf                     - Cell to a tf-layout
+%   comp_chirpzt                         - Use the decimation scheme
+%   comp_col2diag                        - Transforms columns to diagonals (in a special way)
+%   comp_constructphasereal              - Build the phase
+%   comp_dct                             - Calculates DCT
+%   comp_dgt                             - Compute a DGT
+%   comp_dgt_fb                          - Filter bank DGT
+%   comp_dgt_long                        - Gabor transform using long windows
+%   comp_dgt_ola
+%   comp_dgt_walnut                      - First step of full-window factorization of a Gabor matrix
+%   comp_dgtreal                         - Compute a DGTREAL
+%   comp_dgtreal_fb                      - Filter bank DGT
+%   comp_dgtreal_long                    - Full-window factorization of a Gabor matrix
+%   comp_dgtreal_ola
+%   comp_downs                           - Downsampling
+%   comp_dst                             - Calculates DST
+%   comp_dtwfb                           - First tree
+%   comp_dwilt                           - Compute Discrete Wilson transform
+%   comp_dwiltii                         - COMP_DWILT  Compute Discrete Wilson transform
+%   comp_dwiltiii                        - Compute Discrete Wilson transform type III
+%   comp_dwiltiv                         - Compute Discrete Wilson transform type IV
+%   comp_edgt6                           - Compute Even DGT type 6
+%   comp_extBoundary                     - EXTENDBOUNDARY Extends collumns
+%   comp_fftanalytic                     - Compute analytic representation
+%   comp_fftreal                         - Compute an FFTREAL
+%   comp_filterbank                      - Compute filtering
+%   comp_filterbank_a                    - Return sanitized a
+%   comp_filterbank_fft                  - Compute filtering in FD
+%   comp_filterbank_fftbl                - Compute filtering in FD
+%   comp_filterbank_pre                  - Return sanitized filterbank
+%   comp_filterbank_td                   - Non-uniform filterbank by conv2
+%   comp_filterbankphasegrad
+%   comp_filterbankreassign              - Compute reassigned frequencies and times
+%   comp_filterbankresponse              - G1 is done this way just so that we can determine the data type
+%   comp_filterbankscale                 - Do nothing
+%   comp_fourierwindow                   - Compute the window from numeric, text or cell array
+%   comp_framelength_fusion              - This is highly tricky: Get the minimal transform length for each
+%   comp_framelength_tensor              - Helper function for the Tensor frame
+%   comp_frana_fusion                    - All frames must use the same length signal
+%   comp_frana_tensor
+%   comp_frsyn_fusion
+%   comp_frsyn_tensor
+%   comp_fwt                             - Compute DWT using FWT
+%   comp_fwtpack2cell                    - Change FWT coef. format from pack to cell
+%   comp_gabdual_long                    - Compute dual window
+%   comp_gabmixdual_fac                  - Computes factorization of mix-dual
+%   comp_gabreassign                     - Reassign time-frequency distribution
+%   comp_gabtight_long                   - Compute tight window
+%   comp_gdgt                            - Compute generalized DGT
+%   comp_gfeigs                          - _SEP
+%   comp_gga                             - Generalized Goertzel Algorithm
+%   comp_hermite                         - Compute sampling of continuous Hermite function
+%   comp_hermite_all                     - Compute all Hermite functions up to an order
+%   comp_iatrousfilterbank_td            - Synthesis Uniform filterbank by conv2
+%   comp_idgt                            - Compute IDGT
+%   comp_idgt_fac                        - Full-window factorization of a Gabor matrix
+%   comp_idgt_fb                         - Filter bank IDGT
+%   comp_idgt_long                       - COMP_IDGT_FAC  Full-window factorization of a Gabor matrix
+%   comp_idgtreal                        - Compute IDGTREAL
+%   comp_idgtreal_fac                    - Full-window factorization of a Gabor matrix assuming
+%   comp_idgtreal_fb                     - COMP_IDGT_FB  Filter bank IDGT
+%   comp_idgtreal_long                   - COMP_IDGTREAL_FAC  Full-window factorization of a Gabor matrix assuming
+%   comp_idtwfb                          - Split the coefficients
+%   comp_idwilt                          - Compute Inverse discrete Wilson transform
+%   comp_idwiltii                        - Compute Inverse discrete Wilson transform type II
+%   comp_idwiltiii                       - Compute Inverse discrete Wilson transform type III
+%   comp_idwiltiv                        - Compute Inverse discrete Wilson transform type IV
+%   comp_iedgt6                          - Compute inverse even DGT type 6
+%   comp_ifftreal                        - Compute an IFFTREAL
+%   comp_ifilterbank                     - Compute inverse filterbank
+%   comp_ifilterbank_fft                 - Compute filtering in FD
+%   comp_ifilterbank_fftbl               - Compute filtering in FD
+%   comp_ifilterbank_td                  - Synthesis filterbank by conv2
+%   comp_ifwt                            - Compute Inverse DWT
+%   comp_igdgt                           - Compute IGDGT
+%   comp_inonsepdgt                      - Compute Inverse discrete Gabor transform
+%   comp_inonsepdgt_shear                - Compute IDGT
+%   comp_inonsepdgtreal_quinqux          - Compute Inverse discrete Gabor transform
+%   comp_insdgfb                         - Non-stationary Gabor filterbank synthesis
+%   comp_instcorrmat                     - Compute instantaneous correlation matrix
+%   comp_irdgt                           - Compute inverse real DGT
+%   comp_irdgtii                         - Compute inverse real DGT type II
+%   comp_irdgtiii                        - Compute inverse real DGT type III
+%   comp_isepdgt                         - Separable IDGT
+%   comp_isepdgtreal                     - Separable IDGT
+%   comp_iufilterbank_td                 - Synthesis Uniform filterbank by conv2
+%   comp_iufwt                           - Compute Inverse Undecimated DWT
+%   comp_iuwfbt                          - Compute Inverse Undecimated Wavelet Filter-Bank Tree
+%   comp_iuwpfbt                         - Compute Inverse Undecimated Wavelet Packet Filter-Bank Tree
+%   comp_iwfac                           - Compute inverse window factorization
+%   comp_iwfbt                           - Compute Inverse Wavelet Filter-Bank Tree
+%   comp_iwpfbt                          - COMP_IWFBT Compute Inverse Wavelet Packet Filter-Bank Tree
+%   comp_nonsepdgt_multi                 - Compute Non-separable Discrete Gabor transform
+%   comp_nonsepdgt_shear                 - Compute Non-separable Discrete Gabor transform
+%   comp_nonsepdgtreal_quinqux           - Compute Non-separable Discrete Gabor transform
+%   comp_nonsepwin2multi                 - Create multiwindow from non-sep win
+%   comp_nyquistfilt                     - High-pass filter for warped filter banks
+%   comp_painlessfilterbank
+%   comp_pchirp                          - Compute periodic chirp
+%   comp_pgauss                          - Sampled, periodized Gaussian
+%   comp_phasegradfilters                - Number of filters
+%   comp_quadtfdist                      - Compute quadratic time-frequency distribution
+%   comp_sepdgt                          - Separable DGT
+%   comp_sepdgtreal                      - Filter bank DGT
+%   comp_sigreshape_post
+%   comp_sigreshape_pre
+%   comp_transferfunction                - Compute the transfer function
+%   comp_ufilterbank_fft                 - Classic filtering by FFT
+%   comp_ufilterbank_td                  - Uniform filterbank by conv2
+%   comp_ufwt                            - Compute Undecimated DWT
+%   comp_ups                             - Upsampling
+%   comp_uwfbt                           - Compute Undecimated Wavelet Filterbank Tree
+%   comp_uwpfbt                          - Compute Undecimated Wavelet Packet Filterbank Tree
+%   comp_warpedfoff                      - Foff for warped filters
+%   comp_warpedfreqresponse              - Transfer function of warped filter
+%   comp_wfac                            - Compute window factorization
+%   comp_wfbt                            - Compute Wavelet Filterbank Tree
+%   comp_window                          - Compute the window from numeric, text or cell array
+%   comp_wpfbt                           - Compute Wavelet Packet Filterbank Tree
+%   comp_wpfbtscale                      - Scale filters in the filterbank tree
+%   comp_zerofilt                        - Low-pass filter for warped filter banks
+%   compinit
+%   complainif_isjavaheadless
+%   complainif_notenoughargs             - S: Not enough input arguments.',upper(callfun));
+%   complainif_notposint                 - S: %s should be a positive integer.',upper(callfun),varname);
+%   complainif_notvalidframeobj          - S: Agument F must be a frame definition structure.',..
+%   complainif_toomanyargs               - S: Too many input arguments.',upper(callfun));
+%   demo_blockproc_header                - S:\nTo run the demo, use one of the following:\n\n',..
+%   gabpars_from_window                  - Compute g and L from window
+%   gabpars_from_windowsignal            - Compute g and L from window and signal
+%   nonsepgabpars_from_window            - Compute g and L from window
+%   vect2cell                            - Vector to cell
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/DEMOS
+%   demo_audiocompression                - Audio compression using N-term approx
+%   demo_audiodenoise                    - Audio denoising using thresholding
+%   demo_audioshrink                     - Decomposition into tonal and transient parts
+%   demo_auditoryfilterbank              - Construct an auditory filterbank
+%   demo_audscales                       - Plot of the different auditory scales
+%   demo_blockproc_basicloop             - Basic real-time audio manipulation
+%   demo_blockproc_denoising             - Variable coefficients thresholding
+%   demo_blockproc_dgtequalizer          - Real-time audio manipulation in the transform domain
+%   demo_blockproc_effects               - Various vocoder effects using DGT
+%   demo_blockproc_paramequalizer        - Real-time equalizer demonstration
+%   demo_blockproc_slidingcqt            - Basic real-time rolling CQT-spectrogram visualization
+%   demo_blockproc_slidingerblets        - Basic real-time rolling erblet-spectrogram visualization
+%   demo_blockproc_slidingsgram          - Basic real-time rolling spectrogram visualization
+%   demo_bpframemul                      - Frame multiplier acting as a time-varying bandpass filter
+%   demo_dgt                             - Basic introduction to DGT analysis/synthesis
+%   demo_filterbanks                     - CQT, ERBLET and AUDLET filterbanks
+%   demo_filterbanksynchrosqueeze        - Filterbank synchrosqueezing and inversion
+%   demo_firwin
+%   demo_framemul                        - Time-frequency localization by a Gabor multiplier
+%   demo_frsynabs                        - Construction of a signal with a given spectrogram
+%   demo_gabfir                          - Working with FIR windows
+%   demo_gabmixdual                      - How to use GABMIXDUAL
+%   demo_gabmulappr                      - Approximate a slowly time variant system by a Gabor multiplier
+%   demo_imagecompression                - Image compression using N-term approximation
+%   demo_nextfastfft                     - Next fast FFT number
+%   demo_nsdgt                           - Non-stationary Gabor transform demo
+%   demo_ofdm                            - Demo of Gabor systems used for OFDM
+%   demo_pbspline                        - How to use PBSPLINE
+%   demo_pgauss                          - How to use PGAUSS
+%   demo_phaseplot                       - Give demos of nice phaseplots
+%   demo_phaseret                        - Phase retrieval and phase difference
+%   demo_wavelets                        - Wavelet filter banks
+%   demo_wfbt                            - Auditory filterbanks built using filterbank tree structures
+%   demosinit
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/DEPRECATED
+%   convolve                             - Convolution
+%   demo_gablasso                        - Sparse regression by Lasso method
+%   deprecatedinit
+%   framematrix                          - Frame synthesis operator matrix
+%   gabelitistlasso                      - Elitist LASSO regression in Gabor domain
+%   gabgrouplasso                        - Group LASSO regression in Gabor domain
+%   gablasso                             - LASSO regression in Gabor domain
+%   gabmul                               - Apply Gabor multiplier
+%   gabmuleigs                           - Eigenpairs of Gabor multiplier
+%   iufilterbank                         - Filter bank inversion, DEPRECATED
+%   iunsdgt                              - Inverse uniform non-stationary discrete Gabor transform
+%   iunsdgtreal                          - Inverse uniform non-stationary discrete Gabor transform
+%   tfmat                                - Matrix of transform / operator
+%   uwfbtbounds                          - Frame bounds of Undecimated WFBT
+%   uwpfbtbounds                         - Frame bounds of Undecimated WPFBT
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/FILTERBANK
+%   audfilters                           - Generates AUD-spaced filters
+%   cent_freqs                           - Determine relative center frequencies
+%   cqt                                  - Constant-Q non-stationary Gabor filterbank
+%   cqtfilters                           - CQT-spaced filters
+%   erbfilters                           - ERB-spaced filters
+%   erblett                              - ERBlet non-stationary Gabor filterbank
+%   filterbank                           - Apply filterbank
+%   filterbankbounds                     - Frame bounds of a filterbank
+%   filterbankdual                       - Dual filters
+%   filterbankfreqz                      - Filterbank frequency responses
+%   filterbankinit
+%   filterbanklength                     - Filterbank length from signal
+%   filterbanklengthcoef                 - Filterbank length from coefficients
+%   filterbankphasegrad                  - Phase gradient of a filterbank representation
+%   filterbankrealbounds                 - Frame bounds of filter bank for real signals only
+%   filterbankrealdual                   - Dual filters of filterbank for real signals only
+%   filterbankrealtight                  - Tight filters of filterbank for real signals only
+%   filterbankreassign                   - Reassign filterbank spectrogram
+%   filterbankresponse                   - Response of filterbank as function of frequency
+%   filterbanksynchrosqueeze             - Synchrosqueeze filterbank spectrogram
+%   filterbanktight                      - Tight filterbank
+%   filterbankwin                        - Compute set of filter bank windows from text or cell array
+%   icqt                                 - Constant-Q non-stationary Gabor synthesis
+%   ierblett                             - ERBlet non-stationary Gabor synthesis
+%   ifilterbank                          - Filter bank inversion
+%   nonu2ucfmt                           - Non-uniform to uniform filterbank coefficient format
+%   nonu2ufilterbank                     - Non-uniform to uniform filterbank transform
+%   plotfilterbank                       - Plot filterbank and ufilterbank coefficients
+%   u2nonucfmt                           - Uniform to non-uniform filterbank coefficient format
+%   ufilterbank                          - Apply Uniform filterbank
+%   warpedfilters                        - Frequency-warped band-limited filters
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/FOURIER
+%   ceil23                               - Next number with only 2,3 factors
+%   ceil235                              - Next number with only 2,3 and 5 factors
+%   chirpzt                              - Chirped Z-transform
+%   dcti                                 - Discrete Cosine Transform type I
+%   dctii                                - Discrete Consine Transform type II
+%   dctiii                               - Discrete Consine Transform type III
+%   dctiv                                - Discrete Consine Transform type IV
+%   dctresample                          - Resample signal using Fourier interpolation
+%   dfracft                              - Discrete Fractional Fourier transform
+%   dft                                  - Normalized Discrete Fourier Transform
+%   dsti                                 - Discrete Sine Transform type I
+%   dstii                                - Discrete Sine Transform type II
+%   dstiii                               - Discrete sine transform type III
+%   dstiv                                - Discrete Sine Transform type IV
+%   expwave                              - Complex exponential wave
+%   ffracft                              - Approximate fast fractional Fourier transform
+%   fftanalytic                          - Compute analytic representation
+%   fftgram                              - Plot the energy of the discrete Fourier transform
+%   fftindex                             - Frequency index of FFT modulations
+%   fftreal                              - FFT for real valued input data
+%   fftresample                          - Resample signal using Fourier interpolation
+%   floor23                              - Previous number with only 2,3 factors
+%   floor235                             - Previous number with only 2,3 and 5 factors
+%   fourierinit
+%   gga                                  - Generalized Goertzel algorithm
+%   hermbasis                            - Orthonormal basis of discrete Hermite functions
+%   idft                                 - Inverse normalized Discrete Fourier Transform
+%   ifftreal                             - Inverse FFT for real valued signals
+%   involute                             - Involution
+%   isevenfunction                       - True if function is even
+%   lconv                                - Linear convolution
+%   lxcorr                               - Linear crosscorrelation
+%   middlepad                            - Symmetrically zero-extends or cuts a function
+%   modcent                              - Centered modulo
+%   nextfastfft                          - Next higher number with a fast FFT
+%   pbspline                             - Periodized B-spline
+%   pchirp                               - Periodic chirp
+%   pconv                                - Periodic convolution
+%   pderiv                               - Derivative of smooth periodic function
+%   peven                                - Even part of periodic function
+%   pgauss                               - Sampled, periodized Gaussian
+%   pheaviside                           - Periodic Heaviside function
+%   pherm                                - Periodized Hermite function
+%   plotfft                              - Plot the output from FFT
+%   plotfftreal                          - Plot the output from FFTREAL
+%   podd                                 - Odd part of periodic function
+%   prect                                - Periodic rectangle
+%   psech                                - Sampled, periodized hyperbolic secant
+%   psinc                                - Periodic Sinc function (Dirichlet function)
+%   pxcorr                               - Periodic cross correlation
+%   shah                                 - Discrete Shah-distribution
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/FRAMES
+%   frame                                - Construct a new frame
+%   frameaccel                           - Precompute structures
+%   framebounds                          - Frame bounds
+%   frameclength                         - Number of coefficients from length of signal
+%   framecoef2native                     - Convert coefficients to native format
+%   framecoef2tf                         - Convert coefficients to time-frequency plane
+%   framecoef2tfplot                     - Convert coefficients to time-frequency plane matrix
+%   framediag                            - Compute the diagonal of the frame operator
+%   framedual                            - Construct the canonical dual frame
+%   framegram                            - Easy visualization of energy in transform domain
+%   framelength                          - Frame length from signal
+%   framelengthcoef                      - Frame length from coefficients
+%   framenative2coef                     - Convert coefficient from native format
+%   frameoperator                        - Frame Operator
+%   framepair                            - Construct a new frame
+%   framered                             - Redundancy of a frame
+%   framesinit
+%   frametf2coef                         - Convert coefficients from TF-plane format
+%   frametight                           - Construct the canonical tight frame
+%   frana                                - Frame analysis operator
+%   franabp                              - Frame Analysis Basis Pursuit
+%   franagrouplasso                      - Group LASSO regression in the TF-domain
+%   franaiter                            - Iterative analysis
+%   franalasso                           - Frame LASSO regression
+%   frgramian                            - Frame Gramian operator
+%   frsyn                                - Frame synthesis operator
+%   frsynabs                             - Reconstruction from magnitude of coefficients
+%   frsyniter                            - Iterative synthesis
+%   frsynmatrix                          - Frame synthesis operator matrix
+%   plotframe                            - Plot frame coefficients
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/GABOR
+%   col2diag                             - Move columns of a matrix to diagonals
+%   constructphase                       - Construct phase for DGT
+%   constructphasereal                   - Construct phase for DGTREAL
+%   dgt                                  - Discrete Gabor transform
+%   dgt2                                 - 2-D Discrete Gabor transform
+%   dgtlength                            - DGT length from signal
+%   dgtreal                              - Discrete Gabor transform for real-valued signals
+%   dsft                                 - Discrete Symplectic Fourier Transform
+%   dwilt                                - Discrete Wilson transform
+%   dwilt2                               - 2D Discrete Wilson transform
+%   dwiltlength                          - DWILT/WMDCT length from signal
+%   gabconvexopt                         - Compute a window using convex optimization
+%   gabdual                              - Canonical dual window of Gabor frame
+%   gabdualnorm                          - Measure of how close a window is to being a dual window
+%   gabfirdual                           - Compute FIR dual window
+%   gabfirtight                          - Compute FIR tight window
+%   gabframebounds                       - Calculate frame bounds of Gabor frame
+%   gabframediag                         - Diagonal of Gabor frame operator
+%   gabimagepars                         - Find Gabor parameters to generate image
+%   gabmixdual                           - Computes the mixdual of g1
+%   gaboptdual                           - Compute dual window
+%   gabopttight                          - Compute a optimized tight window
+%   gaborinit
+%   gabphasederiv                        - DGT phase derivatives
+%   gabphasegrad                         - Phase gradient of the DGT
+%   gabprojdual                          - Gabor Dual window by projection
+%   gabreassign                          - Reassign time-frequency distribution
+%   gabreassignadjust                    - Adjustable reassignment of a time-frequency distribution
+%   gabrieszbounds                       - Calculate Riesz sequence/basis bounds of Gabor frame
+%   gabtight                             - Canonical tight window of Gabor frame
+%   gabwin                               - Compute a Gabor window from text or cell array
+%   idgt                                 - Inverse discrete Gabor transform
+%   idgt2                                - 2D Inverse discrete Gabor transform
+%   idgtreal                             - Inverse discrete Gabor transform for real-valued signals
+%   idwilt                               - Inverse discrete Wilson transform
+%   idwilt2                              - 2D Inverse Discrete Wilson transform
+%   instfreqplot                         - Plot of instantaneous frequency
+%   isgram                               - Spectrogram inversion
+%   isgramreal                           - Spectrogram inversion (real signal)
+%   iwmdct                               - Inverse MDCT
+%   iwmdct2                              - 2D Inverse windowed MDCT transform
+%   izak                                 - Inverse Zak transform
+%   latticetype2matrix                   - Convert lattice description to matrix form
+%   longpar                              - Parameters for LONG windows
+%   matrix2latticetype                   - Convert matrix form to standard lattice description
+%   noshearlength                        - Transform length that does not require a frequency shear
+%   phaselock                            - Phaselock Gabor coefficients
+%   phaselockreal                        - Phaselock Gabor coefficients
+%   phaseplot                            - Phase plot
+%   phaseunlock                          - Undo phase lock of Gabor coefficients
+%   phaseunlockreal                      - Undo phase lock of Gabor coefficients
+%   plotdgt                              - Plot DGT coefficients
+%   plotdgtreal                          - Plot DGTREAL coefficients
+%   plotdwilt                            - Plot DWILT coefficients
+%   plotwmdct                            - Plot WMDCT coefficients
+%   proj_dual                            - Projection onto the dual windows space
+%   projkern                             - Projection onto generating kernel space
+%   rect2wil                             - Inverse of WIL2RECT
+%   resgram                              - Reassigned spectrogram plot
+%   s0norm                               - S0-norm of signal
+%   sgram                                - Spectrogram
+%   shearfind                            - Shears for transformation of a general lattice to separable
+%   symphase                             - Change Gabor coefficients to symmetric phase
+%   tconv                                - Twisted convolution
+%   tfplot                               - Plot coefficient matrix on the TF plane
+%   wil2rect                             - Arrange Wilson coefficients in a rectangular layout
+%   wilbounds                            - Calculate frame bounds of Wilson basis
+%   wildual                              - Wilson dual window
+%   wilframediag                         - Diagonal of Wilson and WMDCT frame operator
+%   wilorth                              - Wilson orthonormal window
+%   wilwin                               - Compute a Wilson/WMDCT window from text or cell array
+%   wmdct                                - Windowed MDCT transform
+%   wmdct2                               - 2D Discrete windowed MDCT transform
+%   zak                                  - Zak transform
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT
+%   comptarget.mk
+%   filedefs.mk
+%   Makefile
+%   ostools.mk
+%   README.md
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/DOC
+%   doxyconfig
+%   doxymain.md
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/DOC/HTMLTEMPLATE
+%   customdoxygen.css
+%   footer.html
+%   header.html
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/DOC/MATHJAXINCLUDE
+%   macros.js
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/DOC/TEXINCLUDE
+%   macros.tex
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/EXAMPLES
+%   example_gabanasyn.c
+%   Makefile
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/INCLUDE
+%   ltfat.h
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/INCLUDE/LTFAT
+%   ciutils.h
+%   config.h
+%   dgt_long.h
+%   dgt_multi.h
+%   dgt_shear.h
+%   goertzel.h
+%   heapint.h
+%   ltfat_blaslapack.h
+%   ltfat_typecomplexindependent.h
+%   ltfat_typeconstant.h
+%   ltfat_typeindependent.h
+%   ltfat_types.h
+%   reassign_typeconstant.h
+%   wavelets.h
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/LTFATCOMPAT
+%   bootstrap
+%   configure.ac
+%   Makefile_crossmingw
+%   Makefile_mac
+%   Makefile_mingw
+%   Makefile_octpkg.in
+%   Makefile_unix
+%   README
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/LTFATCOMPAT/M4
+%   ax_blas.m4
+%   ax_lapack.m4
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/LTFATCOMPAT/UTILS
+%   dbg.h
+%   lcthw_List.h
+%   list.c
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/SRC
+%   c-safe-memalloc.c
+%   ciutils.c
+%   dct.c
+%   dgt.c
+%   dgt_fac.c
+%   dgt_fb.c
+%   dgt_multi.c
+%   dgt_ola.c
+%   dgt_shear.c
+%   dgt_shearola.c
+%   dgt_walnut.c
+%   dgtreal_fac.c
+%   drivers.c
+%   dst.c
+%   dwilt.c
+%   fftreal.c
+%   filterbank.c
+%   gabdual.c
+%   gabdual_fac.c
+%   gabtight.c
+%   gabtight_fac.c
+%   goertzel.c
+%   heapint.c
+%   idgt.c
+%   idgt_fac.c
+%   idgt_fb.c
+%   idwilt.c
+%   ifilterbank.c
+%   integer_manip.c
+%   iwfac.c
+%   iwmdct.c
+%   ltfat_blaslapack.c
+%   ltfat_complexindependent.c
+%   ltfat_complexindependent_bl.c
+%   pfilt.c
+%   reassign.c
+%   reassign_ti.c
+%   reassign_typeconstant.c
+%   spread.c
+%   wavelets.c
+%   wfac.c
+%   windows.c
+%   winmanip.c
+%   wmdct.c
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/LIBLTFAT/THIRDPARTY
+%   cblas.h
+%   f77-fcn.h
+%   fftw3.h
+%   portaudio.h
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/MEX
+%   block_interface.c
+%   block_interface.h
+%   comp_atrousfilterbank_td.c
+%   comp_cellcoef2tf.c
+%   comp_chirpzt.c
+%   comp_col2diag.c
+%   comp_dct.c
+%   comp_dgt_ola.c
+%   comp_dgtreal_ola.c
+%   comp_dst.c
+%   comp_dwilt.c
+%   comp_dwiltiii.c
+%   comp_fftreal.c
+%   comp_filterbank.c
+%   comp_filterbank_fft.c
+%   comp_filterbank_fftbl.c
+%   comp_filterbank_td.c
+%   comp_filterbankphasegrad.c
+%   comp_filterbankreassign.c
+%   comp_gabdual_long.c
+%   comp_gabreassign.c
+%   comp_gabtight_long.c
+%   comp_gga.c
+%   comp_heapint.c
+%   comp_heapintreal.c
+%   comp_iatrousfilterbank_td.c
+%   comp_idwilt.c
+%   comp_idwiltiii.c
+%   comp_ifftreal.c
+%   comp_ifilterbank.c
+%   comp_ifilterbank_fft.c
+%   comp_ifilterbank_fftbl.c
+%   comp_ifilterbank_td.c
+%   comp_isepdgt.c
+%   comp_isepdgtreal.c
+%   comp_iwfac.c
+%   comp_maskedheapint.c
+%   comp_maskedheapintreal.c
+%   comp_nonsepdgt_multi.c
+%   comp_nonsepdgt_shear.c
+%   comp_nonsepdgt_shearola.c
+%   comp_nonsepwin2multi.c
+%   comp_pchirp.c
+%   comp_pgauss.c
+%   comp_sepdgt.c
+%   comp_sepdgtreal.c
+%   comp_ufilterbank_fft.c
+%   comp_wfac.c
+%   config.h
+%   filedefs.mk
+%   ltfat_mex_template_helper.h
+%   ltfat_mex_typecomplexindependent.h
+%   ltfat_mex_typeindependent.h
+%   ltfatarghelper.c
+%   ltfatarghelper.h
+%   Makefile_mac
+%   Makefile_mingw
+%   Makefile_unix
+%   mex-memalloc.c
+%   mexinit
+%   postpad                              - Pads or truncates a vector x to a specified length L
+%   vect2cell.c
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/MULACLAB/ICONS
+%   apply.png
+%   colormap.png
+%   difference.png
+%   freehand.png
+%   intersection.png
+%   loop.png
+%   magicwand.png
+%   pan.png
+%   play.png
+%   resizebutton.png
+%   showsymbol.png
+%   stop.png
+%   subbandsel.png
+%   union.png
+%   zoomin.png
+%   zoomout.png
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/NONSTATGAB
+%   insdgt                               - Inverse non-stationary discrete Gabor transform
+%   insdgtreal                           - Inverse NSDGT for real-valued signals
+%   nonstatgabinit
+%   nsdgt                                - Non-stationary Discrete Gabor transform
+%   nsdgtlength                          - NSDGT length from signal
+%   nsdgtreal                            - Non-stationary Discrete Gabor transform for real valued signals
+%   nsgabdual                            - Canonical dual window for non-stationary Gabor frames
+%   nsgabframebounds                     - Frame bounds of non-stationary Gabor frame
+%   nsgabframediag                       - Diagonal of Gabor frame operator
+%   nsgabtight                           - Canonical tight window for non-stationary Gabor frames
+%   nsgabwin                             - Compute a set of non-stationary Gabor windows from text or cell array
+%   plotnsdgt                            - Plot non-stationary Gabor coefficients
+%   plotnsdgtreal                        - Plot NSDGTREAL coefficients
+%   unsdgt                               - Uniform Non-stationary Discrete Gabor transform
+%   unsdgtreal                           - Uniform non-stationary Discrete Gabor transform
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/OCT
+%   comp_atrousfilterbank_td.cc
+%   comp_cellcoef2tf.cc
+%   comp_chirpzt.cc
+%   comp_col2diag.cc
+%   comp_dct.cc
+%   comp_dgt_ola.cc
+%   comp_dgtreal_ola.cc
+%   comp_dst.cc
+%   comp_dwilt.cc
+%   comp_dwiltiii.cc
+%   comp_filterbank_fft.cc
+%   comp_filterbank_fftbl.cc
+%   comp_filterbank_td.cc
+%   comp_filterbankreassign.cc
+%   comp_gabdual_long.cc
+%   comp_gabreassign.cc
+%   comp_gabtight_long.cc
+%   comp_gga.cc
+%   comp_heapint.cc
+%   comp_heapintreal.cc
+%   comp_iatrousfilterbank_td.cc
+%   comp_idwilt.cc
+%   comp_idwiltiii.cc
+%   comp_ifilterbank_fft.cc
+%   comp_ifilterbank_fftbl.cc
+%   comp_ifilterbank_td.cc
+%   comp_isepdgt.cc
+%   comp_isepdgtreal.cc
+%   comp_iwfac.cc
+%   comp_maskedheapint.cc
+%   comp_maskedheapintreal.cc
+%   comp_nonsepdgt_multi.cc
+%   comp_nonsepdgt_shear.cc
+%   comp_nonsepwin2multi.cc
+%   comp_pchirp.cc
+%   comp_pgauss.cc
+%   comp_sepdgt.cc
+%   comp_sepdgtreal.cc
+%   comp_ufilterbank_fft.cc
+%   comp_wfac.cc
+%   config.h
+%   ltfat_oct_template_helper.h
+%   Makefile_mac
+%   Makefile_mingwoct
+%   Makefile_unix
+%   oct-memalloc.c
+%   octinit
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/OCT/MEXHELP
+%   block_interface
+%   comp_filterbank
+%   comp_ifilterbank
+%   ltfatarghelper
+%   playrec
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/OPERATORS
+%   framemul                             - Frame multiplier
+%   framemuladj                          - Adjoint operator of frame multiplier
+%   framemulappr                         - Best Approximation of a matrix by a frame multiplier
+%   framemuleigs                         - Eigenpairs of frame multiplier
+%   gabmulappr                           - Best Approximation by a Gabor multiplier
+%   iframemul                            - Inverse of frame multiplier
+%   ioperator                            - Apply inverse of operator
+%   operator                             - Apply operator
+%   operatoradj                          - Apply the adjoint of an operator
+%   operatorappr                         - Best approximation by operator
+%   operatoreigs                         - Apply the adjoint of an operator
+%   operatormatrix                       - Matrix representation of an operator
+%   operatornew                          - Construct a new operator
+%   operatorsinit
+%   spreadadj                            - Symbol of adjoint spreading function
+%   spreadeigs                           - Eigenpairs of Spreading operator
+%   spreadfun                            - Spreading function of a matrix
+%   spreadinv                            - Apply inverse spreading operator
+%   spreadop                             - Spreading operator
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/QUADRATIC
+%   ambiguityfunction                    - Ambiguity function
+%   drihaczekdist                        - Discrete Rihaczek distribution
+%   plotquadtfdist                       - Plot quadratic time-frequency distribution
+%   quadraticinit
+%   quadtfdist                           - Quadratic time-frequency distribution
+%   wignervilledist                      - Wigner-Ville distribution
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/SIGNALS
+%   bat.asc
+%   bat                                  - Load the 'bat' test signal
+%   batmask.asc
+%   batmask                              - Load a Gabor multiplier symbol for the 'bat' test signal
+%   cameraman                            - Load the 'cameraman' test image
+%   cameraman.png
+%   Clar.wav
+%   cocktailparty                        - Load the 'cocktailparty' test signal
+%   cocktailparty.wav
+%   ctestfun                             - Complex 1-D test function
+%   expchirp                             - Exponential chirp
+%   greasy                               - Load the 'greasy' test signal
+%   greasy.wav
+%   gspi                                 - Load the 'glockenspiel' test signal
+%   gspi.wav
+%   lichtenstein                         - Load the 'lichtenstein' test image
+%   lichtenstein.png
+%   linus                                - Load the 'linus' test signal
+%   linus.wav
+%   ltfatlogo                            - Load the 'ltfatlogo' test signal
+%   ltfatlogo.wav
+%   ltfattext                            - Load the 'ltfattext' test image
+%   ltfattext.png
+%   noise                                - Stochastic noise generator
+%   otoclick.asc
+%   otoclick                             - Load the 'otoclick' test signal
+%   Piano2.wav
+%   pinknoise                            - Generates a pink noise signal
+%   signalsinit
+%   traindoppler                         - Load the 'traindoppler' test signal
+%   traindoppler.wav
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/SIGPROC
+%   blfilter                             - Construct a band-limited filter
+%   crestfactor                          - Crest factor of input signal in dB
+%   dynlimit                             - Limit the dynamical range of the input
+%   elitistthresh                        - Elitist (hard/soft) thresholding
+%   fir2long                             - Extend FIR window to LONG
+%   firfilter                            - Construct an FIR filter
+%   firkaiser                            - Kaiser-Bessel window
+%   firwin                               - FIR window
+%   gaindb                               - Increase/decrease level of signal
+%   groupthresh                          - Group thresholding
+%   iqam4                                - Inverse QAM of order 4
+%   jpeg2rgb                             - Coverts from RGB format to YCbCr format
+%   largestn                             - Keep N largest coefficients
+%   largestr                             - Keep fixed ratio of largest coefficients
+%   long2fir                             - Cut LONG window to FIR
+%   magresp                              - Magnitude response plot of window
+%   normalize                            - Normalize input signal by specified norm
+%   pfilt                                - Apply filter with periodic boundary conditions
+%   pgrpdelay                            - Group delay of a filter with periodic boundaries
+%   qam4                                 - Quadrature amplitude modulation of order 4
+%   rampdown                             - Falling ramp function
+%   rampsignal                           - Ramp signal
+%   rampup                               - Rising ramp function
+%   rgb2jpeg                             - Coverts from RGB format to the YCbCr format used by JPEG
+%   rms                                  - RMS value of signal
+%   sigprocinit
+%   thresh                               - Coefficient thresholding
+%   transferfunction                     - The transferfunction of a filter
+%   uquant                               - Simulate uniform quantization
+%   warpedblfilter                       - Construct a warped band-limited filter
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/THIRDPARTY/GPC
+%   GPC-README.pdf
+%   gpc.c
+%   gpc.h
+%   VERSIONS.TXT
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/THIRDPARTY/PLAYREC
+%   config.h
+%   filtcoefs.h
+%   genfiltcoefs                         - Generate half-band IIR filter
+%   license_playrec.txt
+%   ltfatresample.c
+%   ltfatresample.h
+%   Makefile_mac
+%   Makefile_macoct
+%   Makefile_mingw
+%   Makefile_mingwoct
+%   Makefile_unix
+%   Makefile_unixoct
+%   mex_dll_core.c
+%   mex_dll_core.h
+%   pa_dll_playrec.c
+%   pa_dll_playrec.h
+%   playrecinit
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/THIRDPARTY/POLYGONCLIP
+%   license.txt
+%   Makefile_mac
+%   Makefile_mingw
+%   Makefile_unix
+%   PolygonClip.c
+%   PolygonClip.h
+%   polygonclipinit
+%   ReadMe.txt
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/THIRDPARTY/VOICEBOX
+%   voicebox_ditherq                     - DITHERQ  add dither and quantize [Y,ZF]=(X,M,ZI)
+%   voicebox_pcma2lin                    - PCMU2LIN Convert A-law PCM to linear X=(P,M,S)
+%   voicebox_pcmu2lin                    - PCMU2LIN Convert Mu-law PCM to linear X=(P,S)
+%   voiceboxinit
+%   wavload                              - Read a .WAV format sound file [Y,FS,WMODE,FIDX]=(FILENAME,MODE,NMAX,NSKIP)
+%   wavsave                              - Creates .WAV format sound files FIDX=(D,FS,FILENAME,MODE,NSKIP,MASK)
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/WAVELETS
+%   dtwfb                                - Dual-Tree Wavelet Filter Bank
+%   dtwfb2filterbank                     - DTWFB equivalent non-iterated filterbank
+%   dtwfbbounds                          - Frame bounds of DTWFB
+%   dtwfbinit                            - Dual-Tree Wavelet Filterbank Initialization
+%   dtwfbreal                            - Dual-Tree Wavelet FilterBank for real-valued signals
+%   fwt                                  - Fast Wavelet Transform
+%   fwt2                                 - Fast Wavelet Transform 2D
+%   fwtclength                           - FWT subbands lengths from a signal length
+%   fwtinit                              - Wavelet Filterbank Structure Initialization
+%   fwtlength                            - FWT length from signal
+%   idtwfb                               - Inverse Dual-tree Filterbank
+%   idtwfbreal                           - Inverse Dual-tree Filterbank for real-valued signals
+%   ifwt                                 - Inverse Fast Wavelet Transform
+%   ifwt2                                - Inverse Fast Wavelet Transform
+%   iufwt                                - Inverse Undecimated Fast Wavelet Transform
+%   iuwfbt                               - Inverse Undecimated Wavelet Filterbank Tree
+%   iuwpfbt                              - Inverse Undecimated Wavelet Packet Filterbank Tree
+%   iwfbt                                - Inverse Wavelet Filterbank Tree
+%   iwpfbt                               - Inverse Wavelet Packet Filterbank Tree
+%   plotwavelets                         - Plot wavelet coefficients
+%   ufwt                                 - Undecimated Fast Wavelet Transform
+%   uwfbt                                - Undecimated Wavelet FilterBank Tree
+%   uwpfbt                               - Undecimated Wavelet Packet FilterBank Tree
+%   wavcell2pack                         - Changes wavelet coefficients storing format
+%   waveletsinit
+%   wavfun                               - Wavelet Function
+%   wavpack2cell                         - Changes wavelet coefficients storing format
+%   wfbt                                 - Wavelet FilterBank Tree
+%   wfbt2filterbank                      - WFBT equivalent non-iterated filterbank
+%   wfbtbounds                           - Frame bounds of WFBT
+%   wfbtclength                          - WFBT subband lengths from a signal length
+%   wfbtinit                             - Initialize Filterbank Tree
+%   wfbtlength                           - WFBT length from signal
+%   wfbtput                              - Put node to the filterbank tree
+%   wfbtremove                           - Remove node(s) from the filterbank tree
+%   wfilt_algmband                       - An ALGebraic construction of orthonormal M-BAND wavelets with perfect reconstruction
+%   wfilt_cmband                         - Generates M-Band cosine modulated wavelet filters
+%   wfilt_coif                           - Coiflets
+%   wfilt_db                             - Daubechies FIR filterbank
+%   wfilt_dden                           - Double-DENsity DWT filters (tight frame)
+%   wfilt_ddena                          - Double-Density Dual-Tree DWT filters
+%   wfilt_ddenb                          - Double-Density Dual-Tree DWT filters
+%   wfilt_dgrid                          - Dense GRID framelets (tight frame, symmetric)
+%   wfilt_hden                           - Higher DENsity dwt filters (tight frame, frame)
+%   wfilt_lemarie                        - Battle and Lemarie filters
+%   wfilt_matlabwrapper                  - Wrapper of the Matlab Wavelet Toolbox wfilters function
+%   wfilt_mband                          - Generates 4-band coder
+%   wfilt_oddevena                       - Kingsbury's symmetric even filters
+%   wfilt_oddevenb                       - Kingsbury's symmetric odd filters
+%   wfilt_optsyma                        - Optimizatized Symmetric Self-Hilbertian Filters
+%   wfilt_optsymb                        - Optimizatized Symmetric Self-Hilbertian Filters
+%   wfilt_qshifta                        - Improved Orthogonality and Symmetry properties
+%   wfilt_qshiftb                        - Improved Orthogonality and Symmetry properties
+%   wfilt_remez                          - Filters designed using Remez exchange algorithm
+%   wfilt_spline                         - Biorthogonal spline wavelets
+%   wfilt_sym                            - Symlet filters
+%   wfilt_symdden                        - Symmetric Double-Density DWT filters (tight frame)
+%   wfilt_symds                          - Symmetric wavelets dyadic sibling
+%   wfilt_symorth                        - Symmetric nearly-orthogonal and orthogonal nearly-symmetric
+%   wfilt_symtight                       - Symmetric Nearly Shift-Invariant Tight Frame Wavelets
+%   wfiltdt_dden                         - Double-Density Dual-Tree DWT filters
+%   wfiltdt_oddeven                      - Kingsbury's symmetric odd and even filters
+%   wfiltdt_optsym                       - Optimizatized Symmetric Self-Hilbertian Filters
+%   wfiltdt_qshift                       - Improved Orthogonality and Symmetry properties
+%   wfiltdtinfo                          - Plots dual-tree filters info
+%   wfiltinfo                            - Plots filters info
+%   wpbest                               - Best Tree selection
+%   wpfbt                                - Wavelet Packet FilterBank Tree
+%   wpfbt2filterbank                     - WPFBT equivalent non-iterated filterbank
+%   wpfbtbounds                          - Frame bounds of WPFBT
+%   wpfbtclength                         - WPFBT subband length from a signal length
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/LTFAT/WAVELETS/WFBTMANIP
+%   depthIndex2NodeNo                    - Get node from depth and index in the tree
+%   nat2freqOrder                        - Natural To Frequency Ordering
+%   nodeBForder                          - Nodes in the Breadth-First search order
+%   nodesFiltUps                         - NODEFILTUPS  Node upsamplig factor
+%   nodesInLen                           - Length of the node input signal
+%   nodesLocOutRange                     - Node output index range of the terminal outputs
+%   nodesMultid                          - Filter tree multirate identity filterbank
+%   nodesOutLen                          - Length of the node output
+%   nodesOutputsNo                       - Number of node Outputs
+%   nodesSub                             - S: Invalid node index range. Number of nodes is %d.\n',upper(mfilename),numel(wt.nodes));
+%   nodeSubtreeDelete                    - DELETESUBTREE Removes subtree with root node
+%   treeBFranges                         - Tree nodes output ranges in BF order
+%   treeOutLen                           - Lengths of tree subbands
+%   treeOutRange                         - Index range of the outputs
+%   treeSub                              - Identical subsampling factors
+%   treeWpBFrange                        - Wavelet packet tree output ranges in BF order
+%   wfbtmanipinit
+%   
+%   MASSEF/UTILITIES/AMT/THIRDPARTY/SFS
+%   AMTreadme.txt
+%   
+%   MASSEF/UTILITIES/PEASS
+%   adapt.c
+%   adapt.dll
+%   adapt.h
+%   adapt_m.c
+%   adapt_m.dll
+%   audioQualityFeatures                 - Computes the qTarget, qInterf, qArtif, qGlobal features from the output
+%   compile
+%   erbBW
+%   example                              - Run this file to see an example
+%   extractDistortionComponents          - Decomposition of an estimated source (or source image) into
+%   extractTSIA                          - Decompose each multichannel estimate sEst(:,:,nEst) into TSIA
+%   haircell.c
+%   haircell.dll
+%   ISR_SIR_SAR_fromNewDecomposition     - Computes the ISR, SIR and SAR (and the SDR optionaly) from the output of
+%   license.txt
+%   LSDecompose                          - SPROJ Weighted least-squares projection of each channel of se on the subspace
+%   LSDecompose_tv                       - SPROJ Least-squares projection of each channel of se on the subspace
+%   map2SubjScale                        - Non-linear mapping to subjective scale
+%   myMapping                            - Single-output two-layer perceptron with one hidden layer
+%   myPemoAnalysisFilterBank
+%   myPemoSynthesisFilterBank
+%   paramTask1.mat
+%   paramTask2.mat
+%   paramTask3.mat
+%   paramTask4.mat
+%   PEASS_ObjectiveMeasure               - Main function
+%   pemo_internal                        - Example implementation of the PEMO internal representation
+%   pemo_metric                          - Example implementation of the PEMO-Q objective quality
+%   readme.txt
+%   toeplitzC.c
+%   
+%   MASSEF/UTILITIES/PEASS/EXAMPLE
+%   interfSrc1.wav
+%   interfSrc2.wav
+%   license.txt
+%   targetEstimate.wav
+%   targetEstimate_eArtif.wav
+%   targetEstimate_eInterf.wav
+%   targetEstimate_eTarget.wav
+%   targetEstimate_true.wav
+%   targetSrc.wav
+%   
+%   MASSEF/UTILITIES/PEASS/GAMMATONE
+%   Example_Filter                       - This example creates a 4th order gammatone filter with a center
+%   Example_Filterbank                   - This example program demonstrates how to create and use an analysis
+%   Example_Synthesis                    - This Example demonstrates how to create and how to use the combined
+%   Gfb_analyze.c
+%   Gfb_analyze.h
+%   Gfb_Analyzer_clear_state             - Analyzer = Gfb_Analyzer_clear_state(analyzer)
+%   Gfb_Analyzer_fprocess.c
+%   Gfb_Analyzer_new                     - Analyzer = Gfb_Analyzer_new(sampling_frequency_hz,         ..
+%   Gfb_Analyzer_process                 - [output, analyzer] = Gfb_Analyzer_process(analyzer, input)
+%   Gfb_Analyzer_zresponse               - Zresponse = Gfb_Analyzer_zresponse(analyzer, z)
+%   Gfb_center_frequencies               - Function frequencies_hz =                                   ..
+%   Gfb_Delay_clear_state                - Delay = Gfb_Delay_clear_state(delay)
+%   Gfb_Delay_new                        - Delay = Gfb_Delay_new(analyzer, delay_samples)
+%   Gfb_Delay_process                    - [output, delay] = Gfb_Delay_process(delay, input)
+%   Gfb_erbscale2hz                      - Hz = Gfb_erbscale2hz(ERBscale)
+%   Gfb_Filter_clear_state               - Filter = Gfb_Filter_clear_state(filter)
+%   Gfb_Filter_new                       - Is the constructor of a cascaded gammatonefilter
+%   Gfb_Filter_process                   - [output, filter] = Gfb_Filter_process(filter, input)
+%   Gfb_Filter_zresponse                 - Zresponse = Gfb_Filter_zresponse(filter, z)
+%   Gfb_hz2erbscale                      - ERBscale = Gfb_hz2erbscale(Hz)
+%   Gfb_Mixer_new                        - Mixer = Gfb_Mixer_new(analyzer, delay, iterations)
+%   Gfb_Mixer_process                    - [output, mixer] = Gfb_Mixer_process(mixer, input)
+%   Gfb_plot                             - Function Gfb_plot(figure_number, axis_vector, title_string, ..
+%   Gfb_set_constants                    - This file defines global constants for the matlab gammatone filterbank
+%   Gfb_Synthesizer_clear_state          - Synthesizer = Gfb_Synthesizer_clear_state(synthesizer)
+%   Gfb_Synthesizer_new                  - Synthesizer = Gfb_Synthesizer_new(analyzer, desired_delay_in_seconds)
+%   Gfb_Synthesizer_process              - [output, synthesizer] = Gfb_Synthesizer_process(synthesizer, input)
+%   README.txt
+%   README_examples.txt
+%   README_implementation.txt
+%    
+%   This file was generated by updateContents.m on 01 Mar 2017 at 11:47:55.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.txt	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,19 @@
+Copyright (c) 2016 University of Surrey
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MASSEF.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,976 @@
+classdef MASSEF < handle
+%MASSEF Multichannel audio source separation evaluation framework.
+% 
+%   The multichannel audio source separation evaluation framework is
+%   designed to faciliate the development and evaluation of audio
+%   source separation algorithms. Algorithms and estimates are evaluated
+%   using a range of metrics, including SNR, STOI, and PEASS. The choice of
+%   metrics is configurable. Furthermore, if the algorithm is intended to
+%   perform localisation, then this can also be evaluated.
+% 
+%   The framework can be run in two ways:
+%     1) by providing iosr.bss.mixture objects and separation algorithms,
+%        or
+%     2) providing estimate and true source wav files.
+%   
+%   If 1), the framework generates the mixture(s), calculates the ideal
+%   binary and ratio masks, provides the mixture(s) to the separation
+%   algorithm(s), and evaluates the outputs of the separation algorithm(s).
+%   The framework also evaluates: the ideal masks for the purposes of
+%   comparison, and any azimuth/elevation estimates returned by the
+%   algorithm. Use the EXECUTE() method to operate in this mode.
+%   
+%   If 2), the framework evaluates only the supplied estimate(s) using
+%   signal-based metrics. Use the EVALUATE() method to operate in this
+%   mode.
+% 
+%   Sources may have any number of channels; the framework evaluates each
+%   channel. The use of iosr.bss.mixture objects facilitate the evaluation
+%   of spatialised mixtures (e.g. binaural).
+%   
+%   Type
+% 
+%       MASSEF.start
+%       doc
+% 
+%   and click 'Multichannel audio source separation evaluation framework
+%   (MASSEF)' under 'Supplemental Software' for more information.
+% 
+%   MASSEF can be used to evaluate and compare separation algorithms,
+%   provided that the algorithms conform to the required format. Consult
+%   the help documentation for more information.
+% 
+%   MASSEF properties:
+%       blocksize           - When using the parallel computing toolbox,
+%                             this parameter determines the maximum number
+%                             of parallel.FevalFuture objects that are
+%                             considered at any one time. The default is
+%                             128.
+%       creationDate        - Date the object was created (read-only).
+%       dir                 - The MASSEF installation directory
+%                             (read-only).
+%       evalPEASS           - A logical value indicating whether PEASS
+%                             evaluation should be executed. The default is
+%                             false.
+%       evalSTOI            - A logical value indicating whether STOI
+%                             evaluation should be executed. The default is
+%                             false.
+%       parpool             - A parallel.Pool object on which to perform 
+%                             the parallel separations. If the parallel
+%                             computing toolbox is available, MASSEF
+%                             will use the current pool by default (as
+%                             determined by gcp('nocreate')), if one is
+%                             open. If the toolbox is not available, or no
+%                             pool is open, separations will be performed
+%                             serially.
+%       results             - A MASSEFresults object containing results
+%                             generated by the framework (read-only).
+%       results_filename    - The name of the results file
+%                             returned when MASSEF.EXECUTE finishes.
+%                             The default is 'Results/results.mat'.
+%       saveDate            - Date the object was last saved (read-only).
+%   
+%   MASSEF methods:
+%       MASSEF              - Create an instance of MASSEF.
+%       evaluate            - Run the framework using input audio files.
+%       execute             - Run the framework using the input mixtures
+%                             and separators.
+%       save                - Save the framework's data and results.
+%     Static methods:
+%       start               - Start the framework.
+%       install             - Download and install MASSEF dependencies.
+% 
+%   See also IOSR.BSS.MIXTURE, MASSEFRESULTS.
+
+%   Copyright 2016 University of Surrey.
+    
+    properties
+        blocksize        % number of simultaneous parallel.FevalFuture objects
+        evalPEASS        % logical flag determing evaluation using PEASS
+        evalSTOI         % logical flag determing evaluation using STOI
+        parpool          % parallel.pool object on which to perform separations
+        results_filename % the name of the results file
+    end
+    
+    properties (Constant)
+        dir = fileparts(which(mfilename('fullpath'))) % directory in which this file is stored
+    end
+    
+    properties (SetAccess = private)
+        results          % the results data
+        creationDate     % date this object was created
+        saveDate         % date this object was last saved
+    end
+    
+    properties (Access = private)
+        hWaitBar         % handle to waitbar
+        iterations       % total iterations
+        PEASSoptions     % PEASS options
+    end
+    
+    properties (Constant, Access = private)
+        IDEAL = -1         % algorithm number for ideal estimates
+    end
+    
+    methods
+        
+        % constructor
+        
+        function obj = MASSEF(options)
+        %MASSEF Create an instance of MASSEF
+        %   
+        %   M = MASSEF instantiates MASSEF, returning an instance to M.
+        %   Evaluations are performed using the EXECUTE method.
+        % 
+        %   M = MASSEF(OPTIONS) instantiates MASSEF using the options
+        %   contained in the scalar structure OPTIONS. See MASSEF for a
+        %   description of valid fields.
+            
+            if nargin<1
+                options = struct;
+            end
+        
+            options = obj.validate_options(options);
+            
+            obj.evalPEASS = options.evalPEASS;
+            obj.evalSTOI = options.evalSTOI;
+            obj.parpool = options.parpool;
+            obj.results_filename = options.results_filename;
+            obj.blocksize = options.blocksize;
+            
+            % create empty results object array
+            obj.results = MASSEFresults();
+            
+            obj.creationDate = date;
+            
+        end
+        
+        % validate properties
+        
+        function set.blocksize(obj,val)
+            assert(isnumeric(val) && isscalar(val),'blocksize must be a numeric scalar.')
+            assert(round(val)==val,'blocksize must be an integer.')
+            assert(val>=1,'blocksize must be greater than or equal to 1.')
+            obj.blocksize = val;
+        end
+        
+        function set.evalPEASS(obj,val)
+            assert(islogical(val) && isscalar(val),'evalPEASS must be a logical scalar.')
+            obj.evalPEASS = val;
+        end
+        
+        function set.evalSTOI(obj,val)
+            assert(islogical(val) && isscalar(val),'evalSTOI must be a logical scalar.')
+            obj.evalSTOI = val;
+        end
+        
+        function set.parpool(obj,val)
+            if ~isempty(val)
+                assert(isa(val,'parallel.Pool'),'parpool must be a parallel.pool object.')
+            end
+            obj.parpool = val;
+        end
+        
+        function set.results_filename(obj,val)
+            assert(ischar(val),'results_filename must be a char array')
+            obj.results_filename = val;
+        end
+        
+        % other methods
+        
+        function execute(obj,mixtures,separators)
+        %EXECUTE Run the framework using the input mixtures and separators
+        %   
+        %   OBJ.EXECUTE(MIXTURES) runs MASSEF using the array of
+        %   iosr.bss.mixture objects MIXTURES and calculates performance
+        %   metrics using only ideal estimates (IBM and IRM).
+        %   
+        %   OBJ.EXECUTE(MIXTURES,SEPARATORS) runs MASSEF using the array of
+        %   iosr.bss.mixture objects MIXTURES and the array (or cell array)
+        %   of instances of separation algorithms contained in SEPARATORS.
+        %   Separation is performed for all combinations of these
+        %   variables.
+        %         
+        %   MASSEF.EXECUTE(MIXTURES,SEPARATORS) runs MASSEF using the
+        %   MASSEF instance MASSEF, the array of IOSR.BSS.MIXTURE objects
+        %   MIXTURES and the array (or cell array) of instances of
+        %   separation algorithms contained in SEPARATORS. Separation is
+        %   performed for all combinations of separators and mixtures. The
+        %   separation algorithm instances contained in SEPARATORS should
+        %   conform to the required format. Type
+        % 
+        %       doc
+        % 
+        %   and click 'Multichannel audio source separation evaluation
+        %   framework (MASSEF)' under 'Supplemental Software' for more
+        %   information.
+        % 
+        %   The EXECUTE method performs evaluations of the algorithm
+        %   according to the data returned by the algorithm, and the
+        %   options provided to MASSEF.
+        % 
+        %   If the separation algorithm returns a signal, then
+        %   MASSEF.EXECUTE evaluates:
+        % 
+        %       - signal-to-noise ratio (SNR);
+        %       - signal-to-ideal-noise ratio (SINR) (the SNR with respect 
+        %         to the signal reconstructed using the ideal binary and
+        %         ratio masks).
+        % 
+        %   In addition, if 'evalPEASS' is true, then PEASS and BSSeval
+        %   evaluation is performed. If 'evalSTOI' is true, then STOI
+        %   evaluation is performed.
+        % 
+        %   If the separation algorithm returns a mask, and if the ideal
+        %   mask dimensions match the estimated mask dimensions, then
+        %   MASSEF.EXECUTE evaluates:
+        % 
+        %       - ideal mask ratio (IMR) with respect to the ideal binary
+        %         and ratio masks.
+        % 
+        %   The EXECUTE method also calculates and evaluates the ideal
+        %   binary and ratio masks using the signal-level metrics utilised
+        %   for the algorithm evaluation. The masks are calculated using
+        %   the settings that are local to each mixture object. The masks
+        %   are then resynthesised using the inverse transform. For the
+        %   gammatone filterbank, a windowed-sinc function is used for
+        %   resynthesis in order to minimise the magnitude and phase
+        %   distortion.
+        % 
+        %   Lastly, the framework captures the estimated azimuth and
+        %   elevation of the targets and interferers, if they are returned.
+        % 
+        %   Once the evaluation is complete, the MASSEF object, which
+        %   contains the results data in MASSEF.results as a MASSEFresults
+        %   object, is saved to the file given by MASSEF.results_filename.
+        
+            % check the mixtures
+            assert(isa(mixtures,'iosr.bss.mixture'),'The MIXTURES input must contain one or more objects of class ''iosr.bss.mixture''.')
+            
+            if exist('separators','var')~=1
+                separators = {};
+            end
+            
+            % check separators have required property and method
+            if ~isempty(separators)
+                if ~iscell(separators) % force to cell array
+                    separators_old = separators;
+                    separators = cell(size(separators_old));
+                    for s = 1:numel(separators)
+                        separators{s} = separators_old(s);
+                    end
+                end
+                for s = 1:numel(separators) % check each separator
+                    obj.check_separator(separators{s})
+                end
+            end
+
+            directory = fileparts(which([mfilename '.m']));
+            cd(directory)
+            tempdir = [cd filesep 'temp'];
+            % ensure temp directory exists:
+            if exist(tempdir,'dir')~=7
+                success = mkdir(tempdir);
+                if ~success
+                    error('Unable to create directory %s. Please create it.',tempdir)
+                end
+            end
+
+            %% IVs
+
+            % enumerate combinations of mixtures and separators
+            [IVs,obj.iterations] = obj.initialise_IVs(length(mixtures),length(separators));
+
+            %% PEASS options
+
+            obj.PEASSoptions.destDir = [tempdir filesep];
+            obj.PEASSoptions.segmentationFactor = 1;
+            if exist(obj.PEASSoptions.destDir,'dir')~=7
+                mkdir(obj.PEASSoptions.destDir)
+            end
+
+            %% Perform separations for each mixture and separator
+
+            % create a waitbar
+            obj.hWaitBar = obj.initWaitDisp();
+
+            if ~MASSEF.pctexists() || isempty(obj.parpool) % run in serial linear loop
+
+                fprintf('Performing %d separations serially.\n',obj.iterations)
+                nchars = obj.updateWaitDisp(0,0);
+
+                for M = 1:obj.iterations
+
+                    % processing for this iteration
+                    sepnum = IVs(M).algo_num;
+                    mixnum = IVs(M).mixture_num;
+                    if isempty(separators)
+                        obj.process(mixtures(mixnum), ...
+                            {},mixnum,sepnum,M);
+                    else
+                        obj.process(mixtures(mixnum), ...
+                            separators{sepnum},mixnum,sepnum,M);
+                    end
+
+                    % Check to see if the cancel button was pressed
+                    if obj.breakWaitDisp()
+                        break;
+                    end
+
+                    % Update waitbar
+                    nchars = obj.updateWaitDisp(M,nchars);
+                end
+
+            else % execute asynchronously on parallel workers
+
+                fprintf('Performing %d separations on %d workers.\n',obj.iterations,obj.parpool.NumWorkers)
+                nchars = obj.updateWaitDisp(0,0);
+
+                % work on BLOCKSIZE chunks of data at a time
+                totalNumCompleted = 0; % overall complete count for display
+                N = 1; % block start
+
+                while N <= obj.iterations % work through blocks
+
+                    % do not exceed number of iterations
+                    blockMax = min(obj.iterations,N+obj.blocksize-1);
+
+                    % pass iterations to pool
+                    for M = blockMax:-1:N % backwards prevents growing the array
+                        sepnum = IVs(M).algo_num;
+                        mixnum = IVs(M).mixture_num;
+                        if isempty(separators)
+                            futures(M-N+1) = parfeval(obj.parpool,@obj.process,1,mixtures(mixnum), ...
+                                {},mixnum,sepnum,N+M-1);
+                        else
+                            futures(M-N+1) = parfeval(obj.parpool,@obj.process,1,mixtures(mixnum), ...
+                                separators{sepnum},mixnum,sepnum,N+M-1);
+                        end
+                    end
+
+                    % this cancels futures when cancelFutures is destroyed
+                    cancelFutures = onCleanup(@() cancel(futures));
+
+                    % capture data returned by workers
+                    numCompleted = 0;
+                    while numCompleted < blockMax-N+1
+
+                        % return completed iteration
+                        [~,data] = fetchNext(futures); % return data
+                        obj.results = [obj.results; data];
+                        obj.results = obj.results.merge();
+                        numCompleted = numCompleted + 1; % increment local counter
+                        totalNumCompleted = totalNumCompleted + 1; % increment total counter
+
+                        % Check to see if the cancel button was pressed
+                        br = obj.breakWaitDisp();
+                        if br; break; end
+
+                        % Update waitbar
+                        nchars = obj.updateWaitDisp(totalNumCompleted,nchars);
+                    end
+
+                    % cancel the futures
+                    cancel(futures);
+                    clear futures;
+
+                    % be sure to break out of this loop too
+                    if br; break; end
+
+                    % move to the next data block
+                    N = N + obj.blocksize;
+
+                end
+
+            end
+
+            % clean up
+            delete(obj.hWaitBar);
+
+            %% Wrap up
+            
+            obj.results.algorithmInfo(obj.IDEAL,'algorithmLabel','Ideal');
+            if ~isempty(separators)
+                for n = 1:length(separators)
+                    obj.results.algorithmInfo(n,'algorithmLabel',separators{n}.label);
+                end
+            end
+            for n = 1:length(mixtures)
+                obj.results.mixtureInfo(n,'azi_sep',mixtures(n).azi_sep, ...
+                    'elevation', mixtures(n).elevation, ...
+                    'filename_t', mixtures(n).target.filename, ...
+                    'filename_i', mixtures(n).int_fns, ...
+                    'sofa_path', mixtures(n).sofa_path, ...
+                    'target_azi', mixtures(n).target.azimuth, ...
+                    'target_ele', mixtures(n).target.elevation, ...
+                    'tir', mixtures(n).tir ...
+                    );
+            end
+            
+            obj.save();
+            save(obj.results_filename,'mixtures','separators','-append');
+            
+            % delete temporary files
+            delete(sprintf('%s*',[tempdir filesep]));
+            delete(sprintf('%s*',[obj.PEASSoptions.destDir filesep]))
+            
+            fprintf('\n')
+            disp('MASSEF finished.');
+            
+        end
+        
+        function evaluate(obj,originalFiles,estimateFile,tag,mixnum,sepnum,estnum)
+        %EVALUATE Run the framework using input audio files
+        %   
+        %   OBJ.EVALUATE(ORIGINALFILES,ESTIMATEFILE) runs the framework
+        %   using the true sources provided in the wav files whose
+        %   filenames are contained in the cell array ORIGINALFILES (the
+        %   target source is the first one) and the estimate provided in
+        %   the wav file with filename ESTIMATEFILE.
+        %   
+        %   The method may be called as many times as desired. Use
+        %   OBJ.SAVE() when finished to save the framework and its data to
+        %   a file.
+        %   
+        %   OBJ.EVALUATE(ORIGINALFILES,ESTIMATEFILE,TAG) writes the char
+        %   array TAG to the results data. Use the tag to identify
+        %   different estimates in the results data.
+        %   
+        %   OBJ.EVALUATE(ORIGINALFILES,ESTIMATEFILE,TAG,MIXNUM) uses the
+        %   mixture number MIXNUM to identify the separation of a
+        %   particular mixture. MIXNUM is a key that can be used with
+        %   MASSEFRESULTS.MIXTUREINFO() in order to add information about a
+        %   particular mixture.
+        %   
+        %   OBJ.EVALUATE(ORIGINALFILES,ESTIMATEFILE,TAG,MIXNUM,SEPNUM) uses
+        %   the separator number SEPNUM to identify the separation from a
+        %   particular algorithm. SEPNUM is a key that can be used with
+        %   MASSEFRESULTS.ALGORITHMINFO() in order to add information about a
+        %   particular algorithm.
+        %   
+        %   OBJ.EVALUATE(ORIGINALFILES,ESTIMATEFILE,TAG,MIXNUM,SEPNUM,ESTNUM)
+        %   uses the estimate number ESTNUM to identify different estimates
+        %   from a given algorithm (e.g. a binary or soft mask output).
+        %
+        %   See also IOSR.BSS.MASSEFRESULTS.
+            
+            if exist('tag','var')~=1
+                tag = '';
+            else
+                assert(ischar(tag),'TAG must be a char array')
+            end
+            if exist('mixnum','var')~=1
+                mixnum = 1;
+            else
+                assert(isscalar(mixnum),'MIXNUM must be a scalar')
+            end
+            if exist('sepnum','var')~=1
+                sepnum = 1;
+            else
+                assert(isscalar(sepnum),'SEPNUM must be a scalar')
+            end
+            if exist('estnum','var')~=1
+                estnum = 1;
+            else
+                assert(isscalar(estnum),'ESTNUM must be a scalar')
+            end
+            
+            [estimate,fs] = audioread(estimateFile);
+            target = audioread(originalFiles{1});
+            interferers = zeros(1,size(target,2));
+            for i = 2:numel(originalFiles)
+                int = audioread(originalFiles{i});
+                newlength = max(length(int),length(interferers));
+                int = obj.setlength(int,newlength);
+                interferers = obj.setlength(interferers,newlength);
+                interferers = interferers + int;
+            end
+            
+            for C = 1:size(target,2) % iterate through each channel
+                        
+                % SNR
+                snr = iosr.bss.calcSnr(estimate(:,min(C,size(estimate,2))),target(:,C));
+                obj.results.input(mixnum,sepnum,estnum,'SNR',C,tag,snr);
+                
+                % STOI
+                if obj.evalSTOI
+                    stoi = taal2011(target(:,C), estimate(:,min(C,size(estimate,2))), fs);
+                    obj.results.input(mixnum,sepnum,estnum,'STOI',C,tag,stoi);
+                end
+            end
+
+            % PEASS
+            if obj.evalPEASS
+                obj.evaluatePEASS(estimateFile,originalFiles, ...
+                    mixnum,sepnum,estnum,1,tag);
+            end
+            
+        end
+        
+        function save(obj)
+        %SAVE Save the framework's data and results
+        %   
+        %   OBJ.SAVE() save the MASSEF framework object to the file
+        %   determined by OBJ.RESULTS_FILENAME. The method is called
+        %   automatically when using the EXECUTE() method; in this case,
+        %   the mixtures and separators are also saved.
+        
+            % Create results files
+            if exist(obj.results_filename,'file')==2
+                % do not overwrite
+                newfilename = obj.results_filename;
+                while exist(newfilename,'file')==2
+                    fprintf('\n')
+                    newfilename = input(...
+                        ['The results file ''' newfilename ''' already exists.\nPlease enter a new filename:\n'],'s');
+                end
+                obj.results_filename = newfilename;
+            end
+            obj.saveDate = date;
+            save(obj.results_filename,'obj');
+            fprintf('\n')
+            disp(['File saved to: ' obj.results_filename]);
+            
+        end
+        
+    end % public methods
+    
+    methods (Static)
+        
+        function start
+        %START Start the framework.
+        %
+        %   MASSEF.START starts the framework and its dependencies,
+        %   adds the required folders to the Matlab path, and updates the
+        %   HTML help documentation.
+
+            addpath(cd,...
+                [MASSEF.dir filesep 'Library'],...
+                [MASSEF.dir filesep 'Utilities'],...
+                [MASSEF.dir filesep 'Utilities' filesep 'AMT'],...
+                [MASSEF.dir filesep 'Utilities' filesep 'PEASS'],...
+                [MASSEF.dir filesep 'Utilities' filesep 'PEASS' filesep 'gammatone'],...
+                [MASSEF.dir filesep 'Stimuli']);
+
+            SOFAstart(0);
+            amtstart;
+            iosr.install;
+            
+            d = pwd;
+            cd([MASSEF.dir filesep 'help_html' filesep 'source'])
+            publishHelp;
+            cd(d);
+            
+        end
+        
+        function install
+        %INSTALL Download and install MASSEF dependencies.
+        % 
+        %   MASSEF.INSTALL downloads and installs the MASSEF
+        %   dependencies. These dependencies are:
+        %       - The Auditory Modelling Toolbox
+        %         (http://amtoolbox.sourceforge.net);
+        %       - The Large Time-Frequency Analysis Toolbox
+        %         (http://ltfat.sourceforge.net);
+        %       - Perceptual Evaluation methods for Audio Source Separation
+        %         Toolkit (http://bass-db.gforge.inria.fr/peass/);
+        %       - IoSR Matlab Toolbox
+        %         (https://github.com/IoSR-Surrey/MatlabToolbox)
+        %       - SOFA API
+        %         (https://sourceforge.net/projects/sofacoustics/).
+
+            directory = MASSEF.dir;
+            cd(directory);
+
+            %% download and install STOI
+
+            amt_folder = [directory filesep 'Utilities' filesep 'AMT'];
+            ltfat_folder = [directory filesep 'Utilities' filesep 'AMT' filesep 'thirdparty' filesep 'ltfat'];
+
+            if ~(exist(amt_folder, 'dir') == 7)   
+                % AMT
+                amt_filename = 'amtoolbox-0.9.7.zip';
+                websave(amt_filename,'http://vorboss.dl.sourceforge.net/project/amtoolbox/amtoolbox-0.9.7.zip');
+                unzip(amt_filename,amt_folder);
+                amt_temp_folder = [amt_folder filesep 'release' filesep];
+                movefile([amt_temp_folder '*'],[amt_folder filesep]);
+                delete(amt_filename)
+                rmdir(amt_temp_folder,'s')
+
+                % LTFAT
+                ltfat_filename = 'ltfat-2.1.2.tgz';
+                websave(ltfat_filename,'http://netix.dl.sourceforge.net/project/ltfat/ltfat/2.0/ltfat-2.1.2.tgz');
+                untar(ltfat_filename,ltfat_folder);
+                ltfat_temp_folder = [ltfat_folder filesep 'ltfat' filesep];
+                movefile([ltfat_temp_folder '*'],[ltfat_folder filesep]);
+                delete(ltfat_filename)
+                rmdir(ltfat_temp_folder,'s')
+            else
+                display(strcat('Found existing AMT Toolbox directory: ', amt_folder))
+            end
+
+            %% download and install PEASS
+
+            % install dir
+            peass_folder = [directory filesep 'Utilities' filesep 'PEASS'];
+
+            % PEASS
+            if ~(exist(peass_folder, 'dir') == 7)
+                peass_filename = 'PEASS-Software-v2.0.zip';
+                websave(peass_filename,'http://bass-db.gforge.inria.fr/peass/PEASS-Software-v2.0.zip');
+                unzip(peass_filename,peass_folder);
+                peass_temp_folder = [peass_folder filesep 'PEASS-Software-v2.0' filesep];
+                movefile([peass_temp_folder '*'],[peass_folder filesep]);
+
+                % clean up
+                delete(peass_filename)
+                rmdir(peass_temp_folder,'s')
+            else
+                display(strcat('Found existing PEASS directory: ', peass_folder))
+            end
+            % Hair cell model
+            adapt_filename = 'adapt_loop.zip';
+            websave(adapt_filename,'http://medi.uni-oldenburg.de/download/demo/adaption-loops/adapt_loop.zip');
+            unzip(adapt_filename,peass_folder);
+            cd(peass_folder);
+            compile;
+            cd(directory);
+            
+            %% download and install IoSR Matlab Toolbox
+            
+            if ~MASSEF.gitExists
+                % IoSR Matlab Toolbox
+                if ~(exist([directory filesep 'Library' filesep '+iosr'], 'dir') == 7)
+                    iosrMTB = 'iosr.zip';
+                    iosr_dir = [directory filesep 'Library'];
+                    websave(iosrMTB,'https://github.com/IoSR-Surrey/MatlabToolbox/archive/master.zip');
+                    unzip(iosrMTB,iosr_dir);
+                    movefile([iosr_dir filesep 'MatlabToolbox-master' filesep '*'],[iosr_dir filesep]);
+                    delete(iosrMTB)
+                    rmdir([iosr_dir filesep 'MatlabToolbox-master'],'s')
+                else
+                    display('Found existing IoSR Matlab Toolbox directory')
+                end
+            end
+
+            %% Remaining clean up
+
+            delete(adapt_filename)
+
+            disp('MASSEF successfully installed.')
+
+        end
+        
+    end % Static public methods
+    
+    methods (Static, Hidden)
+        
+        function e = gitExists
+        %GITEXISTS Check if install is a git repo
+            e = exist([MASSEF.dir filesep '.git'],'dir')==7;
+        end
+        
+    end
+    
+    methods (Access = private)
+        
+        function r = process(obj,mix,separator,mixnum,sepnum,iteration)
+        %PROCESS Main callback for performing the separation and analysis
+
+            %% Create mixture
+
+            % write mixture, target and interferers
+            mix.write(sprintf('%smix-%d.wav',obj.PEASSoptions.destDir,mixnum));
+            originalFiles = {mix.filename_t, mix.filename_i};
+
+            % create mixture signal
+            mixture = mix.signal;
+            
+            %% Analyse separator
+            
+            % calculate ideal outputs
+            ibm = mix.ibm;
+            irm = mix.irm;
+            output_ibm = mix.applyMask(ibm);
+            output_irm = mix.applyMask(irm);
+            
+            if ~isempty(separator)
+            
+                % calculate separator output
+                [signals,masks,est_azis,est_eles] = separator.separate(mixture);
+
+                % apply mask if signals are not calculated
+                if isempty(signals) && ~isempty(masks)
+                    for E = 1:size(masks,4)
+                        signals(:,:,E) = mix.applyMask(masks(:,:,:,E));
+                    end
+                end
+
+                % Evaluate signals
+                if ~isempty(signals)
+                    for E = 1:size(signals,3)
+
+                        estimateFileBase = sprintf('%ssignal-%d',obj.PEASSoptions.destDir,iteration);
+                        estimateFile = sprintf('%s.wav',estimateFileBase);
+                        audiowrite(estimateFile,iosr.dsp.audio.normalize(signals(:,:,E)),mix.fs);
+
+                        obj.evaluate(originalFiles,estimateFile,...
+                            separator.estTag{E},mixnum,sepnum,E);
+
+                        % SINR
+                        for C = 1:size(mixture,2)
+                            sinr = iosr.bss.calcSnr(signals(:,C,E),output_irm(:,C));
+                            obj.results.input(mixnum,sepnum,E,'SINR',C,separator.estTag{E},sinr)
+                        end
+
+                        % delete temp files
+                        delete(estimateFile);
+
+                    end
+
+                end
+
+                % estimated azimuths
+                if ~isempty(est_azis)
+                    for s = 1:length(est_azis)
+                        if s==1
+                            obj.results.input(mixnum,sepnum,1,'est_azi_target',1,[],est_azis(s))
+                        else
+                            obj.results.input(mixnum,sepnum,1,sprintf('est_azi_int_%02d',s-1),1,[],est_azis(s))
+                        end
+                    end
+                end
+
+                % estimated elevation
+                if ~isempty(est_eles)
+                    for s = 1:length(est_eles)
+                        if s==1
+                            obj.results.input(mixnum,sepnum,1,'est_ele_target',1,[],est_eles(s))
+                        else
+                            obj.results.input(mixnum,sepnum,1,sprintf('est_ele_int_%02d',s-1),1,[],est_eles(s))
+                        end
+                    end
+                end
+
+                % only do mask comparisons when the masks are equal size
+                masks_size = size(masks);
+                ideal_size = size(ibm);
+                if isequal(masks_size(1:2),ideal_size(1:2))
+                    for E = 1:size(masks,4) % iterature through each estimate/mask
+                        for C = 1:size(mixture,2) % iterate through each channel
+                            maskC = masks(:,:,min(C,size(masks,3)),E);
+
+                            % IMR - binary
+                            imrb = iosr.bss.calcImr(maskC,ibm(:,:,C));
+                            obj.results.input(mixnum,sepnum,E,'IMR (IBM)',C,separator.estTag{E},imrb)
+
+                            % IMR - ratio
+                            imrr = iosr.bss.calcImr(maskC,irm(:,:,C));
+                            obj.results.input(mixnum,sepnum,E,'IMR (IRM)',C,separator.estTag{E},imrr)
+                        end
+
+                    end
+
+                end
+                
+            end
+            
+            %% Analyse ideal masks
+
+            if sepnum==1 % evaluations of ideal masks
+                
+                ibmFile = sprintf('%sibm-%d.wav',obj.PEASSoptions.destDir,iteration);
+                audiowrite(ibmFile,iosr.dsp.audio.normalize(output_ibm),mix.fs);
+                irmFile = sprintf('%sibm-%d.wav',obj.PEASSoptions.destDir,iteration);
+                audiowrite(irmFile,iosr.dsp.audio.normalize(output_irm),mix.fs);
+                
+                obj.evaluate(originalFiles,ibmFile,...
+                        'Binary',mixnum,obj.IDEAL,1);
+                obj.evaluate(originalFiles,irmFile,...
+                        'Ratio',mixnum,obj.IDEAL,2);
+                    
+                % delete temp files
+                delete(ibmFile);
+                delete(irmFile);
+            end
+            
+            r = obj.results;
+
+        end
+        
+        function evaluatePEASS(obj,estimateFile,originalfiles, ...
+            mixnum,sepnum,estnum,channelnum,esttag)
+        %EVALUATE Evaluate resynthesised signals against ground truth
+
+            % calculate metrics
+            PEASS_output = PEASS_ObjectiveMeasure(originalfiles,estimateFile,obj.PEASSoptions);
+
+            % write data to outputs
+            obj.results.input(mixnum,sepnum,estnum,'OPS',channelnum,esttag,PEASS_output.OPS)
+            obj.results.input(mixnum,sepnum,estnum,'TPS',channelnum,esttag,PEASS_output.TPS)
+            obj.results.input(mixnum,sepnum,estnum,'IPS',channelnum,esttag,PEASS_output.IPS)
+            obj.results.input(mixnum,sepnum,estnum,'APS',channelnum,esttag,PEASS_output.APS)
+            obj.results.input(mixnum,sepnum,estnum,'SDR',channelnum,esttag,PEASS_output.SDR)
+            obj.results.input(mixnum,sepnum,estnum,'SAR',channelnum,esttag,PEASS_output.SAR)
+            obj.results.input(mixnum,sepnum,estnum,'SIR',channelnum,esttag,PEASS_output.SIR)
+            obj.results.input(mixnum,sepnum,estnum,'ISR',channelnum,esttag,PEASS_output.ISR)
+            
+            [pathstr,name] = fileparts(estimateFile);
+            delete(fullfile(pathstr,[name '_true.wav']));
+            delete(fullfile(pathstr,[name '_eTarget.wav']));
+            delete(fullfile(pathstr,[name '_eInterf.wav']));
+            delete(fullfile(pathstr,[name '_eArtif.wav']));
+
+        end
+        
+        function nchars = updateWaitDisp(obj,numComplete,nchars)
+        %UPDATEWAITDISP Update the wait display
+
+            fraction = numComplete/obj.iterations;
+
+            if ~isempty(obj.hWaitBar) % update waitbar if it exists
+                waitbar(fraction, obj.hWaitBar);
+            end
+            fprintf(1,repmat('\b',1,nchars)); % delete old message
+            if numComplete==obj.iterations
+                format = '%.0f'; % special format for 100%
+            else
+                format = '%.1f'; % normal format
+            end
+
+            % display message and return number of chars to delete for next message
+            nchars = fprintf(1,[format '%% complete.'],100*fraction);
+
+        end
+
+        function b = breakWaitDisp(obj)
+        %BREAKWAITDISP Determine whether to break the calculations
+
+            b = false; % don't by default
+            if ~isempty(obj.hWaitBar) % if waitbar exists
+                if getappdata(obj.hWaitBar, 'Cancelled') % determine if "Cancel" was clicked
+                    b = true; % break if so
+                end
+            end
+            if b % display message if breaking
+                fprintf('\nMASSEF cancelled.\n');
+            end
+
+        end
+        
+    end % private methods
+    
+    methods (Static, Access = private)
+        
+        function options = validate_options(options)
+        %VALIDATE_OPTIONS Validate the options structure input to this function
+
+            % check format
+            if numel(options)>1
+                error('The input to MASSEF should be a 1x1 structure. Cell-array fields should be encapsulated within a single cell.')
+            end
+
+            fields_in = fieldnames(options);
+
+            % default values
+            if MASSEF.pctexists()
+                default_parpool = gcp('nocreate');
+            else
+                default_parpool = [];
+            end
+            default_values = struct( ...
+                'evalPEASS',false, ...
+                'evalSTOI',false, ...
+                'parpool',default_parpool, ...
+                'results_filename',[MASSEF.dir filesep 'Results' filesep 'results.mat'], ...
+                'blocksize',128 ...
+            );
+            def_fields = fieldnames(default_values);
+
+            % check for invalid options
+            for r = 1:length(fields_in)
+                assert(any(strcmpi(fields_in{r},def_fields)),['Invalid option ''' fields_in{r} ''' specified.'])
+            end
+
+            % write defaults
+            for r = 1:numel(def_fields)
+                field_name = def_fields{r};
+                if ~isfield(options,field_name)
+                    options.(field_name) = default_values.(field_name);
+                end
+            end
+
+        end
+        
+        function [IVs,iterations] = initialise_IVs(numMixtures,numSeparators)
+        %INITIALISE_IVs Initialise experiment results structure
+
+            % Independent variables space
+            IV_space = [numMixtures max(1,numSeparators)];
+
+            iterations = prod(IV_space); % total number of results
+            assert(numMixtures>0,'No mixtures have been specified')
+            %assert(numSeparators>0,'No separators have been specified')
+
+            IVs = struct('algo_num',[],'mixture_num',[]);
+
+            % fill IV cells with data
+            for N = 1:iterations
+                [n,p] = ind2sub(IV_space,N);
+                IVs(N).algo_num = p;
+                IVs(N).mixture_num = n;
+            end
+        end
+        
+        function check_separator(obj)
+        %CHECK_SEPARATOR Check separator meets requirements
+
+            assert(isprop(obj,'label'),['The object of class ''' class(obj) ''' does not have the required property ''label'''])
+            assert(ischar(obj.label),['The ''label'' property of the ''' class(obj) ''' object should return a char array'])
+            assert(isprop(obj,'estTag'),['The object of class ''' class(obj) ''' does not have the required property ''estTag'''])
+            assert(iscellstr(obj.estTag),['The ''estTag'' property of the ''' class(obj) ''' object should return a cell array of strings'])
+            assert(ismethod(obj,'separate'),['The object of class ''' class(obj) ''' does not have the required method ''separate'''])
+
+        end
+        
+        function e = pctexists
+        %PCTEXISTS Determine whether the parallel computing toolbox exists
+
+            if isempty(ver('distcomp'))
+                e = false;
+            else
+                e = true;
+            end
+
+        end
+
+        function h = initWaitDisp
+        %INITWAITDISP Initialise the waiting display
+
+            if usejava('jvm') % only call waitbar if JVM is running
+                h = waitbar(0, 'MASSEF processing...', 'CreateCancelBtn', ...
+                    @(src, event) setappdata(gcbf(), 'Cancelled', true));
+                setappdata(h, 'Cancelled', false);
+            else % do nothing
+                h = [];
+            end
+        end
+        
+        function y = setlength(x,signal_length)
+        %SETLENGTH Crop or zero-pad signal to specified length
+            
+            d = size(x);
+            if size(x,1)>signal_length % need to crop
+                subsidx = [{1:signal_length} repmat({':'},1,ndims(x)-1)];
+                y = x(subsidx{:});
+            elseif size(x,1)<signal_length % need to zero-pad
+                y = [x; zeros([signal_length-size(x,1),d(2:end)])];
+            else % do nothing
+                y = x;
+            end
+            
+        end
+        
+    end % static private methods
+    
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MASSEFresults.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,430 @@
+classdef MASSEFresults < handle
+%MASSEFRESULTS A class for storing MASSEF results
+% 
+%   The multichannel audio source separation evaluation framework uses this
+%   class to store results. You can use its methods to recall and filter
+%   the data.
+%   
+%   MASSEFRESULTS properties:
+%     Read-only properties:
+%       data            - The full results set returned as a Table object
+%                         (read only). The Table has the following columns:
+%                             - algorithmNum - the algorithm number;
+%                             - channel - the audio channel
+%                             - estimateNum - the estimate number;
+%                             - estTag - a tag for each estimate from a
+%                               given algorithm;
+%                             - metric - the performance metric;
+%                             - mixNum - the mixture number; and
+%                             - value - the value of the performance metric
+%                         Additional mixture and algorithm information is
+%                         also returned in the results set.
+%       estTags         - A list of the estTags, taken from the separators,
+%                         that feature in the results set (read only).
+%       metrics         - The metrics that feature in the results set (read
+%                         only).
+%       numAlgorithms   - The number of algorithms in the results set (read
+%                         only).
+%       numMixtures     - The number of mixtures in the results set (read
+%                         only).
+%       numEstimates    - The (maximum) number of estimates in the results
+%                         set (read only).
+%       numChannels     - The (maximum) number of channels in the results
+%                         set (read only).
+%   
+%   MASSEFRESULTS methods:
+%       MASSEFresults       - Create a MASSEFresults object.
+%       algorithmInfo       - Add algorithm information.
+%       filter              - Filter the results set.
+%       input               - Add performance data.
+%       merge               - Combine results array into singular object.
+%       mixtureInfo         - Add mixture information.
+%       removeDuplicates    - Remove duplicate data from the results
+%                             object.
+% 
+%   See also MASSEFFW.
+
+%   Copyright 2016 University of Surrey.
+    
+    properties (SetAccess = private, Dependent)
+        data            % The full results set.
+        estTags         % A tag assigned to each estimate.
+        metrics         % The metrics that feature in the results set.
+        numAlgorithms   % The number of algorithms in the results set.
+        numMixtures     % The number of mixtures in the results set.
+        numEstimates    % The (maximum) number of estimates in the results set.
+        numChannels     % The (maximum) number of channels in the results set.
+    end
+    
+    properties (Access = private)
+        mixtures        % mixtures table
+        algorithms      % algorithms table
+        performance     % main performance table
+    end
+    
+    methods
+        
+        function obj = MASSEFresults()
+        %MASSEFRESULTS Create the results set.
+        %   
+        %   R = MASSEFRESULTS creates an empty MASSEFRESULTS object. Use the
+        %   MASSEFRESULTS.INPUT method to add data.
+        
+            obj.mixtures = cell2table(cell(0,9), 'VariableNames',{'mixNum','azi_sep','elevation','filename_t','filename_i','sofa_path','target_azi','target_ele','tir'});
+            obj.algorithms = cell2table(cell(0,2), 'VariableNames',{'algorithmNum','algorithmLabel'});
+            obj.performance = cell2table(cell(0,7), 'VariableNames',{'mixNum','algorithmNum','estimateNum','channel','metric','estTag','value'});
+        
+        end
+        
+        function data = get.data(obj)
+        % GET.DATA get data set
+        
+            data = obj.joinLookupTables(obj.performance);
+            
+        end
+        
+        function metrics = get.metrics(obj)
+        % GET.METRICS get metrics
+            metrics = unique(obj.performance.metric);
+        end
+        
+        function estTags = get.estTags(obj)
+        % GET.METRICS get metrics
+            estTags = unique(obj.performance.estTag);
+        end
+        
+        function numAlgorithms = get.numAlgorithms(obj)
+        % GET.NUMALGORITHMS get number of algorithms
+            numAlgorithms = length(unique(obj.performance.algorithmNum));
+        end
+        
+        function numMixtures = get.numMixtures(obj)
+        % GET.NUMMIXTURES get number of mixtures
+            numMixtures = length(unique(obj.performance.mixNum));
+        end
+        
+        function numEstimates = get.numEstimates(obj)
+        % GET.NUMESTIMATES get number of estimates
+            numEstimates = length(unique(obj.performance.estimateNum));
+        end
+        
+        function numChannels = get.numChannels(obj)
+        % GET.NUMCHANNEL get number of channels
+            numChannels = length(unique(obj.performance.channel));
+        end
+        
+        function newObj = merge(obj)
+        % MERGE Combine MASSEFresults array into singular object
+        %
+        %   NEWOBJ = R.MERGE() combines the elements of the MASSEFRESULTS array
+        %   R into a singular MASSEFRESULTS object NEWOBJ.
+        
+            newObj = obj(1);
+            if length(obj) > 1
+                for n = 2:length(obj)
+                    % combine lookup table and eliminate duplicate rows
+                    newObj.mixtures = vertcat(newObj.mixtures,obj(n).mixtures);
+                    newObj.algorithms = vertcat(newObj.algorithms,obj(n).algorithms);
+                    % combine all rows of performance tables
+                    newObj.performance = vertcat(newObj.performance,obj(n).performance);
+                end
+            end
+            newObj.removeDuplicates();
+            
+        end
+        
+        function removeDuplicates(obj)
+        % REMOVEDUPLICATES Remove duplicate data from MASSEFresults object
+        %
+        %   R.REMOVEDUPLICATES() removes duplicate results from the
+        %   MASSEFRESULTS object R.
+        
+            obj.mixtures = unique(obj.mixtures);
+            obj.algorithms = unique(obj.algorithms);
+            obj.performance = unique(obj.performance);
+            
+        end
+        
+        function data = filter(obj,varargin)
+        %FILTER Filter the results data set
+        %
+        %   R.FILTER(NAME,VALUE) filters the results set contained in the
+        %   MASSEFRESULTS object R using the variable names and values
+        %   contained in the NAME / VALUE pair arguments. The parameters
+        %   are:
+        % 
+        %       - 'algorithmnum' - Filters the data according to the
+        %         algorithm number. The parameter should be a function
+        %         handle that takes the mixture number as its input, and
+        %         returns a logical value.
+        %       - 'channel' - Filters the data according to channel
+        %         information. The parameter can be a function handle that
+        %         takes the channel number as its input, and returns a
+        %         logical value. Alternatively, the parameter can be 'max'
+        %         or 'mean', which calculates the the maximum or mean
+        %         respectively for every combination of the other
+        %         variables.
+        %       - 'estimate' - Filters the data according to estimate
+        %         information. The specification is identical to 'channel'.
+        %       - 'estTag' - Filters the data according to the estmate tag.
+        %         The parameter should be a function handle that takes the
+        %         tag string as its input, and returns a logical value.
+        %       - 'metric' - Filters the data according to the metric. The
+        %         parameter should be a function handle that takes the
+        %         metric name as its input, and returns a logical value.
+        %       - 'mixnum' - Filters the data according to the mixture
+        %         number. The parameter should be a function handle that
+        %         takes the mixture number as its input, and returns a
+        %         logical value.
+        %       - 'value' - Filters the data according to the value. The
+        %         parameter should be a function handle that takes the
+        %         value as its input, and returns a logical value.
+            
+            assert(mod(length(varargin),2)==0,'input must contain parameter/value pairs')
+            data = obj.data;
+            
+            % work through varargin
+            for n = 1:2:length(varargin)
+                filtername = varargin{n}; % column to filter on
+                filterval = varargin{n+1}; % value used to filter
+                switch lower(filtername) % do filtering
+                    case 'channel'
+                        data = obj.filterRowOrAggregate(data,filterval,'channel',...
+                            {'mixNum','algorithmNum','estimateNum','metric'},...
+                            {'mixNum','algorithmNum','metric'});
+                    case 'estimate'
+                        data = obj.filterRowOrAggregate(data,filterval,'estimateNum',...
+                            {'mixNum','algorithmNum','channel','metric'},...
+                            {'mixNum','algorithmNum','metric'});
+                    case 'mixnum'
+                        data = obj.filterRows(data,filterval,'mixNum');
+                    case 'algorithmnum'
+                        data = obj.filterRows(data,filterval,'algorithmNum');
+                    case 'metric'
+                        data = obj.filterRows(data,filterval,'metric');
+                    case 'esttag'
+                        data = obj.filterRows(data,filterval,'estTag');
+                    case 'value'
+                        data = obj.filterRows(data,filterval,'value');
+                    otherwise
+                    
+                end
+                
+            end
+            
+            data = obj.joinLookupTables(data);
+        
+        end
+        
+        function mixtureInfo(obj,mixtureNumber,varargin)
+        %MIXTUREINFO Add mixture information.
+        %   
+        %   R.MIXTUREINFO(MIXTURENUM,NAME,VALUE) adds algorithm information
+        %   for the mixture with number MIXTURENUM to the results set
+        %   contained in the MASSEFRESULTS object R using the variable names
+        %   and values contained in the NAME / VALUE pair arguments. The
+        %   following information can be stored about each mixture:
+        % 
+        %       - 'azi_sep' - azimuthal separation of widest sources
+        %         (numeric);
+        %       - 'elevation' - median elevation of sources (numeric);
+        %       - 'filename_t' - target filename (char array);
+        %       - 'filename_i' - interferer filename (char array);
+        %       - 'sofa_path' - SOFA filename (char array);
+        %       - 'target_azi' - the target azimuth (numeric);
+        %       - 'target_ele' - the target elevation (numeric); and
+        %       - 'tir' - target-to-interferer ratio (dB) (numeric).
+            
+            % ensure some inputs are strings
+            varargin = obj.ensureKeyValParamStrs({'sofa_path','filename_t','filename_i'},varargin);
+            
+            % add data
+            obj.mixtures = obj.addData(obj.mixtures,'mixNum',mixtureNumber,varargin{:});
+            
+        end
+        
+        function algorithmInfo(obj,algorithmNumber,varargin)
+        %ALGORITHMINFO Add algorithm information.
+        %
+        %   R.ALGORITHMINFO(ALGORITHMNUM,NAME,VALUE)| adds algorithm
+        %   information for the algorithm with number ALGORITHMNUM to the
+        %   results set contained in the MASSEFRESULTS object R using the
+        %   variable names and values contained in the NAME / VALUE pair
+        %   arguments. The following information can be stored about each
+        %   algorithm:
+        % 
+        %       - 'algorithmLabel'  - a label for the algorithm (char
+        %                             array).
+            
+            % ensure some inputs are strings
+            varargin = obj.ensureKeyValParamStrs('algorithmLabel',varargin);
+            
+            obj.algorithms = obj.addData(obj.algorithms,'algorithmNum',algorithmNumber,varargin{:});
+            
+        end
+        
+        function input(obj,mixtureNum,algorithmNum,estimateNum,metric,channel,estTag,value)
+        %INPUT Input performance data.
+        %   
+        %   R.INPUT(MIXTURENUM,ALGORITHMNUM,...
+        %       ESTIMATENUM,METRIC,CHANNEL,ESTTAG,VALUE)
+        %   inputs the performance data for mixture number MIXTURENUM,
+        %   algorithm number ALGORITHMNUM, estimate number ESTIMATENUM,
+        %   metric METRIC, channel number CHANNEL, estimate tag ESTTAG, and
+        %   value VALUE to the MASSEFRESULTS instance R.
+            
+            if ~ischar(estTag)
+                estTag = char(estTag);
+            end
+            
+            rownames = {'mixNum','algorithmNum','estimateNum','metric','channel','estTag','value'};
+            values = {mixtureNum,algorithmNum,estimateNum,metric,channel,estTag,value};
+            row = cell2table(values, 'VariableNames',rownames);
+            
+            try
+                % find existing row
+                match = obj.performance.mixNum==mixtureNum && ...
+                    obj.performance.algorithmNum==algorithmNum && ...
+                    obj.performance.estimateNum==estimateNum && ...
+                    strcmp(metric,obj.performance.metric) && ...
+                    obj.performance.channel==channel && ...
+                    strcmp(estTag,obj.performance.estTag);
+
+                if any(match)
+                    % replace
+                    obj.performance(find(match,1,'first'),:) = row;
+                else
+                    % append
+                    obj.performance = [obj.performance; row];
+                end
+            catch % there is no data
+                % append
+                obj.performance = [obj.performance; row];
+            end
+            
+        end
+        
+    end % public methods
+    
+    methods (Hidden)
+        
+        function debug(obj) %#ok<MANU>
+            keyboard;
+        end
+        
+    end % hidden methods
+    
+    methods (Access = private)
+        
+        function dataTable = filterRowOrAggregate(obj,dataTable,filterval,col,group,altgroup)
+        %FILTERROWORAGGREGATE filter data based on aggregate function.
+            
+            if ischar(filterval)
+                % special aggregate function
+                switch lower(filterval)
+                    case 'max'
+                        fhandle = @max;
+                    case 'mean'
+                        fhandle = @mean;
+                    otherwise
+                        error('Unknown filter parameter ''%s''.',filterval)
+                end
+                % do stats
+                try
+                    dataTable = varfun(fhandle,dataTable,'InputVariables','value',...
+                        'GroupingVariables',group);
+                catch
+                    dataTable = varfun(fhandle,dataTable,'InputVariables','value',...
+                        'GroupingVariables',altgroup);
+                end
+                % rename value column and delete GroupCount column
+                dataTable = obj.findRenameVar(dataTable,'value','value');
+                dataTable.GroupCount = [];
+            else
+                % normal filter function
+                dataTable = obj.filterRows(dataTable,filterval,col);
+            end
+            
+        end
+        
+        function dataTable = joinLookupTables(obj,dataTable)
+        %JOINLOOKUPTABLES join a table to the lookup tables
+            
+            if ~isempty(obj.mixtures)
+                dataTable = outerjoin(dataTable,obj.mixtures,'Type','left','MergeKeys',true,'keys','mixNum');
+            end
+            if ~isempty(obj.algorithms)
+                dataTable = outerjoin(dataTable,obj.algorithms,'Type','left','MergeKeys',true);
+            end
+            
+        end
+        
+    end % private methods
+    
+    methods (Static, Access = private)
+        
+        function dataTable = addData(dataTable,key,keyVal,varargin)
+        %ADDDATA add data to lookup tables.
+            
+            assert(mod(length(varargin),2)==0,'input must contain parameter/value pairs')
+            rI = find(ismember(dataTable.(key),keyVal),1,'first');
+            if isempty(rI) % add a new row
+                % get data from varargin
+                varnames = cell(0);
+                vals = cell(0);
+                for n = 1:2:length(varargin)
+                    varnames{(n+1)/2} = varargin{n};
+                    vals{(n+1)/2} = varargin{n+1};
+                end
+                % make new row
+                vars = dataTable.Properties.VariableNames;
+                newrow = cell(1,length(vars));
+                newrow{strcmp(key,vars)} = keyVal;
+                for r = 1:length(varnames)
+                    if ismember(varnames{r},vars);
+                        newrow{strcmp(varnames{r},vars)} = vals{r};
+                    end
+                end
+                newrow = cell2table(newrow,'VariableNames',vars);
+                % append
+                dataTable = [dataTable; newrow];
+            else % update row
+                for n = 1:2:length(varargin)
+                    try
+                        dataTable(rI,varargin(n)) = varargin(n+1);
+                    catch
+                        dataTable.(varargin{n})(rI) = varargin(n+1);
+                    end
+                end
+            end
+            
+        end
+        
+        function dataTable = findRenameVar(dataTable,old,new)
+        %FINDRENAMEVAR Find and rename a variable.
+            
+            varnames = dataTable.Properties.VariableNames;
+            k = find(cellfun(@(x) ~isempty(strfind(x,old)),varnames),1,'first');
+            dataTable.Properties.VariableNames{varnames{k}} = new;
+            
+        end
+        
+        function dataTable = filterRows(dataTable,fhandle,col)
+        %FILTERROWS filter the rows in a table.
+            
+            assert(isa(fhandle,'function_handle'),'Parameter must be a function handle')
+            dataTable = dataTable(fhandle(dataTable.(col)),:);
+            
+        end
+        
+        function C = ensureKeyValParamStrs(keys,keyValArray)
+            keys = cellstr(keys);
+            C = keyValArray;
+            keyValArrayStr = cellfun(@char,keyValArray,'UniformOutput',false);
+            [~,~,ib] = intersect(keys,keyValArrayStr);
+            C(ib+1) = cellfun(@char,C(ib+1),'UniformOutput',false);
+        end
+        
+    end % private static methods
+    
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MASSEFseparator.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,63 @@
+classdef MASSEFseparator < handle
+%MASSEFseparator Abstract base class for MASSEF separation algorithms
+% 
+%   MASSEFseparator properties:
+%       label       - A label for the instance of the algorithm (shown in
+%                     the results file).
+%       estTag      - Tags for the estimated outputs.
+% 
+%   MASSEFseparator methods:
+%       MASSEFseparator - Create an instance of the algorithm.
+%       separate        - Run the separation algorithm on the time-domain
+%                         mixture (Abstract).
+% 
+%   Note that this is a handle class and hence derived classes are passed
+%   by reference.
+% 
+%   See also MASSEF.
+
+%   Copyright 2016 University of Surrey.
+    
+    properties
+        label  % A label for the instance of the algorithm (shown in the MASSEF results file)
+        estTag % Tags for the estimated outputs
+    end
+    
+    methods
+        
+        % constructor
+        function obj = MASSEFseparator()
+            obj.label = '';
+            obj.estTag = '';
+        end
+        
+        % set estTag
+        function set.estTag(obj,val)
+            if ischar(val)
+                obj.estTag = cellstr(val);
+            elseif iscellstr(val)
+                obj.estTag = val;
+            else
+                error('''estTag'' must be a char array or cell array of strings');
+            end
+        end
+        
+        % set label
+        function set.label(obj,val)
+            if ischar(val)
+                obj.label = val;
+            else
+                error('''label'' must be a char array');
+            end
+        end
+        
+    end
+    
+    methods (Abstract)
+        
+        % separation
+        [signal,mask,est_azis,est_eles] = separate(obj,mixture);
+        
+    end
+   
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,59 @@
+# Multichannel audio source separation evaluation framework (MASSEF)
+
+[Chris Hummersone](mailto:c.hummersone@surrey.ac.uk), Martin Dewhirst, Joachim Fainberg
+
+The multichannel audio source separation evaluation framework is designed to facilitate the development and evaluation of audio source separation algorithms. The framework generates the mixture(s), calculates the ideal binary and ratio masks, provides the mixture(s) to the separation algorithm(s), and evaluates the outputs of the separation algorithm(s). The framework also evaluates the ideal masks for the purposes of comparison.
+
+Sources may have any number of channels; the framework evaluates each channel. The use of [`iosr.bss.mixture`](https://github.com/IoSR-Surrey/MatlabToolbox) objects facilitate the evaluation of spatialised mixtures (e.g. binaural).
+
+## Usage
+
+The framework can be run in two ways:
+
+1. by providing [`iosr.bss.mixture`](https://github.com/IoSR-Surrey/MatlabToolbox) objects and separation algorithms, or
+2. by providing estimate and true source wav files.
+ 
+If 1), the framework generates the mixture(s), calculates the ideal binary and ratio masks, provides the mixture(s) to the separation algorithm(s), and evaluates the outputs of the separation algorithm(s). The framework also evaluates: the ideal masks for the purposes of comparison, and any azimuth/elevation estimates returned by the algorithm. Use the `execute()` method to operate in this mode.
+
+If 2), the framework evaluates only the supplied estimate(s) using signal-related metrics. Use the `evaluate()` method to operate in this mode.
+
+The framework performs evaluations using a range of metrics, including SNR, [BSSeval and PEASS](http://bass-db.gforge.inria.fr/peass/), and [STOI](http://amtoolbox.sourceforge.net/amt-0.9.8/doc/models/taal2011.php). If the algorithm is intended to perform localisation, then this can also be evaluated.
+
+## Requirements
+
+1. A recent version of MATLAB (with the Signal Processing Toolbox) and a compatible C compiler. Tested on Mac OS X 10.10 and Ubuntu 14.04 using MATLAB R2014b and R2015a.
+2. Additional toolboxes are required, which are downloaded and installed automatically by the framework (see below).
+
+## Installation
+
+1. Navigate Matlab to the installation directory and type
+    ```
+    MASSEF.install
+    ```
+on the Matlab command line. This function downloads and installs the required files.
+
+2. Type
+    ```
+    MASSEF.start
+    ```
+at the start of each session to start the framework and its dependencies.
+
+## Experiments
+
+Experiments are conducted with the MASSEF class. For more information about the various framework options, type
+
+```
+doc
+```
+
+and click 'Multichannel audio source separation evaluation framework (MASSEF)' under 'Supplemental Software' for more information.
+
+More information on implementing separation algorithms can be found in the help documentation.
+
+## Cite Me
+
+TBC
+
+---
+
+Copyright 2016 University of Surrey
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/wavread.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,52 @@
+function [y,fs,bits] = wavread(filename,arg)
+%WAVREAD Read an audio file
+% 
+%   WAVREAD is a wrapper function for audioread, using the same function
+%   name and input arguments as the deprecated MATLAB WAVREAD function. It
+%   is provided in order to improve the compatibility of legacy code.
+%   
+%   Y = WAVREAD(FILENAME) loads an audio file specified by the string
+%   FILENAME, returning the sampled data in Y. Audio channels are returned
+%   in the columns of Y.
+% 
+%   [Y,FS,BITS] = WAVREAD(FILENAME) returns the sample rate (FF) in Hertz
+%   and the number of bits per sample (BITS) used to encode the data in the
+%   file.
+% 
+%   ... = WAVREAD(FILENAME,N) returns only the first N samples from each
+%   channel in the file.
+% 
+%   ... = WAVREAD(FILENAME,[N1 N2]) returns only samples N1 through N2 from
+%   each channel in the file.
+%   
+%   SIZ = WAVREAD(FILENAME,'SIZE') returns the size of the audio data
+%   contained in the file in place of the actual audio data, returning the
+%   vector SIZ = [NumSamples NumChannels].
+%   
+%   See also AUDIOREAD.
+
+%   Copyright 2016 University of Surrey.
+
+    % basic info
+    info = audioinfo(filename);
+    bits = info.BitsPerSample;
+
+    if nargin>1
+        if ischar(arg)
+            % return size
+            if strcmpi(arg,'size')
+                y = [info.TotalSamples info.NumChannels];
+            else
+                error('Unknown argument ''%s'' specified',arg)
+            end
+        else
+            % return some samples
+            assert(isnumeric(arg) && numel(arg)<=2,'The second argument must be a one- or two-element numeric array.')
+            [y,fs] = audioread(filename,arg);
+        end
+    else
+        % return all samples
+        [y,fs] = audioread(filename);
+    end
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/wavwrite.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,47 @@
+function wavwrite(y,varargin)
+%WAVWRITE Write an audio file
+% 
+%   WAVWRITE is a wrapper function for audiowrite, using the same function
+%   name and input arguments as the deprecated MATLAB WAVWRITE function. It
+%   is provided in order to improve the compatibility of legacy code.
+% 
+%   WAVWRITE(Y,FILENAME) writes an audio file specified by the string
+%   FILENAME. The audio data in Y should be arranged with one channel per
+%   column. The data are assumed to be sampled at 8000 Hz and 16 bits per
+%   sample.
+% 
+%   WAVWRITE(Y,FS,FILENAME) specifies the sample rate FS, in Hertz, of the
+%   data.
+% 
+%   WAVWRITE(Y,FS,N,FILENAME) forces an N-bit file format to be written,
+%   where N <= 32.
+%   
+%   See also AUDIOWRITE.
+
+%   Copyright 2016 University of Surrey.
+
+    % defaults
+    fs = 8000;
+    N = 16;
+
+    % determine arguments
+    switch nargin
+        case 1
+            error('Not enough input arguments')
+        case 2
+            filename = varargin{1};
+        case 3
+            fs = varargin{1};
+            filename = varargin{2};
+        case 4
+            fs = varargin{1};
+            N = varargin{2};
+            filename = varargin{3};
+        otherwise
+            error('Too many input arguments')
+    end
+
+    % write audio file
+    audiowrite(filename,y,fs,'BitsPerSample',N);
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/helptoc.xml	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,23 @@
+<?xml version='1.0' encoding="utf-8"?>
+<toc version="2.0">
+
+    <tocitem target="help_Index.html">Multichannel audio source separation evaluation framework (MASSEF)
+        <tocitem target="help_MASSEF.html">MASSEF
+            <tocitem target="help_MASSEF_evaluate.html">MASSEF.evaluate</tocitem>
+            <tocitem target="help_MASSEF_execute.html">MASSEF.execute</tocitem>
+            <tocitem target="help_MASSEF_install.html">MASSEF.install</tocitem>
+            <tocitem target="help_MASSEF_save.html">MASSEF.save</tocitem>
+            <tocitem target="help_MASSEF_start.html">MASSEF.start</tocitem>
+        </tocitem>
+        <tocitem target="help_MASSEFresults.html">MASSEFresults
+            <tocitem target="help_MASSEFresults_algorithmInfo.html">MASSEFresults.algorithmInfo</tocitem>
+            <tocitem target="help_MASSEFresults_filter.html">MASSEFresults.filter</tocitem>
+            <tocitem target="help_MASSEFresults_input.html">MASSEFresults.input</tocitem>
+            <tocitem target="help_MASSEFresults_merge.html">MASSEFresults.merge</tocitem>
+            <tocitem target="help_MASSEFresults_mixtureInfo.html">MASSEFresults.mixtureInfo</tocitem>
+        </tocitem>
+        <tocitem target="help_Separators.html">Separation Algorithms</tocitem>
+        <tocitem target="help_Example.html">Example</tocitem>
+    </tocitem>
+
+</toc>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_Example.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,88 @@
+%% Example
+% 
+%% First Steps 
+
+MASSEF.install; % you only need to do this once!
+MASSEF.start; % start MASSEF
+
+%% Make Mixtures
+% Specify the source files:
+
+target_fns = {'s1.wav','s2.wav'}; % target filenames
+interferer_fns = {'s11.wav','s12.wav'}; % interferer filenames
+
+%%
+% Create some |iosr.bss.source| objects for targets and interferers:
+
+t(length(target_fns),1) = iosr.bss.source;
+i(length(interferer_fns),1) = iosr.bss.source;
+
+%%
+% Make sources from filenames:
+
+for n = 1:length(target_fns)
+    t(n,1) = iosr.bss.source(target_fns{n});
+end
+for n = 1:length(interferer_fns)
+    i(n,1) = iosr.bss.source(interferer_fns{n});
+end
+
+% Specify source spatial parameters:
+
+azimuths = [-5 5]; % target and interferer azimuths
+tirs = [-10 0]; % target-to-interferer ratios
+rooms = {'UniS_Room_A_BRIR_16k.sofa'}; % SOFA file for spatialisation
+
+%%
+% Generate the mixtures, in all combinations of the various mixture
+% parameters, and render the mixtures to disk.
+
+fs = 16000;
+
+mixtures = iosr.bss.generateMixtures(t,i,...
+    'sofa_paths',rooms,...
+    'azimuths',azimuths,...
+    'tirs',tirs,...
+    'fs',fs,...
+    'cache',true,...
+    'folder','mixture_temp',...
+    'combine','all',...
+    'decomposition','gammatone',...
+    'gammatone',struct(...
+        'cfs',iosr.auditory.makeErbCFs(20,7500,32),...
+        'frame',round(0.02*fs)...
+    )...
+);
+
+%% Instantiate the Separation Algorithm
+
+p = messl_massef(fs);
+
+%% Choose MASSEF options
+% Specify the parameters of the MASSEF object:
+
+options = struct( ...
+    'evalPEASS',false,... % don't run PEASS
+    'evalSTOI',false);    % don't run STOI
+
+%% Run MASSEF
+
+massef = MASSEF(options);
+massef.execute(mixtures,p);
+
+%%
+% Once |execute| is complete, |massef| will be saved to
+% |Results/results.mat|. The performance data are stored in
+% |massef.results|. The full dataset can be recalled as a |Table| object in
+% the following way:
+
+resultsTable = massef.results.data;
+
+%% See also
+% <help_MASSEF.html MASSEF>, <help_MASSEFresults.html MASSEFresults>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_Index.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,61 @@
+%% Multichannel audio source separation evaluation framework (MASSEF)
+% 
+%% Overview
+% 
+% The multichannel audio source separation evaluation framework is designed
+% to faciliate the development and evaluation of audio source separation
+% algorithms. The framework generates the mixture(s), calculates the ideal
+% binary and ratio masks, provides the mixture(s) to the separation
+% algorithm(s), and evaluates the outputs of the separation algorithm(s).
+% The framework also evaluates the ideal masks for the purposes of
+% comparison.
+% 
+% Sources may have any number of channels; the framework evaluates each
+% channel. The use of iosr.bss.mixture objects facilitate the evaluation of
+% spatialised mixtures (e.g. binaural).
+% 
+% The framework comprises two main classes:
+% 
+% * <help_MASSEF.html MASSEF>&mdash;multichannel audio source separation
+% evaluation framework class.
+% * <help_MASSEFresults.html MASSEFresults>&mdash;the results class used by
+% MASSEF.
+% 
+% <help_Example.html View an example of the use of these classes.>
+% 
+% MASSEF can be used to evaluate and compare binaural separation algorithms,
+% provided that the algorithms conform to the <help_Separators.html
+% required format>.
+% 
+%% Installation
+% 
+% Before using the framework, you need to download and install its
+% dependencies. This can be done automatically using the
+% <help_MASSEF_install.html MASSEF.install> method. Before each session,
+% MASSEF needs to be started using the <help_MASSEF_start.html
+% MASSEF.start> method.
+% 
+%% Usage 
+% 
+% The framework can be run in two ways:
+% 
+% # by providing |iosr.bss.mixture| objects and separation algorithms, or
+% # by providing estimate and true source wav files.
+%   
+% If 1), the framework generates the mixture(s), calculates the ideal
+% binary and ratio masks, provides the mixture(s) to the separation
+% algorithm(s), and evaluates the outputs of the separation algorithm(s).
+% The framework also evaluates: the ideal masks for the purposes of
+% comparison, and any azimuth/elevation estimates returned by the
+% algorithm. Use the <help_MASSEF_execute.html execute> method to operate
+% in this mode.
+% 
+% If 2), the framework evaluates only the supplied estimate(s) using
+% signal-related metrics. Use the <help_MASSEF_evaluate.html evaluate>
+% method to operate in this mode.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,108 @@
+%% MASSEF
+% Multichannel audio source separation evaluation framework.
+% 
+%% Syntax
+% 
+%   massef = MASSEF
+%   massef = MASSEF(options)
+% 
+% |massef = MASSEF| instantiates the multichannel audio source separation
+% evaluation framework, returning an instance to |massef|. The instance has
+% the <help_MASSEF.html#2 properties described below>. Evaluations are
+% performed using the <help_MASSEF_evaluate.html evaluate> or
+% <help_MASSEF_execute.html execute> methods. See <help_MASSEF.html#3
+% methods> below for a list of methods.
+% 
+% |massef = MASSEF(options)| instantiates MASSEF using the options
+% contained in the scalar structure |options|. See <help_MASSEF.html#2
+% properties> below for a description of valid fields.
+%   
+%% Properties
+% <html>
+% <table>
+% <tr>
+% <td><tt>blocksize</tt></td>
+% <td>When using the parallel computing toolbox, this parameter determines
+% the maximum number of <tt>parallel.FevalFuture</tt> objects that are
+% considered at any one time. The default is 128.</td>
+% </tr>
+% <tr>
+% <td><tt>dir</tt></td>
+% <td>The MASSEF installation directory (read-only).</td>
+% </tr>
+% <tr>
+% <td><tt>evalPEASS</tt></td>
+% <td>A logical value indicating whether PEASS evaluation should be
+% executed. The default is <tt>false</tt>.</td>
+% </tr>
+% <tr>
+% <td><tt>evalSTOI</tt></td>
+% <td>A logical value indicating whether STOI evaluation should be
+% executed. The default is <tt>false</tt>.</td>
+% </tr>
+% <td><tt>parpool</tt></td>
+% <td>A <tt>parallel.Pool</tt> object on which to perform the parallel
+% separations. If the parallel computing toolbox is available,
+% <tt>MASSEF</tt> will use the current pool by default (as determined
+% by <tt>gcp('nocreate')</tt>), if one is open. If the toolbox is not
+% available, or no pool is open, separations will be performed
+% serially.</td>
+% </tr>
+% <tr>
+% <td><tt>results</tt></td>
+% <td>A <a href="help_MASSEFresults.html">MASSEFresults</a> object containing
+% results generated by the framework (read-only).</td>
+% </tr>
+% <tr>
+% <td><tt>results_filename</tt></td> <td>The name of the results file
+% returned when <a
+% href="help_MASSEF_execute.html">MASSEF.execute</a> finishes.
+% The default is <tt>'Results/results.mat'</tt>.</td>
+% </tr>
+% </table>
+% </html>
+%   
+%% Methods
+% 
+% Methods:
+% 
+% <html>
+% <table>
+% <tr>
+% <td>MASSEF</td>
+% <td>Create an instance of MASSEF.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEF_evaluate.html">evaluate</a></td>
+% <td>Run the framework using the input audio files.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEF_execute.html">execute</a></td>
+% <td>Run the framework using the input mixtures and separators.</td>
+% </tr>
+% </table>
+% </html>
+% 
+% Static methods:
+% 
+% <html>
+% <table>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEF_install.html">install</a></td>
+% <td>Download and install MASSEF dependencies.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEF_start.html">start</a></td>
+% <td>Start the framework.</td>
+% </table>
+% </html>
+% 
+%% See also
+% <help_MASSEFresults.html MASSEFresults>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF_evaluate.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,47 @@
+%% MASSEF.execute
+% Run MASSEF using input audio files.
+% 
+%% Syntax
+% 
+%   massef.evaluate(originalFiles,estimateFile)
+%   massef.evaluate(originalFiles,estimateFile,tag)
+%   massef.evaluate(originalFiles,estimateFile,tag,mixNum)
+%   massef.evaluate(originalFiles,estimateFile,tag,mixNum,sepNum)
+%   massef.evaluate(originalFiles,estimateFile,tag,mixNum,sepNum,estNum)
+% 
+% |massef.evaluate(originalFiles,estimateFile)| runs the framework using
+% the true sources provided in the wav files whose filenames are contained
+% in the cell array |originalFiles| (the target source is the first one)
+% and the estimate provided in the wav file with filename |estimateFile|.
+% 
+% The method may be called as many times as desired. Use |massef.save()|
+% when finished to save the framework and its data to a file.
+% 
+% |massef.evaluate(originalFiles,estimateFile,tag)| writes the char array
+% |tag| to the results data. Use the tag to identify different estimates in
+% the results data.
+% 
+% |massef.evaluate(originalFiles,estimateFile,tag,mixNum)| uses the mixture
+% number |mixNum| to identify the separation of a particular mixture.
+% |mixNum| is a key that can be used with |MASSEFresults.mixtureInfo()| in
+% order to add information about a particular mixture.
+% 
+% |massef.evaluate(originalFiles,estimateFile,tag,mixNum,sepNum)| uses the
+% separator number |sepNum| to identify the separation from a particular
+% algorithm. |sepNum| is a key that can be used with
+% |MASSEFresults.algorithmInfo()| in order to add information about a
+% particular algorithm.
+% 
+% |massef.evaluate(originalFiles,estimateFile,tag,mixNum,sepNum,estNum)|
+% uses the estimate number |estNum| to identify different estimates
+% from a given algorithm (e.g. a binary or soft mask output).
+% 
+%% See also
+% <help_MASSEF.html MASSEF>,
+% <help_MASSEFresults.html MASSEFresults>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF_execute.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,69 @@
+%% MASSEF.execute
+% Run MASSEF using input mixtures and separators.
+% 
+%% Syntax
+% 
+%   massef.execute(mixtures,separators)
+%   massef.execute(mixtures)
+% 
+% |massef.execute(mixtures,separators)| runs the multichannel audio source
+% separation evaluation framework (MASSEF) using the <help_MASSEF.html
+% MASSEF> instance |massef|, the array of |iosr.bss.mixture| objects
+% |mixtures| and the array (or cell array) of instances of separation
+% algorithms contained in |separators|. Separation is performed for all
+% combinations of separators and mixtures. The separation algorithm
+% instances contained in |separators| should conform to the
+% <help_Separators.html required format>.
+% 
+% The |execute| method performs evaluations of the algorithm according to
+% the data returned by the algorithm, and the options provided to
+% <help_MASSEF.html MASSEF>.
+% 
+% If the separation algorithm returns a signal, then |MASSEF.execute|
+% evaluates:
+% 
+% * signal-to-noise ratio (SNR);
+% * signal-to-ideal-noise ratio (SINR) (the SNR with respect to the signal
+% reconstructed using the ideal binary and ratio masks).
+% 
+% In addition, if |evalPEASS| is true, then PEASS and BSSeval evaluation is
+% performed. If |evalSTOI| is true, then STOI evaluation is performed.
+% 
+% If the separation algorithm returns a mask, and if the ideal mask
+% dimensions match the estimated mask dimensions, then |MASSEF.execute|
+% evaluates:
+% 
+% * ideal mask ratio (IMR) with respect to the ideal binary and ratio
+% masks.
+%
+% If the separation algorithm returns a mask but no signals, then MASSEF
+% attempts to calculate the estimate signal in order to calculate the
+% signal-related metrics mentioned above.
+% 
+% The |execute| method also calculates and evaluates the ideal binary and
+% ratio masks using the signal-related metrics utilised for the algorithm
+% evaluation. The masks are calculated using the settings that are local to
+% each |iosr.bss.mixture| object.
+% 
+% Lastly, the framework captures the estimated azimuth and elevation of the
+% targets and interferer(s), if they are returned.
+% 
+% Once the evaluation is complete, the <help_MASSEF.html MASSEF> object,
+% which contains the results data in |MASSEF.results| as a
+% <help_MASSEFresults.html MASSEFresults> object, is saved to the file
+% given by |MASSEF.results_filename|. The separation and mixture objects
+% are also saved.
+% 
+% |massef.execute(mixtures)| evaluates only the ideal masks.
+% 
+%% See also
+% <help_MASSEF.html MASSEF>, <help_MASSEF_evaluate.html MASSEF.evaluate>,
+% <help_MASSEFresults.html MASSEFresults>,
+% <matlab:doc('iosr.bss.generateMixtures') iosr.bss.generateMixtures>,
+% <matlab:doc('iosr.bss.resynthesise') iosr.bss.resynthesise>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2017 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF_install.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,24 @@
+%% MASSEF.install
+% Download and install MASSEF dependencies.
+% 
+%% Syntax
+% 
+%   MASSEF.install
+% 
+% |MASSEF.install| downloads and installs the MASSEF dependencies. These
+% dependencies are:
+% 
+% * <http://amtoolbox.sourceforge.net The Auditory Modelling Toolbox>
+% * <http://ltfat.sourceforge.net The Large Time-Frequency Analysis Toolbox>
+% * <http://bass-db.gforge.inria.fr/peass/ Perceptual Evaluation methods for Audio Source Separation Toolkit>
+% * <https://github.com/IoSR-Surrey/MatlabToolbox IoSR Matlab Toolbox>
+% * <https://sourceforge.net/projects/sofacoustics/ SOFA API>
+% 
+%% See also
+% <help_MASSEF_start.html MASSEF.start>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF_save.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,17 @@
+%% MASSEF.save
+% Save MASSEF data.
+% 
+%% Syntax
+% 
+%   MASSEF.save
+% 
+% |MASSEF.save| saves the framework's data and results to the file
+% determined by |MASSEF.results_filename|. The method is called
+% automatically when using the <help_MASSEF_execute.html execute> method;
+% in this case, the mixtures and separators are also saved.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEF_start.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,19 @@
+%% MASSEF.start
+% Start MASSEF.
+% 
+%% Syntax
+% 
+%   MASSEF.start
+% 
+% |MASSEF.start| starts the framework and its dependencies, adds the
+% required folders to the Matlab path, and updates the HTML help
+% documentation.
+% 
+%% See also
+% <help_MASSEF_install.html MASSEF.install>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,94 @@
+%% MASSEFresults
+% A class for storing MASSEF results.
+% 
+%% Syntax
+% 
+%   r = MASSEFresults
+% 
+% |r = MASSEFresults| creates an empty MASSEFresult object. Use the
+% <help_MASSEFresults_input.html MASSEFresults.input> method to add data.
+% The instance has the properties described below.
+%   
+%% Properties
+% <html>
+% <table>
+% <tr>
+% <td><tt>data</tt></td>
+% <td>The full results set returned as a Table object (read only). The
+% Table has the following columns:
+% <ul>
+% <li>algorithmNum&mdash;the algorithm number;</li>
+% <li>channel&mdash;the audio channel</li>
+% <li>estimateNum&mdash;the estimate number;</li>
+% <li>estTag&mdash;a tag for each estimate from a given algorithm;</li>
+% <li>metric&mdash;the performance metric;</li>
+% <li>mixNum&mdash;the mixture number; and</li>
+% <li>value&mdash;the value of the performance metric</li>
+% </ul>
+% Additional mixture and algorithm information is also returned in the
+% results set.
+% </td>
+% </tr>
+% <tr>
+% <td><tt>estTags</tt></td>
+% <td>A list of the <tt>estTags</tt>, taken from the separators, that
+% feature in the results set (read only).</td>
+% </tr>
+% <tr>
+% <td><tt>metrics</tt></td>
+% <td>The metrics that feature in the results set (read only).</td>
+% </tr>
+% <tr>
+% <td><tt>numAlgorithms</tt></td>
+% <td>The number of algorithms in the results set (read-only).</td>
+% </tr>
+% <tr>
+% <td><tt>numEstimates</tt></td>
+% <td>The (maximum) number of estimates in the results set (read-only).</td>
+% </tr>
+% <tr>
+% <td><tt>numChannels</tt></td>
+% <td>The (maximum) number of channels in the results set (read-only).</td>
+% </tr>
+% </table>
+% </html>
+%   
+%% Methods
+% 
+% <html>
+% <table>
+% <tr>
+% <td>MASSEFresults</td>
+% <td>Create a MASSEFresults object.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEFresults_algorithmInfo.html">algorithmInfo</a></td>
+% <td>Add separation algorithm information.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEFresults_filter.html">filter</a></td>
+% <td>Filter the results set.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEFresults_input.html">input</a></td>
+% <td>Add performance data.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEFresults_merge.html">merge</a></td>
+% <td>Combine results array into singular object.</td>
+% </tr>
+% <tr>
+% <td><a href="help_MASSEFresults_mixtureInfo.html">mixtureInfo</a></td>
+% <td>Add mixture information.</td>
+% </tr>
+% </table>
+% </html>
+% 
+%% See also
+% <help_MASSEF.html MASSEF>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults_algorithmInfo.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,20 @@
+%% MASSEFresults.algorithmInfo
+% Add algorithm information.
+% 
+%% Syntax
+% 
+%   r.algorithmInfo(algorithmNum,'name','value')
+% 
+% |r.algorithmInfo(algorithmNum,'name','value')| adds algorithm information
+% for the algorithm with number |algorithmNum| to the results set contained
+% in the <help_MASSEFresults.html MASSEFresults> object |r| using the variable
+% names and values contained in the |'name'| / |'value'| pair arguments.
+% The following information can be stored about each algorithm:
+% 
+% * |'algorithmLabel'|&mdash;a label for the algorithm (char array).
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults_filter.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,40 @@
+%% MASSEFresults.filter
+% Filter the results data set.
+% 
+%% Syntax
+% 
+%   r.filter('name','value')
+% 
+% |r.filter('name','value')| filters the results set contained in the
+% <help_MASSEFresults.html MASSEFresults> object |r| using the variable names
+% and values contained in the |'name'| / |'value'| pair arguments. The
+% parameters are:
+% 
+% * |'algorithmnum'|&mdash;Filters the data according to the algorithm
+% number. The parameter should be a function handle that takes the mixture
+% number as its input, and returns a logical value.
+% * |'channel'|&mdash;Filters the data according to channel information.
+% The parameter can be a function handle that takes the channel number as
+% its input, and returns a logical value. Alternatively, the parameter can
+% be 'max' or 'mean', which calculates the the maximum or mean respectively
+% for every combination of the other variables.
+% * |'estimate'|&mdash;Filters the data according to estimate information.
+% The specification is identical to 'channel'.
+% * |'estTag'|&mdash;Filters the data according to the estmate tag. The
+% parameter should be a function handle that takes the tag string as its
+% input, and returns a logical value.
+% * |'metric'|&mdash;Filters the data according to the metric. The
+% parameter should be a function handle that takes the metric name as its
+% input, and returns a logical value.
+% * |'mixnum'|&mdash;Filters the data according to the mixture number. The
+% parameter should be a function handle that takes the mixture number as
+% its input, and returns a logical value.
+% * |'value'|&mdash;Filters the data according to the value. The parameter
+% should be a function handle that takes the value as its input, and
+% returns a logical value.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults_input.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,17 @@
+%% MASSEFresults.input
+% Add performance data.
+% 
+%% Syntax
+% 
+%   r.input(mixtureNum,algorithmNum,estimateNum,metric,channel,estTag,value)
+% 
+% |r.input(mixtureNum,algorithmNum,estimateNum,metric,channel,estTag,value)|
+% inputs the performance data for mixture number |mixtureNum|, algorithm
+% number |algorithmNum|, estimate number |estimateNum|, metric |metric|,
+% channel number |channel|, estimate tag |estTag|, and value |value|.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults_merge.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,16 @@
+%% MASSEFresults.merge
+% Combine MASSEFresults array into singular object.
+% 
+%% Syntax
+% 
+%   newObj = r.merge
+% 
+% |newObj = r.merge| combines the elements of the <help_MASSEFresults.html
+% MASSEFresults> array |r| into a singular <help_MASSEFresults.html
+% MASSEFresults> object |newObj|.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_MASSEFresults_mixtureInfo.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,27 @@
+%% MASSEFresults.mixtureInfo
+% Add mixture information.
+% 
+%% Syntax
+% 
+%   r.mixtureInfo(mixtureNum,'name','value')
+% 
+% |r.mixtureInfo(mixtureNum,'name','value')| adds algorithm information for
+% the mixture with number |mixtureNum| to the results set contained in the
+% <help_MASSEFresults.html MASSEFresults> object |r| using the variable
+% names and values contained in the |'name'| / |'value'| pair arguments.
+% The following information can be stored about each mixture:
+% 
+% * |'azi_sep'|&mdash;azimuthal separation of widest sources (numeric);
+% * |'elevation'|&mdash;median elevation of sources (numeric);
+% * |'filename_t'|&mdash;target filename (char array);
+% * |'filename_i'|&mdash;interferer filename (char array);
+% * |'sofa_path'|&mdash;SOFA filename (char array);
+% * |'target_azi'|&mdash;the target azimuth (numeric);
+% * |'target_ele'|&mdash;the target elevation (numeric); and
+% * |'tir'|&mdash;target-to-interferer ratio (dB) (numeric).
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/help_Separators.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,60 @@
+%% Separation Algorithms
+% 
+% Separation algorithms passed to the <help_MASSEF_execute.html
+% MASSEF.execute> method have a small number of requirements. Specifically,
+% the algorithm should be implemented as a class, with some required
+% methods and properties, detailed below.
+% 
+%% Required Methods
+% 
+% There is only one required method for the separation algorithm:
+% |separate|. The algorithm may have any number of additional methods,
+% which may accept and return any number of arguments.
+% 
+% The |separate| method should have the following signature:
+% 
+%   [signals,masks,est_azis,est_eles] = obj.separate(mixture)
+% 
+% where |obj| is the separation algorithm object, |signals| are the
+% estimated signals, |masks| are time-frequency masks, |est_azis| are the
+% estimated azimuths, |est_eles| are the estimated elevations, and
+% |mixture| is the time-domain mixture signal.
+% 
+% Time-domain signals may contain any number of channels, stored in the
+% columns of their matrices. In addition, |signals| may have a third
+% dimension, used to carry different estimations. Multiple estimations
+% facilitate, for example, outputs due to binary and ratio masks. The masks
+% in |masks| should have dimensions |[N F C E]| where |N| is the number of
+% frames, |F| is the number of frequency bins/channels, |C| is the number
+% of audio channels, and |E| is the number of estimations. |est_azis| and
+% |est_eles| may be a vector, with an element for each  source; the first
+% element is the target source, subsequent elements are interferers.
+% 
+% Although all outputs must be provided by the method, outputs that are not
+% estimated may be specified as an empty array.
+% 
+%% Required Properties
+% 
+% There are two required properties for the separation algorithm:
+% 
+% * |label|&mdash;a label for the instance of the algorithm (char array);
+%   and
+% * |estTag|&mdash;tags for the estimated outputs (cell array of strings).
+% 
+% These properties are both reported in the results. The algorithm may have
+% any number of additional properties.
+% 
+%% MASSEFseparator base class
+% 
+% The |MASSEFseparator| class is provided for use as a base class for
+% separation algorithms. The |separate()| method is abstract and hence must
+% be implemented in the derived class.
+% 
+%% See also
+% <help_MASSEF.html MASSEF>, <help_MASSEF_execute.html MASSEF.execute>.
+% 
+% <html>
+% <hr>
+% <p>Copyright &copy; 2016 <a href="http://www.surrey.ac.uk">University of Surrey</a><br>
+% <a href="http://iosr.uk">Institute of Sound Recording, University of Surrey, UK</a></p>
+% </html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help_html/source/publishHelp.m	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,26 @@
+function publishHelp
+
+outdir = [MASSEF.dir filesep 'help_html' filesep];
+
+options = struct(...
+    'outputDir',outdir, ...
+    'evalCode',false ...
+);
+
+publish('help_Index.m',options);
+publish('help_MASSEF.m',options);
+publish('help_MASSEF_evaluate.m',options);
+publish('help_MASSEF_execute.m',options);
+publish('help_MASSEF_install.m',options);
+publish('help_MASSEF_save.m',options);
+publish('help_MASSEF_start.m',options);
+publish('help_MASSEFresults.m',options);
+publish('help_MASSEFresults_algorithmInfo.m',options);
+publish('help_MASSEFresults_filter.m',options);
+publish('help_MASSEFresults_input.m',options);
+publish('help_MASSEFresults_merge.m',options);
+publish('help_MASSEFresults_mixtureInfo.m',options);
+publish('help_Separators.m',options);
+publish('help_Example.m',options);
+
+builddocsearchdb(outdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/info.xml	Thu Mar 02 09:44:08 2017 +0000
@@ -0,0 +1,10 @@
+<productinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="optional">
+     
+    <matlabrelease>2016a</matlabrelease>
+    <name>Multichannel audio source separation evaluation framework (MASSEF)</name>
+    <type>matlab</type>
+    <icon></icon>
+    <help_location>help_html</help_location>
+  
+</productinfo>
\ No newline at end of file