THE AUDITORY MODELING TOOLBOX

This documentation page applies to an outdated major AMT version. We show it for archival purposes only.
Click here for the documentation menu and here to download the latest AMT (1.6.0).

View the help

Go to function

EXP_LOPEZPOVEDA2001 - Figures from Lopez-Poveda and Meddis (2001)

Program code:

function output=exp_lopezpoveda2001(varargin)
%EXP_LOPEZPOVEDA2001   Figures from Lopez-Poveda and Meddis (2001)
%   Usage: output = exp_lopezpoveda2001(flag)
%
%   EXP_LOPEZPOVEDA2001(flags,... ) reproduces experiments from the Lopez
%   & Poveda (2001) paper.
%
%   The following flags can be specified;
%
%     'plot'    Plot the output of the experiment. This is the default.
%
%     'noplot'  Don't plot, only return data.
%
%     'fig2'    Reproduce Fig. 2 from Lopez & Poveda (2001)
%
%               Fig. 2a represents the outer ear filter - pressure gain (dB) over
%               frequency with data points from Pralong and Carlile (1996).
%
%               Fig. 2b represents the middle ear filter - stapes velocity at
%               0dB over frequency in one plot Fig. 2b shows for default 
%               fs = 22050 Hz: 
%               
%                Data points directly derived from Goode et al. 1994 
%
%                FIR filter with data points from Goode et al. 1994
%
%                Data points of figure 2b from Lopez-Poveda and Meddis
%                 2001 (read from fig 2b, actually also derived from Goode et
%                 al. 1994) The output are the data points of the respective
%                 figure.
%
%               The dimensions of the output are: frequency values x data
%               points  x figure no.
%
%     'fig2a'   Reproduce just Fig. 2a.
%
%     'fig2b'   Reproduce just Fig. 2b.
%
%     'fig3bc'  Reproduce Fig. 3b and c from Lopez & Poveda
%               (2001). Isointensity response of the linear, nonlinear and
%               summed response of the lopezpoveda2001 filter for an input level of
%               30dB (fig 3b) and 85dB (fig 3c) SPL The output is the output
%               of the lopezpoveda2001 filter for the different input levels. The
%               dimensions of the output are: input frequency x [frequency
%               values, linear output, nonlinear output, summed lopezpoveda2001 output]
%               x input level.
%
%     'fig3b'   Reproduce just Fig. 3b.
%
%     'fig3c'   Reproduce just fig. 3c.
%
%     'fig4'    Reproduce Fig. 4 from Lopez & Poveda (2001) - pulsation threshold 
%               data (just the model results, not the experimental data)
%               The output is the model result for the different parameter sets.
%               The dimensions of the output are: signal level x masker level x signal frequency
%               masker level consists of 4 columns:
%
%               1) Signal level in dB SPL (x axis in the plots)
%               
%               2) Results for parameter set of YO, table I
%
%               3) Results for average parameter set, table II
% 
%               4) Results for regression lines, table III
%
%   See also: lopezpoveda2001, data_lopezpoveda2001, data_pralong1996, data_goode1994
%
%   Examples:
%   ---------
%
%   To display Figure 2 use :
%
%     exp_lopezpoveda2001('fig2');
%
%   To display Figure 3b and 3c use :
%
%     exp_lopezpoveda2001('fig3bc');
%
%   To display Figure 4 use :
%
%     exp_lopezpoveda2001('fig4');
%
%   References:
%     R. Goode, M. Killion, K. Nakamura, and S. Nishihara. New knowledge
%     about the function of the human middle ear: development of an improved
%     analog model. The American journal of otology, 15(2):145--154, 1994.
%     
%     E. Lopez-Poveda and R. Meddis. A human nonlinear cochlear filterbank.
%     J. Acoust. Soc. Am., 110:3107--3118, 2001.
%     
%     D. Pralong and S. Carlile. The role of individualized headphone
%     calibration for the generation of high fidelity virtual auditory space.
%     J. Acoust. Soc. Am., 100:3785--3793, 1996.
%     
%
%   Url: http://amtoolbox.sourceforge.net/amt-0.10.0/doc/experiments/exp_lopezpoveda2001.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: Katharina Egger

