The Auditory Modeling Toolbox

Applies to version: 0.10.0

View the help

Go to function

EXP_LINDEMANN1986 - Figures from Lindemann (1986)

Program code:

function output = exp_lindemann1986(varargin)
%EXP_LINDEMANN1986 Figures from Lindemann (1986)
%   Usage: output = exp_lindemann1986(flag)
%
%   EXP_LINDEMANN1986(flag) reproduces the results for the figure given
%   by flag from the Lindemann (1986) paper. It will also plot the
%   results.  The format of its output depends on the chosen figure. If not
%   otherwise stated, the cross-correlation of a pure tone sinusoids with
%   f=500 Hz and different ITDs, ILDs or a combination of both is
%   calculated. Because of the stationary character of the input signals,
%   T_{int} = inf is used to produce only one time step in the crosscorr
%   output.
%   
%   The following flags can be specified;
%
%     'plot'     plot the output of the experiment. This is the default.
%
%     'noplot'   Don't plot, only return data.
%
%     'auto'     Re-calculate the file if it does not exist. Return 1 if the
%                file exist, otherwise 0. This is the default
%
%     'redo'     Always recalculate the results.
%
%     'cached'   Always use the cached version. Default.
%
%     'fig6'  Reproduce Fig.6 from Lindemann (1986).  The cross-correlation is
%             calculated for different ITDs and different inhibition factors
%             c_s=0,0.3,1. Afterwards for every c_s the correlation is
%             plotted for every used ITD dependend on the correlation-time
%             delay. The output is cross-correlation result of the figure.
%             The output has dimensions: number of c_s conditions x
%             nitds x delay line length
%
%     'fig7'  Reproduce Fig.7 from Lindemann (1986).  The cross-correlation
%             is calculated for different ITDs and different inhibition
%             factors c_s=0,0.2,0.4,0.6,0.8,1.0. Afterwards for every
%             c_s the displacement of the centroid of the auditory image
%             is calculated and plotted depending on the ITD. The output is
%             the displacement of the centroid for different c_s values.
%             The output has dimensions: c_s x nitds
%
%     'fig8'  Reproduce Fig.8 from Lindemann (1986).  The cross-correlation
%             is calculated for different ILDs and different inhibition factors
%             c_s = 0.3, 1. Afterwards for every c_s the ILD is plotted
%             depending on the correlation time. The output is the
%             cross-correlation result of the figure. The dimensions of the
%             output are: number of c_s conditions x nilds x delay line length.
%
%     'fig10'  Reproduce Fig.10 from Lindemann (1986). The
%              cross-correlation is calculated for different ILDs with an
%              inhibition factor of c_s = 0.3 and a monaural detector
%              factor w_f = 0.035. Afterwards the ILD is plotted depending
%              on the correlation time.  The output is the cross-correlation
%              result of the figure.  The output has dimensions:
%              number of c_s conditions x nilds x delay line length
%
%     'fig11'  Reproduce Fig.11 from Lindemann (1986).  The centroid
%              position is calculated for different ILDs, an inhibition
%              factor c_s = 0.3 and a monaural detector factor w_f =
%              0.035. Afterwards for every c_s the displacement of the
%              centroid is plotted dependend on the ILD. The output is the
%              cross-correlation result of the to figure. The dimensions of
%              the output are: number of c_s conditions x nilds x delay
%              line length
%
%     'fig12'  Reproduce Fig.12 from Lindemann (1986). The centroids are
%              calculated for combinations of ITDs and ILDs.  After the
%              calculation the values for the centroids of the stimuli are
%              searched to find the nearest value to 0. The corresponding ILD
%              value is stored in output and plotted depending on the
%              ITD. The output is the simulated results for a trading
%              experiment. The ILD value for getting a centroid near the
%              center for an combined ITD, ILD stimulus with a given ITD
%              value.  The output has dimensions: number of ITDs x 1
%
%     'fig13'  Reproduce Fig.13 from Lindemann (1986). The centroids are
%              calculated for ILD only and ITD/ILD combination
%              stimuli. After the calculation the values for the centroids
%              of the ILD only stimuli are searched to find the nearest
%              value to the centroid of a given combined stimulus. The
%              resulting ILD value is stored for different combinaition
%              values and plotted dependend on ITD. The output is the ILD
%              value for getting the same lateralization with an ILD only
%              stimulus compared to a stimulus with both ITD and ILD.
%              The output has dimensions: number of ILDs x number of ITDs
%
%     'fig14a'  Reproduce fig.14 (a) from Lindemann (1986). The
%               cross-correlations for a combination of ILDs and a ITD of
%               ~1ms are calculated. This is done for different ILDs and
%               different inhibition factors c_s = 0,0.2,0.4,0.6,1.
%               Afterwards for every c_s the centroid of the auditory image
%               is calculated and plotted dependend on the ILD. The output is
%               the displacement of the centroid for different c_s values
%               and ILDs. The output has dimensions: c_s x nilds
%
%     'fig14b'  Reproduce Fig.14 (b) from Lindemann (1986). The
%               cross-correlations for a combination of ILDs and a ITD of ~1ms
%               are calculated. This is done for different small ILDs with a
%               standard deviation of 0-5. Afterwards for every standard
%               deviation the mean centroid displacement is calculated and
%               plotted dependend on the ITD. The output is the displacement
%               of the centroid as a function of the ITD averaged over
%               different small ILD with a standard deviation of 0,1,2,3,4,5.
%               The output has dimensions: nilds x nitds
%               THIS FIGURE DOES NOT SEEM TO MATCH THE PAPER!
%
%     'fig15'  Reproduce Fig.15 from Lindemann (1986). The cross-correlation
%              for an ITD of -0.5ms is calculated. This is done for
%              different ILDs, an inhibition factor c_s = 0.3 and a
%              monaural detector factor w_f = 0.035. Afterwards for every
%              c_s the ILD is plotted depending on the correlation
%              time. The output is the cross-correlation result. The output
%              has dimensions: number of c_s conditions x nilds x delay line
%              length
%
%     'fig16'  Reproduces Fig.16 from Lindemann (1986). The
%              cross-correlations for combinations of ITDs and ILDs are
%              calculated. Afterwards the combinations of ILD and ITD are
%              looked for the ones that have two peaks in its
%              cross-correlation which have the nearly same height. The
%              corresponding ILD value is than stored in output and plotted
%              dependend on the ITD. The output is the ILD value for which
%              the cross-correlation for a combined ITD, ILD stimulus has
%              two peaks with the same (nearest) height, depending on the
%              ITD. The output has dimensions: number of ITDs x 1
%
%     'fig17'  Reproduce Fig.17 from Lindemann (1986). The
%              cross-correlation for ITD/ILD combination and ITD only
%              stimuli is calculated. Afterwards the values for the
%              centroids and maxima of the ITD only stimuli are searched to
%              find the nearest value to the centroid and maxima of a given
%              combined stimulus. The resulting ITD value is stored for
%              different combinaition values. The output is the ITD
%              value for getting the same lateralization with an ITD only
%              stimulus compared to a stimulus with both ITD and ILD using
%              the centroid of the cross-correlation.  The output has
%              dimensions: number of ITDs x number of ILDs. 
%
%     'fig18'  Reproduce Fig.18 from Lindemann (1986). The cross-correlation
%              of pink noise with different interaural coherence values is
%              calculated.  Afterwards for every interaural coherence value
%              the correlation is plotted dependend on the correlation-time
%              delay. The output is the cross-correlation result of the
%              figure. The output has dimensions: number of interaural
%              coherences x delay line length
%
%   If no flag is given, the function will print the list of valid flags.
%
%   Examples:
%   ---------
%
%   To display Figure 6 use :
%
%     exp_lindemann1986('fig6');
%
%   To display Figure 7 use :
%
%     exp_lindemann1986('fig7');
%
%   To display Figure 8 use :
%
%     exp_lindemann1986('fig8');
%
%   To display Figure 10 use :
%
%     exp_lindemann1986('fig10');
%
%   To display Figure 11 use :
%
%     exp_lindemann1986('fig11');
%
%   To display Figure 12 use :
%
%     exp_lindemann1986('fig12');
%
%   To display Figure 13 use :
%
%     exp_lindemann1986('fig13');
%
%   To display Figure 14a use :
%
%     exp_lindemann1986('fig14a');
%
%   To display Figure 15 use :
%
%     exp_lindemann1986('fig15');
%
%   To display Figure 16 use :
%
%     exp_lindemann1986('fig16');
%
%   To display Figure 17 use :
%
%     exp_lindemann1986('fig17');
%
%   To display Figure 18 use :
%
%     exp_lindemann1986('fig18');
%
%   References:
%     W. Lindemann. Extension of a binaural cross-correlation model by
%     contralateral inhibition. I. Simulation of lateralization for
%     stationary signals. J. Acoust. Soc. Am., 80:1608--1622, 1986.
%     
%
%
%   Url: http://amtoolbox.sourceforge.net/data/amt-test/htdocs/amt-0.10.0/doc/experiments/exp_lindemann1986.php