%% ------ Check input options --------------------------------------------

  definput.flags.type = {'missingflag','fig2','fig2a','fig2b','fig3bc','fig3b','fig3c','fig4'};
  definput.flags.plot = {'plot','noplot'};
  definput.keyvals.predrnl = {};
  definput.keyvals.postdrnl = {};

  % Parse input options
  [flags,kv]  = 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;

%% parameter set of YO, table I
% The data is specified in this way, because the data for figure 4 is
% not specified as the two parameter fit, but instead specified
% directly. The parameters below accomplish this by removing all
% frequency dependence in the lopezpoveda2001. The parameters can then be
% specified exactly for a single frequency, but only for one frequency
% at a time.

f250 = {...
  'flow',250,...
  'fhigh',250,...
  'lin_fc', [log10(235) 0],...
  'lin_bw', [log10(115) 0],...
  'lin_gain', [log10(1400) 0],...
  'lin_lp_cutoff', [log10(235) 0],...      
  'nlin_fc_before', [log10(250) 0],...
  'nlin_bw_before', [log10(84) 0],...
  'nlin_lp_cutoff', [log10(250) 0],...      
  'nlin_a', [log10(2124) 0],...
  'nlin_b', [log10(0.45) 0] };

f500 = {...
  'flow',500,...
  'fhigh',500,...
  'lin_fc', [log10(460) 0],...
  'lin_bw', [log10(150) 0],...
  'lin_gain', [log10(800) 0],...
  'lin_lp_cutoff', [log10(460) 0],...      
  'nlin_fc_before', [log10(500) 0],...
  'nlin_bw_before', [log10(103) 0],...
  'nlin_lp_cutoff', [log10(500) 0],...      
  'nlin_a', [log10(4609) 0],...
  'nlin_b', [log10(0.28) 0] };

f1000 = {...
  'flow',1000,...
  'fhigh',1000,...
  'lin_fc', [log10(945) 0],...
  'lin_bw', [log10(240) 0],...
  'lin_gain', [log10(520) 0],...
  'lin_lp_cutoff', [log10(945) 0],...      
  'nlin_fc_before', [log10(1000) 0],...
  'nlin_bw_before', [log10(175) 0],...
  'nlin_lp_cutoff', [log10(1000) 0],...      
  'nlin_a', [log10(4598) 0],...
  'nlin_b', [log10(0.130) 0]};

f2000 = {...
  'flow',2000,...
  'fhigh',2000,...
  'lin_fc', [log10(1895) 0],...
  'lin_bw', [log10(390) 0],...
  'lin_gain', [log10(400) 0],...
  'lin_lp_cutoff', [log10(1895) 0],...      
  'nlin_fc_before', [log10(2000) 0],...
  'nlin_bw_before', [log10(300) 0],...
  'nlin_lp_cutoff', [log10(2000) 0],...      
  'nlin_a', [log10(9244) 0],...
  'nlin_b', [log10(0.078) 0]};

f4000 = {...
  'flow',4000,...
  'fhigh',4000,...
  'lin_fc', [log10(3900) 0],...
  'lin_bw', [log10(620) 0],...
  'lin_gain', [log10(270) 0],...
  'lin_lp_cutoff', [log10(3900) 0],...      
  'nlin_fc_before', [log10(4000) 0],...
  'nlin_bw_before', [log10(560) 0],...
  'nlin_lp_cutoff', [log10(4000) 0],...      
  'nlin_a', [log10(30274) 0],...
  'nlin_b', [log10(0.06) 0]};

f8000 = {...
  'flow',8000,...
  'fhigh',8000,...
  'lin_fc', [log10(7450) 0],...
  'lin_bw', [log10(1550) 0],...
  'lin_gain', [log10(250) 0],...
  'lin_lp_cutoff', [log10(7450) 0],...      
  'nlin_fc_before', [log10(8000) 0],...
  'nlin_bw_before', [log10(1100) 0],...
  'nlin_lp_cutoff', [log10(8000) 0],...      
  'nlin_a', [log10(76354) 0],...
  'nlin_b', [log10(0.035) 0]};

expparsYO = [f250; f500; f1000; f2000; f4000; f8000];

%% average parameter set, table II
f250avg = {...
  'flow',250,...
  'fhigh',250,...
  'lin_fc', [log10(244) 0],...
  'lin_bw', [log10(100) 0],...
  'lin_gain', [log10(1150) 0],...
  'lin_lp_cutoff', [log10(244) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(250) 0],...
  'nlin_bw_before', [log10(84) 0],...
  'nlin_lp_cutoff', [log10(250) 0],...      
  'nlin_a', [log10(2194) 0],...
  'nlin_b', [log10(0.45) 0]};

f500avg = {...
  'flow',500,...
  'fhigh',500,...
  'lin_fc', [log10(480) 0],...
  'lin_bw', [log10(130) 0],...
  'lin_gain', [log10(850) 0],...
  'lin_lp_cutoff', [log10(480) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(500) 0],...
  'nlin_bw_before', [log10(103) 0],...
  'nlin_lp_cutoff', [log10(500) 0],...      
  'nlin_a', [log10(5184) 0],...
  'nlin_b', [log10(0.28) 0]};

f1000avg = {...
  'flow',1000,...
  'fhigh',1000,...
  'lin_fc', [log10(965) 0],...
  'lin_bw', [log10(240) 0],...
  'lin_gain', [log10(520) 0],...
  'lin_lp_cutoff', [log10(965) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(1000) 0],...
  'nlin_bw_before', [log10(175) 0],...
  'nlin_lp_cutoff', [log10(1000) 0],...      
  'nlin_a', [log10(7558) 0],...
  'nlin_b', [log10(0.130) 0]};

f2000avg = {...
  'flow',2000,...
  'fhigh',2000,...
  'lin_fc', [log10(1925) 0],...
  'lin_bw', [log10(400) 0],...
  'lin_gain', [log10(410) 0],...
  'lin_lp_cutoff', [log10(1925) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(2000) 0],...
  'nlin_bw_before', [log10(300) 0],...
  'nlin_lp_cutoff', [log10(2000) 0],...      
  'nlin_a', [log10(9627) 0],...
  'nlin_b', [log10(0.078) 0]};

f4000avg = {...
  'flow',4000,...
  'fhigh',4000,...
  'lin_fc', [log10(3900) 0],...
  'lin_bw', [log10(660) 0],...
  'lin_gain', [log10(320) 0],...
  'lin_lp_cutoff', [log10(3900) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(4000) 0],...
  'nlin_bw_before', [log10(560) 0],...
  'nlin_lp_cutoff', [log10(4000) 0],...      
  'nlin_a', [log10(22288) 0],...
  'nlin_b', [log10(0.045) 0]};

f8000avg = {...
  'flow',8000,...
  'fhigh',8000,...
  'lin_fc', [log10(7750) 0],...
  'lin_bw', [log10(1450) 0],...
  'lin_gain', [log10(220) 0],...
  'lin_lp_cutoff', [log10(7750) 0],...      
  'lin_ngt', 3,...
  'nlin_fc_before', [log10(8000) 0],...
  'nlin_bw_before', [log10(1100) 0],...
  'nlin_lp_cutoff', [log10(8000) 0],...      
  'nlin_a', [log10(43584) 0],...
  'nlin_b', [log10(0.030) 0]};

expparsavg = [f250avg; f500avg; f1000avg; f2000avg; f4000avg; f8000avg];

%% Lopez-Poveda and Meddis 2001, Figure 2

  %% Lopez-Poveda and Meddis 2001, Figure 2, a)

  if flags.do_fig2a || flags.do_fig2
    fs=22050;
    hpdata=data_pralong1996;
    bout=headphonefilter(fs);

    % Manually calculate the frequency response.
    fout = 20*log10(abs(fftreal(bout)));

    % Half the filter length.
    n2=length(fout);
    output(:,:,1) = hpdata;
  end


  %% Lopez-Poveda and Meddis 2001, Figure 2, b)

  if flags.do_fig2b || flags.do_fig2
    fs = 22050;
    
    % data points directly derived from Goode et al. 1994
    gde = middleearfilter;           

    % control data points directly read from Lopez-Poveda and Meddis 2001
    stapes_data = data_lopezpoveda2001('fig2b', 'noplot', 'lopezpoveda');    
    
    % Calculate the filters.
    bmid = middleearfilter(fs);      % Goode et al. 1994
    
    % Manually calculate the frequency response for an input of 0dB SPL
    fmid = abs(fftreal(bmid*20e-6));
    % Half the filter length.
    n2=length(fmid);
    % x-values for plotting.
    xplot=linspace(0,fs/2,n2);
    outB = gde;
    if exist('output','var')
      output(end+1:end+(length(outB)-length(output)),:,1) = 0;
      output(:,:,2) = outB;
    else
      output(:,:,1) = outB;
    end

  end
    