% Copyright (C) 2009-2020 Piotr Majdak and the AMT team.
% This file is part of Auditory Modeling Toolbox (AMT) version 0.10.0
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program.  If not, see <http://www.gnu.org/licenses/>.

%   AUTHOR: Hagen Wierstorf

definput.import={'amt_cache'};
definput.flags.type={'missingflag','fig6','fig7','fig8','fig10','fig11',...
                    'fig12','fig13','fig14a','fig14b','fig15',...
                    'fig16','fig17','fig18'};

definput.flags.plot={'plot','noplot'};

[flags,keyvals]  = ltfatarghelper({},definput,varargin);


if flags.do_missingflag
  flagnames=[sprintf('%s, ',definput.flags.type{2:end-2}),...
             sprintf('%s or %s',definput.flags.type{end-1},definput.flags.type{end})];
  error('%s: You must specify one of the following flags: %s.',upper(mfilename),flagnames);
end;

%% ------ FIG 6 -----------------------------------------------------------
if flags.do_fig6
    
  % Sampling rate
  fs = 44100;
  % Frequency of the sinusoid
  f = 500;
  T = 1/f;
  fc = round(freqtoerb(f));   % corresponding frequency channel
  
  % Model parameter
  T_int = inf;
  w_f = 0;
  M_f = 6; % not used, if w_f==0
  c_s = [0,0.3,1];
  
  % NOTE: the longer the signal, the more time we need for computation. On the
  % other side N_1 needs to be long enough to eliminate any onset effects.
  % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
  % results for this demo.
  N_1 = ceil(25*T*fs);
  siglen = ceil(30*T*fs);
  
  % Calculate crosscorrelations for 21 ITD points between 0~ms and 1~ms
  nitds = 21; % number of used ITDs
  ndl = round(fs/1000)+1;   % length of the delay line (see lindemann1986_bincorr.m)
  itd = linspace(0,1,nitds);
  
  output=amt_cache('get','fig6',flags.cachemode);
  
  if isempty(output)
    output = zeros(length(c_s),nitds,ndl);
    for ii = 1:nitds; 
        % Generate ITD shifted sinusoid
        sig = sig_itdsin(f,itd(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation for different inhibition factor c_s
        for jj = 1:length(c_s)
            % Calculate cross-correlation (and squeeze due to T_int==inf)
            tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
            % Store the needed frequency channel. NOTE: the cross-correlation
            % calculation starts with channel 5, so we have to subtract 4.
            output(jj,ii,:) =  tmp(:,fc-4);
        end
    end

    amt_cache('set','fig6',output);
  end;
    
  if flags.do_plot
    % ------ Plotting ------
    % Generate time axis
    tau = linspace(-1,1,ndl);
    % Plot figure for every c_s condition
    for jj = 1:length(c_s)
      figure;
      mesh(tau,itd(end:-1:1),squeeze(output(jj,:,:)));
      view(0,57);
      xlabel('correlation-time tau (ms)');
      ylabel('interaural time difference (ms)');
      set(gca,'YTick',0:0.2:1);
      set(gca,'YTickLabel',{'1','0.8','0.6','0.4','0.2','0'});
      tstr = sprintf('c_s = %.1f\nw_f = 0\nf = %i Hz\n',c_s(jj),f);
      title(tstr);
    end
  end;

end;


%% ------ FIG 7 -----------------------------------------------------------
if flags.do_fig7
    
    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0;
    M_f = 6; % not used, if w_f==0
    c_s = 0:0.2:1;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 21 ITD points between 0~ms and 1~ms
    nitds = 21; % number of used ITDs
    itd = linspace(0,1,nitds);
    
    output=amt_cache('get','fig7',flags.cachemode);
    if isempty(output)
      
      output = zeros(length(c_s),nitds);
      for ii = 1:nitds 
        % Generate ITD shifted sinusoid
        sig = sig_itdsin(f,itd(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply an onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation for different inhibition factor c_s 
        for jj = 1:length(c_s)
          % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
          % Store the needed frequency channel. NOTE: the cross-correlation
          % calculation starts with channel 5, so we have to subtract 4.
          cc = tmp(:,fc-4);
          % Calculate the position of the centroid
          output(jj,ii) = lindemann1986_centroid(cc);
        end
      end
      amt_cache('set','fig7',output);
    end;
    
    if flags.do_plot
      % ------ Plotting ------
      figure;
      for jj = 1:length(c_s)
        plot(itd,output(jj,:));
        hold on;
      end
      xlabel('interaural time difference (ms)');
      ylabel('displacement of the centroid d');
      tstr = sprintf('w_f = 0\nf = %i Hz\n',f);
      title(tstr);
    end;
  
end;


%% ------ FIG 8 -----------------------------------------------------------
if flags.do_fig8
  
  % Sampling rate
  fs = 44100;
  % Frequency of the sinusoid
  f = 500;
  T = 1/f;
  fc = round(freqtoerb(f));   % corresponding frequency channel
  
  % Model parameter
  T_int = inf;
  w_f = 0;
  M_f = 6; % not used, if w_f==0
  c_s = [0.3,1];

  % NOTE: the longer the signal, the more time we need for computation. On the
  % other side N_1 needs to be long enough to eliminate any onset effects.
  % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
  % results for this demo.
  N_1 = ceil(25*T*fs);
  siglen = ceil(30*T*fs);
  
  % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
  nilds = 26; % number of used ILDs
  ndl = 2*round(fs/2000)+1;   % length of the delay line (see bincorr.m)
  ild = linspace(0,25,nilds);
  
  output=amt_cache('get','fig8',flags.cachemode);
  if isempty(output)
    
    output = zeros(2,nilds,ndl);
    for ii = 1:nilds 
      % Generate sinusoid with given ILD
      sig = sig_ildsin(f,ild(ii),fs);
      % Use only the beginning of the signal to generate only one time instance of
      % the cross-correlation and apply onset window
      sig = sig(1:siglen,:);
      sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
      % Calculate cross-correlation for different inhibition factor c_s 
      for jj = 1:length(c_s)
        % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
          % Store the needed frequency channel. NOTE: the cross-correlation
          % calculation starts with channel 5, so we have to subtract 4.
          output(jj,ii,:) = tmp(:,fc-4);
      end
    end
    
    amt_cache('set','fig8',output);
  end;
  
  if flags.do_plot
    % ------ Plotting ------
    % Generate time axis
    tau = linspace(-1,1,ndl);
    % Plot figure for every c_s condition
    for jj = 1:length(c_s) 
      figure;
      mesh(tau,ild(end:-1:1),squeeze(output(jj,:,:)));
      view(0,57);
      xlabel('correlation-time delay (ms)');
      ylabel('interaural level difference (dB)');
      set(gca,'YTick',0:5:25);
      set(gca,'YTickLabel',{'25','20','15','10','5','0'});
      tstr = sprintf('c_{inh} = %.1f\nw_f = 0\nf = %i Hz\n',c_s(jj),f);
      title(tstr);
    end
  end;
  
end;


%% ------ FIG 10 ----------------------------------------------------------
if flags.do_fig10

  % Sampling rate
  fs = 44100;
  % Frequency of the sinusoid
  f = 500;
  T = 1/f;
  fc = round(freqtoerb(f));   % corresponding frequency channel
  
  % Model parameter
  T_int = inf;
  w_f = 0.035;
  M_f = 6; % not used, if w_f==0
  c_s = 0.3;
  
  % NOTE: the longer the signal, the more time we need for computation. On the
  % other side N_1 needs to be long enough to eliminate any onset effects.
  % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
  % results for this demo.
  N_1 = ceil(25*T*fs);
  siglen = ceil(30*T*fs);
  
  % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
  nilds = 26; % number of used ILDs
  ndl = 2*round(fs/2000)+1;   % length of the delay line (see bincorr.m)
  ild = linspace(0,25,nilds);
  
  output=amt_cache('get','fig10',flags.cachemode);
  if isempty(output)

    output = zeros(length(c_s),nilds,ndl);
    for ii = 1:nilds 
      % Generate sinusoid with given ILD
      sig = sig_ildsin(f,ild(ii),fs);
      % Use only the beginning of the signal to generate only one time instance of
      % the cross-correlation and apply onset window
      sig = sig(1:siglen,:);
      sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
      % Calculate cross-correlation for different inhibition factor c_s 
      for jj = 1:length(c_s)
        % Calculate cross-correlation (and squeeze due to T_int==inf)
        tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
        % Store the needed frequency channel. NOTE: the cross-correlation
        % calculation starts with channel 5, so we have to subtract 4.
        output(jj,ii,:) = tmp(:,fc-4);
      end
    end
    
    amt_cache('set','fig10',output);
  end;
  
  
  % ------ Plotting ------
  if flags.do_plot
    % Generate time axis
    tau = linspace(-1,1,ndl);
    % Plot figure for every c_s condition
    for jj = 1:length(c_s)
      figure;
      mesh(tau,ild(end:-1:1),squeeze(output(jj,:,:)));
      view(0,57);
      xlabel('correlation-time delay (ms)');
      ylabel('interaural level difference (dB)');
      set(gca,'YTick',0:5:25);
      set(gca,'YTickLabel',{'25','20','15','10','5','0'});
      tstr = sprintf('c_{inh} = %.1f\nw_f = 0.035\nf = %i Hz\n',c_s(jj),f);
      title(tstr);
    end
  end;
  
end;


%% ------ FIG 11 ----------------------------------------------------------
if flags.do_fig11

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = [0,0,0.035];
    M_f = 6; % not used, if w_f==0
    c_s = [0.3,1,0.3];

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Caelculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nilds = 26; % number of used ILDs
    ild = linspace(0,25,nilds);
          
    output=amt_cache('get','fig11',flags.cachemode);
    if isempty(output)
      
      output = zeros(length(c_s),nilds);
      for ii = 1:nilds 
        % Generate sinusoid with given ILD
        sig = sig_ildsin(f,ild(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation for different inhibition factor c_s 
        for jj = 1:length(c_s)
          % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f(jj),M_f,T_int,N_1));
          % Store the needed frequency channel
          cc = tmp(:,fc-4);
          % Calculate the position of the centroid
          output(jj,ii) = lindemann1986_centroid(cc);
        end
      end
      
      amt_cache('set','fig11',output);
    end;


    if flags.do_plot
      % ------ Plotting ------
      figure;
      % Plot data from experiments
      data = data_lindemann1986('fig11_yost');
      plot(data(:,1),data(:,2)*0.058,'+');
      hold on;
      data = data_lindemann1986('fig11_sayers');
      plot(data(:,1),data(:,2)*0.058,'*');
      % Plot line for every condition
      for jj = 1:length(c_s) 
        plot(ild,output(jj,:));
      end
      axis([0 25 0 0.8]);
      legend('500 Hz, Yost','600 Hz, Sayers','500 Hz, model');
      xlabel('interaural level difference (dB)');
      ylabel('displacement of the centroid d');
    end;

end;


%% ------ FIG 12 ----------------------------------------------------------
if flags.do_fig12

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.3;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nilds = 21; % number of used ILDs for the ILD only stimuli
    nitds = 21; % number of used ITDs for the combined stimuli
    ild = linspace(0,10,nilds);
    itd = linspace(-1,0,nitds);

    output=amt_cache('get','fig12',flags.cachemode);
    if isempty(output)

    
      % Calculate the centroids for ILD+ITD stimuli
      cen = zeros(nitds,nilds);
      for ii = 1:nitds
        for jj = 1:nilds
          % Generate sinusoid with given ILD
          sig = sig_itdildsin(f,itd(ii),ild(jj),fs);
          % Use only the beginning of the signal to generate only one time 
          % instance of the cross-correlation and apply a linear onset window
          sig = sig(1:siglen,:);
          sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
          % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
          % Store the needed frequency channel
          cc = tmp(:,fc-4);
          % Calculate the position of the centroid
          cen(ii,jj) = lindemann1986_centroid(cc);
        end
      end
      
      
      % ------ Fiting ------
      % For every ITD find the ILD with gives a centroid near 0
      output = zeros(nitds,1);
      for ii = 1:nitds
        % Find centroid nearest to 0
        [val,idx] = min(abs(cen(ii,:)));
        output(ii) = ild(idx);
      end
      
      amt_cache('set','fig12',output);
    end;

    if flags.do_plot
      % ------ Plotting ------
      figure;
      data = data_lindemann1986('fig12_400');
      plot(data(:,1),data(:,2),'+');
      hold on;
      data = data_lindemann1986('fig12_600');
      plot(data(:,1),data(:,2),'*');
      plot(itd,output);
      axis([-1 0 0 10]);
      legend('400 Hz','600 Hz','500 Hz, model');
      xlabel('interaural time difference (ms)');
      ylabel('interaural level difference (dB)');
    end;

end;


%% ------ FIG 13 ----------------------------------------------------------
if flags.do_fig13

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    N_1 = 1;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.3;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nilds_p = 21; % number of used ILDs for the ILD only stimuli
    nitds_t = 21; % number of used ITDs for the combined stimuli
    nilds_t = 6;  % number of used ILDs for the combined stimuli
    ndl = 2*round(fs/2000)+1;     % length of the delay line (see bincorr.m)
    ild_p = linspace(-10,40,nilds_p);
    itd_t = linspace(-1,1,nitds_t);
    ild_t = [-3,0,3,9,15,25];

    output=amt_cache('get','fig13',flags.cachemode);
    if isempty(output)
      
      % Calculate the centroids for the ILD only stimuli
      cen_p = zeros(1,nilds_p);
      for ii = 1:nilds_p
        % Generate sinusoid with given ILD
        sig = sig_ildsin(f,ild_p(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply a linear onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation (and squeeze due to T_int==inf)
        tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
        % Store the needed frequency channel
        cc = tmp(:,fc-4);
        % Calculate the position of the centroid
        cen_p(ii) = lindemann1986_centroid(cc);
      end
      
      % Calculate the centroids for the combined stimuli
      cen_t = zeros(nilds_t,nitds_t);
      for ii = 1:nitds_t
        for jj = 1:nilds_t
          sig = sig_itdildsin(f,itd_t(ii),ild_t(jj),fs);
          sig = sig(1:siglen,:);
          sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
          tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
          cc = tmp(:,fc-4);
          cen_t(jj,ii) = lindemann1986_centroid(cc);
        end
      end

      % ------ Fitting ------
      % For the results for the combined centroids find the nearest centroid for the
      % ILD only stimuli
      output = zeros(nilds_t,nitds_t);
      for ii = 1:nitds_t
        for jj = 1:nilds_t
          idx = findnearest(cen_p,cen_t(jj,ii));
          output(jj,ii) = ild_p(idx);
        end
      end
      
      amt_cache('set','fig13',output);
    end;
    
    if flags.do_plot
      % ------ Plotting ------
      % First plot the only data from experiments
      figure;
      d = data_lindemann1986('fig13');
      plot(d(:,1),d(:,2),'x-r', ...   % -3dB
           d(:,1),d(:,3),'x-b', ...   %  3dB
           d(:,1),d(:,4),'x-g', ...   %  9dB
           d(:,1),d(:,5),'x-b', ...   % 15dB
           d(:,1),d(:,6),'x-r')       % 25dB
      legend('25dB','15dB','9dB','3dB','-3dB');
      axis([-1 1 -10 40]);
      set(gca,'XTick',-1:0.4:1);
      xlabel('interaural time difference (ms)');
      ylabel('interaural level difference (dB)');
      % Then plot model results
      figure;
      % Plot line for every condition
      for jj = 1:nilds_t
        plot(itd_t,output(jj,:));
        hold on;
      end
      axis([-1 1 -10 40]);
      set(gca,'XTick',-1:0.4:1);
      xlabel('interaural time difference (ms)');
      ylabel('interaural level difference (dB)');
    end;

end;


%% ------ FIG 14a ---------------------------------------------------------
if flags.do_fig14a

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % --- FIG 14 (a) ---
    % Model parameter
    T_int = inf;
    w_f = 0;
    M_f = 6; % not used, if w_f==0
    c_s = [0.0,0.2,0.4,0.6,1.0];

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 21 ITD points between 0~ms and 1~ms
    nilds = 21; % number of used ITDs
    ild = linspace(-3,3,nilds);
    itd = 2000/f;
    
    output=amt_cache('get','fig14a',flags.cachemode);
    if isempty(output)
     
      output = zeros(length(c_s),nilds);
      for ii = 1:nilds 
        % Generate ITD shifted sinusoid
        sig = sig_itdildsin(f,itd,ild(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation
        sig = sig(1:siglen,:);
        % Apply a linear onset window with length N_1/2 to minimize onset effects
        % (see lindemann1986 p. 1614)
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation for different inhibition factor c_s 
        for jj = 1:length(c_s)
          % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
          % Store the needed frequency channel. NOTE: the cross-correlation
          % calculation starts with channel 5, so we have to subtract 4.
            cc = tmp(:,fc-4);
            % Calculate the position of the centroid
            output(jj,ii) = lindemann1986_centroid(cc);
        end
      end
      
      amt_cache('set','fig14a',output);
    end;
    
    if flags.do_plot
      % ------ Plotting ------
      figure;
      for jj = 1:length(c_s)
        plot(ild,output(jj,:));
        hold on;
      end
      xlabel('interaural level difference (dB)');
      ylabel('displacement of the centroid d');
      tstr = sprintf('w_f = 0\nf = %i Hz\n',f);
      title(tstr);
    end;

end;


%% ------ FIG 14b ---------------------------------------------------------
if flags.do_fig14b

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0;
    M_f = 6; % not used, if w_f==0
    c_s = 1.0;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 21 ITD points between 0~ms and 1~ms
    nitds = 21; % number of used ITDS
    nilds = 201; % number of used ILDs
    itd = linspace(0,1,nitds);
    ild_std = [1,2,3,4,5];
    
    output=amt_cache('get','fig14b',flags.cachemode);
    if isempty(output)

      amt_disp('NOTE: this test function will need a lot of time!','progress');

      output = zeros(length(ild_std)+1,nitds);
      centmp = zeros(nilds,nitds);
      for ii = 1:nitds
        % Show progress
        amt_disp([num2str(ii) ' of ' num2str(nitds)],'progress');
        % First generate the result for std(ILD) == 0
        sig = sig_itdsin(f,itd(ii),fs);
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
        cc = tmp(:,fc-4);
        cen(1,ii) = lindemann1986_centroid(cc);
        % Generate results for std(ILD) ~= 0
        for nn = 1:length(ild_std)
          % Generate normal distributed ILDs with mean ~ 0 and std = 1
          tmp = randn(nilds,1);
          tmp = tmp/std(tmp);
          % Generate desired ILD distribution
          ild = tmp * ild_std(nn);
          % For all distributed ILD values calculate the centroid
          for jj = 1:nilds
            sig = sig_itdildsin(f,itd(ii),ild(jj),fs);
            sig = sig(1:siglen,:);
            sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
            tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
            cc = tmp(:,fc-4);
            centmp(jj,ii) = lindemann1986_centroid(cc);
          end
          % Calculate the mean centroid above the ILD distribution
          output(nn+1,ii) = mean(centmp(:,ii));
        end
      end
      
      amt_cache('set','fig14b',output);
    end;

    if flags.do_plot
      figure;
      for nn = 1:length(ild_std)+1
        plot(itd,output(nn,:)); hold on;
      end
      axis([0 1 0 1]);
      xlabel('interaural level difference (dB)');
      ylabel('displacement of the centroid d');
      tstr = sprintf('w_f = 0\nc_{inh} = 1\nf = %i Hz\n',f);
      title(tstr);
    end;

end;


%% ------ FIG 15 ----------------------------------------------------------
if flags.do_fig15

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.3;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640 (200*T). Here I uses only N_1 = 2205 (25*T) 
    % which gives the same results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nilds = 26; % number of used ILDs
    ndl = 2*round(fs/2000)+1;   % length of the delay line (see bincorr.m)
    ild = linspace(0,25,nilds);
    itd = -0.5;
    
    output=amt_cache('get','fig15',flags.cachemode);
    if isempty(output)
        
      output = zeros(length(c_s),nilds,ndl);
      for ii = 1:nilds 
        % Generate sinusoid with given ILD
        sig = sig_itdildsin(f,itd,ild(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation for different inhibition factor c_s 
        for jj = 1:length(c_s)
          % Calculate cross-correlation (and squeeze due to T_int==inf)
            tmp = squeeze(lindemann1986(sig,fs,c_s(jj),w_f,M_f,T_int,N_1));
            % Store the needed frequency channel. NOTE: the cross-correlation
            % calculation starts with channel 5, so we have to subtract 4.
            output(jj,ii,:) = tmp(:,fc-4);
        end
      end

      amt_cache('set','fig15',output);
    end;

    if flags.do_plot
      % ------ Plottinqg --------------------------------------------------------
      % Generate time axis
      tau = linspace(-1,1,ndl);
      % Plot figure for every c_s condition
      for jj = 1:length(c_s)
        figure;
        mesh(tau,ild(end:-1:1),squeeze(output(jj,:,:)));
        view(0,57);
        xlabel('correlation-time delay (ms)');
        ylabel('interaural level difference (dB)');
        set(gca,'YTick',0:5:25);
        set(gca,'YTickLabel',{'25','20','15','10','5','0'});
        tstr = sprintf('c_{inh} = %.1f\nw_f = 0.035\nf = %i Hz\n',c_s(jj),f);
        title(tstr);
      end
    end;

end;


%% ------ FIG 16 ---------------------------------------------------------
if flags.do_fig16

  
  s = [mfilename('fullpath'),'_fig16.mat'];

    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.3;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nilds = 21; % number of used ILDs for the ILD only stimuli
    nitds = 21; % number of used ITDs for the combined stimuli
    ndl = 2*round(fs/2000)+1;     % length of the delay line (see bincorr.m)
    ild = linspace(0,10,nilds);
    itd = linspace(-1,0,nitds);

    output=amt_cache('get','fig16',flags.cachemode);
    if isempty(output)
      
      % Calculate the centroids for ILD+ITD stimuli
      cc = zeros(nitds,nilds,ndl);
      for ii = 1:nitds
        for jj = 1:nilds
          % Generate sinusoid with given ILD
          sig = sig_itdildsin(f,itd(ii),ild(jj),fs);
          % Use only the beginning of the signal to generate only one time 
          % instance of the cross-correlation and apply a linear onset window
          sig = sig(1:siglen,:);
          sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
          % Calculate cross-correlation (and squeeze due to T_int==inf)
          tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
          % Store the needed frequency channel
          cc(ii,jj,:) = tmp(:,fc-4);
        end
      end

      
      % ------ Fiting ------
      % For every ITD find the ILD with gives a centroid near 0
      output = zeros(nitds,1);
      for ii = 1:nitds
        % Find two peaks of same height
        idx = findpeaks(squeeze(cc(ii,:,:)));
        output(ii) = ild(idx);
      end

      amt_cache('set','fig16',output);
    end;
    
      
    if flags.do_plot
      % ------ Plotting ------
      figure;
      data = data_lindemann1986('fig16');
      plot(data(:,1),data(:,2),'+');
      hold on;
      plot(itd,output);
      axis([-1 0 0 15]);
      xlabel('interaural time difference (ms)');
      ylabel('interaural level difference (dB)');
    end;

end;


%% ------ FIG 17 ----------------------------------------------------------
if flags.do_fig17

  
    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.3;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);
    siglen = ceil(30*T*fs);

    % Calculate crosscorrelations for 26 ILD points between 0~dB and 25~dB
    nitds_p = 21; % number of used ITDs for the ITD only stimuli
    nitds_t = 4; % number of used ITDs for the combined stimuli
    nilds_t = 21;  % number of used ILDs for the combined stimuli
    itd_p = linspace(-0.36,0.72,nitds_p);
    ild_t = linspace(-9,9,nilds_t);
    itd_t = [0,0.09,0.18,0.27];

    output=amt_cache('get','fig17',flags.cachemode);
    if isempty(output)
      
      % Calculate the centroids for the ITD only stimuli
      cen_p = zeros(1,nitds_p);
      max_p = zeros(1,nitds_p);
      for ii = 1:nitds_p
        % Generate sinusoid with given ILD
        sig = sig_itdsin(f,itd_p(ii),fs);
        % Use only the beginning of the signal to generate only one time instance of
        % the cross-correlation and apply a linear onset window
        sig = sig(1:siglen,:);
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation (and squeeze due to T_int==inf)
        tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
        % Store the needed frequency channel
        cc = tmp(:,fc-4);
        % Find the maximum position
        max_p(ii) = findmax(cc);
        % Calculate the position of the centroid
        cen_p(ii) = lindemann1986_centroid(cc);
      end
      
      % Calculate the centroids for the combined stimuli
      cen_t = zeros(nitds_t,nilds_t);
      max_t = zeros(nitds_t,nilds_t);
      for ii = 1:nilds_t
        for jj = 1:nitds_t
          sig = sig_itdildsin(f,itd_t(jj),ild_t(ii),fs);
          sig = sig(1:siglen,:);
          sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
          tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
          cc = tmp(:,fc-4);
          max_t(jj,ii) = findmax(cc);
          cen_t(jj,ii) = lindemann1986_centroid(cc);
        end
      end
      
      % ------ Fiting ------
      % For the results for the combined centroids find the nearest centroid for the
      % ITD only stimuli
      output.rmax = zeros(nitds_t,nilds_t);
      output.rcen = output.rmax;
      for ii = 1:nilds_t
        for jj = 1:nitds_t
          idx = findnearest(cen_p,cen_t(jj,ii));
          output.rcen(jj,ii) = itd_p(idx);
          idx = findnearest(max_p,max_t(jj,ii));
          output.rmax(jj,ii) = itd_p(idx);
        end
      end
      
      amt_cache('set','fig17',output);
    end;
    
      
    if flags.do_plot
      % ------ Plotting ------
      % First plot the only data from experiments
      figure; % fig 17 (a)
      d = data_lindemann1986('fig17');
      plot(d(:,1),d(:,5),'x-r', ...   %  0 ms
           d(:,1),d(:,4),'x-b', ...   %  0.09 ms
           d(:,1),d(:,3),'x-g', ...   %  0.18 ms
           d(:,1),d(:,2),'x-b')       %  0.27 ms
      legend('0.27 ms','0.18 ms','0.09 ms','0 ms');
      axis([-9 9 -0.36 0.72]);
      set(gca,'XTick',-9:3:9);
      xlabel('interaural level difference (dB)');
      ylabel('interaural time difference (ms)');
      % Then plot model results
      figure; % fig 17 (b)
              % Plot line for every condition
      for jj = 1:nitds_t
        plot(ild_t,output.rcen(jj,:));
        hold on;
      end
      axis([-9 9 -0.36 0.72]);
      set(gca,'XTick',-9:3:9);
      xlabel('interaural level difference (dB)');
      ylabel('interaural time difference (ms)');
      %
      figure; % fig 17 (c)
      for jj = 1:nitds_t
        plot(ild_t,output.rmax(jj,:));
        hold on;
      end
      axis([-9 9 -0.36 0.72]);
      set(gca,'XTick',-9:3:9);
      xlabel('interaural level difference (dB)');
      ylabel('interaural time difference (ms)');
    end;

end;


%% ------ FIG 18 ----------------------------------------------------------
if flags.do_fig18

  
    % Sampling rate
    fs = 44100;
    % Frequency of the sinusoid
    f = 500;
    T = 1/f;
    fc = round(freqtoerb(f));   % corresponding frequency channel

    % Model parameter
    T_int = inf;
    w_f = 0.035;
    M_f = 6; % not used, if w_f==0
    c_s = 0.11;

    % NOTE: the longer the signal, the more time we need for computation. On the
    % other side N_1 needs to be long enough to eliminate any onset effects.
    % Lindemann uses N_1 = 17640. Here I uses only N_1 = 2205 which gives the same
    % results for this demo.
    N_1 = ceil(25*T*fs);

    % Calculate crosscorrelations for 21 ITD points between 0~ms and 1~ms
    niacs = 11; % number of used interaural coherence values
    ndl = 2*round(fs/2000)+1;   % length of the delay line (see bincorr.m)
    iac = linspace(0,1,niacs);
    
    output=amt_cache('get','fig18',flags.cachemode);
    if isempty(output)

      output = zeros(niacs,ndl);
      for ii = 1:niacs; 
        % Generate ITD shifted sinusoid
        sig = sig_bincorrnoise(fs,iac(ii),'pink');
        % Aplly onset window
        sig = rampsignal(sig,[round(N_1/2)-1 0],'tria');
        % Calculate cross-correlation (and squeeze due to T_int==inf)
        tmp = squeeze(lindemann1986(sig,fs,c_s,w_f,M_f,T_int,N_1));
        % Store the needed frequency channel. NOTE: the cross-correlation
        % calculation starts with channel 5, so we have to subtract 4.
        output(ii,:) =  tmp(:,fc-4);
      end
      amt_cache('set','fig18',output);
    end;

    if flags.do_plot
      % ------ Plotting ------
      % Generate time axis
      tau = linspace(-1,1,ndl);
      % Plot figure for every c_s condition
      figure;
      mesh(tau,iac,output);
      view(0,57);
      xlabel('correlation-time tau (ms)');
      ylabel('degree of interaural coherence');
    end;

end;


%% ------ Subfunctions ----------------------------------------------------
function idx = findnearest(list,val)
[dif,idx] = min(abs(list-val));

function idx = findpeaks(cc)
% FINDPEAKS Finds two peaks of the same height in a given cross-correlation
h = zeros(size(cc,1),1);
for ii = 1:size(cc,1)
    % Find a peak in the two halfes of the cross-correlation and subtract them
    h(ii) = max(cc(ii,1:30)) - max(cc(ii,31:end));
end
% Find the index with the smallest distance between the two peaks
[val,idx] = min(abs(h));

function m = findmax(list)
[m,idx] = max(list);
d = linspace(-1,1,length(list));
m = d(idx);