%% plots    
if flags.do_plot
    if flags.do_fig2       
        figure
        set(gcf,'Position',[50,50,500,760])
        subplot(2,1,1)
        hold on;
        % Plot the measured data
        x=hpdata(:,1);
        freqresp=20*log10(hpdata(:,2));
        plot(x,freqresp,'ro','MarkerFaceColor', 'r');
    
        % Plot the filter
        x_filter=linspace(0,fs/2,n2);
        plot(x_filter,fout);
        axis([100 10000 -30 20])
        set(gca,'XScale','log','YTick',[-30,-20,-10,0,10,20])
        set(gca,'Position',[0.15,0.55,0.8,0.4]);
        leg1=legend('Pralong and Carlile (1996) + extrapolated points', ...
            'FIR filter');
        xlabel('Frequency (Hz)')
        ylabel('Pressure gain (dB)')
        title('Lopez-Poveda and Meddis 2001, Figure 2')
        set(leg1,'Position',[0.1887, 0.5991, 0.666, 0.0553]);

        subplot(2,1,2)
        p = loglog (stapes_data(:,1),stapes_data(:,2),':ok', 'MarkerFaceColor', 'k');
        hold on
        g = loglog (gde(:,1),gde(:,2),':or', 'MarkerFaceColor', 'r');
        firG = loglog(xplot,fmid,'r');
        axis([100 10000 1E-10 1E-07])
        set(gca,'Position',[0.15,0.07,0.8,0.4]);
        xlabel('Frequency (Hz)')
        ylabel('Stapes velocity (m/s) at 0dB SPL')
        leg2=legend([g,firG,p],'directly derived from Goode et al. 1994', ...
                    'FIR filter with data points from Goode et al. 1994', ...
                    'Control points as in Lopez-Poveda and Meddis 2001');        
        set(leg2,'Position',[0.1637, 0.085, 0.716, 0.07]);
    
    elseif flags.do_fig2a
        hold on;
        % Plot the measured data
        x=hpdata(:,1);
        freqresp=20*log10(hpdata(:,2));
        plot(x,freqresp,'ro','MarkerFaceColor', 'r');
    
        % Plot the filter
        x_filter=linspace(0,fs/2,n2);
        plot(x_filter,fout);
        axis([100 10000 -30 20])
        set(gca,'XScale','log','YTick',[-30,-20,-10,0,10,20])
        legend('Pralong and Carlile (1996) + extrapolated points', ...
            'FIR filter');
        title('Lopez-Poveda and Meddis 2001, Figure 2a) - Pressure gain (dB) as a function of frequency')
        xlabel('Frequency (Hz)')
        ylabel('Pressure gain (dB)')
        hold off
        
    elseif flags.do_fig2b
        p = loglog (stapes_data(:,1),stapes_data(:,2),':ok', 'MarkerFaceColor', 'k');
        hold on
        g = loglog (gde(:,1),gde(:,2),':or', 'MarkerFaceColor', 'r');
        firG = loglog(xplot,fmid,'r');
        axis([100 10000 1E-10 1E-07])
        title('Lopez-Poveda and Meddis 2001, Figure 2b) - Stapes velocity as a function of frequency')
        xlabel('Frequency (Hz)')
        ylabel('Stapes velocity (m/s) at 0dB SPL')
        legend([g,firG,p],'directly derived from Goode et al. 1994', 'FIR filter with data points from Goode et al. 1994', ...
        'Control points as in Lopez-Poveda and Meddis 2001')
        hold off
    end
end


%% Lopez-Poveda and Meddis 2001, Figure 3

if flags.do_fig3b || flags.do_fig3bc
     
  %% Lopez-Poveda and Meddis 2001, Figure 3, b)
  % input signal: 50ms pure tones, sampled at 100kHz
  fs = 100000;
  T = 0.05;       
  t = (0:1/fs:T - 1/fs)';
  fsig = 250:25:1750;    
  
  result3b = zeros(1,length(fsig));
  lin3b = zeros(1,length(fsig));
  nlin3b = zeros(1,length(fsig));

  level = 20e-6 * 10^(30/20);
  
  for ii = 1:length(fsig)
    
    insig = sin(2*pi*fsig(ii).*t)*(2^0.5) * level;  
    
    hp_fir = headphonefilter(fs);
    insig = filter(hp_fir,1,insig);
    
    [y_lin, ~] = lopezpoveda2001(insig, fs, kv.predrnl{:}, f1000{:},'linonly', kv.postdrnl{:});    
    [y_nlin, ~] = lopezpoveda2001(insig, fs, kv.predrnl{:},f1000{:},'nlinonly', kv.postdrnl{:});
    
    outsig = y_lin + y_nlin;
    
    result3b(1,ii) = rms(outsig(floor(length(insig)/2):end));
    lin3b(1,ii) = rms(y_lin(floor(length(insig)/2):end));
    nlin3b(1,ii) = rms(y_nlin(floor(length(insig)/2):end));
  end
  
  output(:,:,1) = [fsig', lin3b', nlin3b', result3b'];
end;

if flags.do_fig3c || flags.do_fig3bc
  %% Lopez-Poveda and Meddis 2001, Figure 3, c)
  % input signal: 50ms pure tones, sampled at 100kHz
  fs = 100000;
  T = 0.05;       
  t = (0:1/fs:T - 1/fs)';
  fsig = 250:25:1750;   
  
  result3c = zeros(1,length(fsig));
  lin3c = zeros(1,length(fsig));
  nlin3c = zeros(1,length(fsig));
  
  level = 20e-6 * 10^(85/20);
  
  for ii = 1:length(fsig)
    
    insig = sin(2*pi*fsig(ii).*t)*(2^0.5)* level;
    hp_fir = headphonefilter(fs);
    insig = filter(hp_fir,1,insig);
    
    [y_lin, ~] = lopezpoveda2001(insig, fs, kv.predrnl{:}, f1000{:},'linonly', kv.postdrnl{:});    
    [y_nlin, ~] = lopezpoveda2001(insig, fs, kv.predrnl{:}, f1000{:},'nlinonly', kv.postdrnl{:});

    outsig = y_lin + y_nlin;
        
    result3c(1,ii) = rms(outsig(floor(length(insig)/2):end));
    lin3c(1,ii) = rms(y_lin(floor(length(insig)/2):end));
    nlin3c(1,ii) = rms(y_nlin(floor(length(insig)/2):end));
    
  end
  
  outB = [fsig', lin3c', nlin3c', result3c'];
  if exist('output','var')
      output(:,:,2) = outB;
  else
      output(:,:,1) = outB;
  end
end;

%% plots    
if flags.do_plot
    if flags.do_fig3bc       
        figure
        set(gcf,'Position',[50,50,400,760])
        subplot(2,1,1)
        plot(fsig,result3b)
        hold on
        plot(fsig,lin3b,'-.g')
        plot(fsig,nlin3b,':r')
        set(gca,'YScale','log')
        % grid on
        set(gca,'XLim',[250 1750],'Layer','top')
        set(gca,'YLim',[1e-07 1e-03],'Layer','top')
        set(gca,'Position',[0.285,0.5838,0.62,0.3412]);
        title('30 dB SPL')
        xlabel('Frequency (Hz)')
        ylabel('lopezpoveda2001 filter output (m/s)')

        subplot(2,1,2)
        plot(fsig,result3c)
        hold on
        plot(fsig,lin3c,'-.g')
        plot(fsig,nlin3c,':r')
        set(gca,'YScale','log')
        % grid on
        set(gca,'XLim',[250 1750],'Layer','top')
        set(gca,'YLim',[1e-05 1e-01],'Layer','top')
        set(gca,'Position',[0.285,0.11,0.62,0.3412]);
        title('85 dB SPL')
        xlabel('Frequency (Hz)')
        ylabel('lopezpoveda2001 filter output (m/s)')
        leg=legend('lopezpoveda2001 output', 'Linear path output', 'Nonlinear path output');
        set(leg,'Position',[0.0133, 0.4759, 0.4525, 0.0798]);
        
    elseif flags.do_fig3b
        plot(fsig,result3b)
        hold on
        plot(fsig,lin3b,'-.g')
        plot(fsig,nlin3b,':r')
        set(gca,'YScale','log')
        set(gca,'XLim',[250 1750],'Layer','top')
        set(gca,'YLim',[1e-07 1e-03],'Layer','top')
        title('30 dB SPL')
        xlabel('Frequency (Hz)')
        ylabel('lopezpoveda2001 filter output (m/s)')
        leg=legend('lopezpoveda2001 output', 'Linear path output', 'Nonlinear path output');
        set(gcf,'Position',[150,150,400,400])
        set(leg,'Position',[0.2333, 0.1467, 0.4525, 0.1517]);
        hold off
        
    elseif flags.do_fig3c
        plot(fsig,result3c)
        hold on
        plot(fsig,lin3c,'-.g')
        plot(fsig,nlin3c,':r')
        set(gca,'YScale','log')
        set(gca,'XLim',[250 1750],'Layer','top')
        set(gca,'YLim',[1e-05 1e-01],'Layer','top')
        title('85 dB SPL')
        xlabel('Frequency (Hz)')
        ylabel('lopezpoveda2001 filter output (m/s)')
        leg=legend('lopezpoveda2001 output', 'Linear path output', 'Nonlinear path output');
        set(gcf,'Position',[150,150,400,400])
        set(leg,'Position',[0.2333, 0.1467, 0.4525, 0.1517]);
        hold off
    end
end

%% Lopez-Poveda and Meddis 2001, Figure 4
if flags.do_fig4

  %% input signal
  fs=64000;
  fsig = [250 500 1000 2000 4000 8000];
  T = 0.084;       
  t = (0:1/fs:T - 1/fs)';
  %basef = fsig;
  hp_fir = headphonefilter(fs);
  Tramp = 0.002;          % duration of ramps up and down
  ramp = (0:1/fs:Tramp - 1/fs)';
  sig=zeros(length(t),length(fsig));
  mask=zeros(length(t),length(fsig));
  
  %% experiment
  LSDB = 30:0.5:85;           % Signal level
  n=1;
  for jj = 30:0.5:85
    levelS(n) = 20e-6 * 10^(jj/20);
    n = n+1;
  end
  
  LMDB = 30:0.5:100;          % Masker level
  n=1;
  for jj = 30:0.5:100
    levelM(n) = 20e-6 * 10^(jj/20);
    n = n+1;
  end
  
  
  OMavg = zeros(length(levelM),length(fsig));
  OM = zeros(length(levelM),length(fsig));
  OSavg = zeros(length(levelS),length(fsig));
  OS = zeros(length(levelS),length(fsig));
  ratio = zeros(length(levelM),length(levelS),length(fsig));
  ratioavg = zeros(length(levelM),length(levelS),length(fsig));
  indx = zeros(length(levelS),length(fsig));
  indxavg = zeros(length(levelS),length(fsig));
  
  output = zeros(length(LSDB),4,length(fsig));

  for ii = 1:length(fsig)
    
    % first calculate the model's response to the masker for every
    % possible masker level
    for kk = 1:length(levelM)
      % rampsignal sine window equivalent to cosine ramps are used
      mask(:,ii) = rampsignal(sin(2*pi*fsig(ii)*0.6.*t),length(ramp),'sine').*(2^0.5);
      insig = mask(:,ii) * levelM(kk);
      outsig = filter(hp_fir,1,insig);

      % average parameter set, table II
      outsigavg = lopezpoveda2001(outsig, fs, kv.predrnl{:}, expparsavg{ii,:}, kv.postdrnl{:});         

      OMavg(kk,ii) = max(outsigavg(floor(length(insig)/2):end));    
      
      % parameter set of YO, table I
      outsig = lopezpoveda2001(outsig, fs, kv.predrnl{:}, expparsYO{ii,:}, kv.postdrnl{:});             
      OM(kk,ii) = max(outsig(floor(length(insig)/2):end));            
    end
    
    % then calculate model's response to the signal and find for every
    % signal level the masker level such that the ratio signal/masker
    % is equal to a value of one
    for mm = 1:length(levelS)
      sig(:,ii) = rampsignal(sin(2*pi*fsig(ii).*t),length(ramp),'sine').*(2^0.5);
      insig = sig(:,ii) * levelS(mm);
      outsig = filter(hp_fir,1,insig);

      % average parameter set, table II
      outsigavg = lopezpoveda2001(outsig, fs, kv.predrnl{:}, expparsavg{ii,:}, kv.postdrnl{:});         

      OSavg(mm,ii) = max(outsigavg(floor(length(insig)/2):end)); 

      % parameter set of YO, table I
      outsig = lopezpoveda2001(outsig, fs, kv.predrnl{:}, expparsYO{ii,:}, kv.postdrnl{:});

      OS(mm,ii) = max(outsig(floor(length(insig)/2):end)); 
      
      % ratio for parameter set of YO, table I
      ratio(:,mm,ii) = OS(mm,ii) ./ OM(:,ii);                 

      [~, indx(mm,ii)] = min(abs(1-ratio(:,mm,ii)),[],1);     

      % ratio for average parameter set, table II           
      ratioavg(:,mm,ii) = OSavg(mm,ii) ./ OMavg(:,ii);        
      [~, indxavg(mm,ii)] = min(abs(1-ratioavg(:,mm,ii)),[],1);          
    end
  
  output(:,1,ii) = LSDB;
  output(:,2,ii) = LMDB(indx(:,ii));
  output(:,3,ii) = LMDB(indxavg(:,ii));   
  end
  
  % same procedure for lopezpoveda2001 parameters calculated with regression lines, table III
  OMrl = zeros(length(levelM),length(fsig));
  OSrl = zeros(length(levelS),length(fsig));
  ratiorl = zeros(length(levelM),length(levelS),length(fsig));
  indxrl = zeros(length(levelS),length(fsig));
  
  for ii = 1:length(fsig)
    for kk = 1:length(levelM)
      insig = mask(:,ii) * levelM(kk);
      outsig = filter(hp_fir,1,insig);
      outsigrl = lopezpoveda2001(outsig, fs, kv.predrnl{:}, 'flow', fsig(ii), 'fhigh', fsig(ii), 'lin_ngt', 3, kv.postdrnl{:});
      OMrl(kk,ii) = max(outsigrl(floor(length(insig)/2):end));                       
    end
    
    for mm = 1:length(levelS)
      insig = sig(:,ii) * levelS(mm);
      outsig = filter(hp_fir,1,insig);
      outsigrl = lopezpoveda2001(outsig, fs, kv.predrnl{:}, 'flow', fsig(ii), 'fhigh', fsig(ii), 'lin_ngt', 3, kv.postdrnl{:});
      OSrl(mm,ii) = max(outsigrl(floor(length(insig)/2):end)); 
      
      ratiorl(:,mm,ii) = OSrl(mm,ii) ./ OMrl(:,ii);           
      [~, indxrl(mm,ii)] = min(abs(1-ratiorl(:,mm,ii)),[],1);                  
    end
    
  output(:,4,ii) = LMDB(indxrl(:,ii));
    
  end
  
  
  %% plots    
  if flags.do_plot
    subplot(2,3,1)
    plot(LSDB,LMDB(indx(:,1)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,1)),'-')
    plot(LSDB,LMDB(indxrl(:,1)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('250 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
    
    subplot(2,3,2)
    plot(LSDB,LMDB(indx(:,2)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,2)),'-')
    plot(LSDB,LMDB(indxrl(:,2)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('500 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
    
    subplot(2,3,3)
    plot(LSDB,LMDB(indx(:,3)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,3)),'-')
    plot(LSDB,LMDB(indxrl(:,3)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('1000 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
    
    subplot(2,3,4)
    plot(LSDB,LMDB(indx(:,4)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,4)),'-')
    plot(LSDB,LMDB(indxrl(:,4)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('2000 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
    
    subplot(2,3,5)
    plot(LSDB,LMDB(indx(:,5)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,5)),'-')
    plot(LSDB,LMDB(indxrl(:,5)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('4000 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
   
    subplot(2,3,6)
    plot(LSDB,LMDB(indx(:,6)),'-', 'LineWidth', 2)
    hold on
    plot(LSDB,LMDB(indxavg(:,6)),'-')
    plot(LSDB,LMDB(indxrl(:,6)),'--')
    plot(LSDB,LSDB,':')
    grid on
    set(gca,'XLim',[20 90],'Layer','top','YTick',[55,65,75,85,95])
    axis([20,90,55,100]);
    title('8000 Hz')
    xlabel('Signal level (dB SPL)')
    ylabel('Masker level (dB SPL)')
    legend('parameter set of YO, table I','average parameter set, table II','regression lines, table III','linear behavior') 
  end      
  
end;