THE AUDITORY MODELING TOOLBOX

Applies to version: 1.4.0

View the help

Go to function

EXP_CHEN2011 - experiments from Chen et al. 2011

Program code:

function varargout=exp_chen2011(varargin)
%EXP_CHEN2011 experiments from Chen et al. 2011
%
%   EXP_CHEN2011(fig) reproduce Fig. no. fig from the Chen et
%   al. 2011 paper.
%
%   The following flags can be specified;
%
%     'fig7'    Reproduce Fig. 7, yields the excitation patterns
%
%     'fig9'    Reproduce Fig. 9, contrasting loudness (sones)
%               with input level (dBSPL)
%
%     'fig10'   Reproduce Fig. 10, comparing the equal loudness contours
%               from chen2011_loudness with the ISO 2006 standard
%
%     'fig11'   Reproduce Fig. 11, displaying loudness as a function of bandwidth
%
%
%   Examples:
%   ---------
%
%   To display Fig. 7 use :
%
%     exp_chen2011('fig7');
%
%   To display Fig. 9 use :
%
%     exp_chen2011('fig9');
%
%   To display Fig. 10 use :
%
%     exp_chen2011('fig10');
%
%   To display Fig. 11 use :
%
%     exp_chen2011('fig11');
%
%   References:
%     Z. Chen, G. Hu, B. R. Glasberg, and C. Moore, Brian. A new model for
%     calculating auditory excitation patterns and loudness for cases of
%     cochlear hearing loss. J. Acoust. Soc. Am., 282(1), 2011.
%     
%
%   Url: http://amtoolbox.org/amt-1.4.0/doc/experiments/exp_chen2011.php


%   #StatusDoc: Good
%   #StatusCode: Perfect
%   #Verification: Verified
%   #Author : Zhangli Chen: original code
%   #Author : Clara Hollomey (2020): integration in the AMT

% This file is licensed unter the GNU General Public License (GPL) either 
% version 3 of the license, or any later version as published by the Free Software 
% Foundation. Details of the GPLv3 can be found in the AMT directory "licences" and 
% at <https://www.gnu.org/licenses/gpl-3.0.html>. 
% You can redistribute this file and/or modify it under the terms of the GPLv3. 
% This file is distributed without any warranty; without even the implied warranty 
% of merchantability or fitness for a particular purpose. 

definput.flags.type = {'missingflag',...
    'fig7','fig9','fig10','fig11'};
  definput.flags.plot = {'plot','no_plot'};
  
    % 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;

if flags.do_fig7 || flags.do_fig9
    
    OuterEarOpt = 'FreeField';

    CF1k = 1000;
    % LdB1k = [2 10:10:90]';
    LdB1k = [2 5 10:5:90]';

%% ANSI S3.4-2007
    phon_ref = [0 1 2 3 4 5 7.5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120];

    sone_ref =  [0.0011 0.0018 0.0028 0.0044 0.0065 0.0077 0.017 0.029 0.07 0.142 0.255 0.422 0.662 0.997 1.461 ...
             2.098 2.970 4.166 5.813 8.102 11.326 15.98 22.929 33.216 48.242 70.362 103.274 152.777 227.855 341.982];

    Ldn1k_Binaural_ANSI = interp1(phon_ref,sone_ref,LdB1k,'linear','extrap');

%% model calculation
    for j = 1:length(LdB1k)
        [Ldn1k_Monaural(j),E1k(:,j),Cam,CF] = chen2011(CF1k,LdB1k(j), OuterEarOpt);
    end

    Ldn1k_Binaural_Model = 2* Ldn1k_Monaural;
    
    
    if flags.do_plot && flags.do_fig9
        figure;
semilogy(LdB1k,Ldn1k_Binaural_ANSI,'k--',LdB1k,Ldn1k_Binaural_Model,'k');
legend('ANSI S3.4-2007','This model');
xlabel('Input level of 1-kHz tone, dB SPL');ylabel('Loundess, sones');
axis([0 100 0.001 1000]);
set(findobj('FontSize',10),'FontSize',12);
set(get(gca,'XLabel'),'FontSize',12);
set(get(gca,'YLabel'),'FontSize',12);
set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);
set(gca,'LineWidth',1');
    elseif flags.do_plot && flags.do_fig7
        figure;
semilogx(CF,10*log10(E1k));
xlabel('CF, Hz');ylabel('Excitation, dB');
axis([20 20000 0 100]);
set(findobj('FontSize',10),'FontSize',12);
set(get(gca,'XLabel'),'FontSize',12);
set(get(gca,'YLabel'),'FontSize',12);
set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);
set(gca,'LineWidth',1');
    end
    

elseif flags.do_fig10
    OuterEarOpt = 'FreeField';

%% 1-kHz as reference
CF1k = 1000;
LdB1k = [2 10:10:90]';
for j = 1:length(LdB1k)
    Ldn1k(j) = chen2011(CF1k,LdB1k(j), OuterEarOpt);
end

%% calculating equal loudness contours
%this is the data from iso226-2003
data = amt_load('chen2011', 'data_chen2011.mat');
freq = data.freq;
spl = data.spl;

f = freq(:,1);
LdB = -10:2:140;

for i = 1:length(f)  
    for j = 1:length(LdB)
        [Ldn(j),Exitation,Cam,CF] = chen2011(f(i),LdB(j), OuterEarOpt);          
    end
    
    LdB_sameLdn(i,:) = interp1(Ldn,LdB,Ldn1k,'linear','extrap');
end

if flags.do_plot
figure;
semilogx(freq(:,1),spl(:,1)-1.6,'k--',freq(:,1),LdB_sameLdn(:,1),'k',...
    freq(:,2:end),spl(:,2:end),'k--',freq(:,2:end),LdB_sameLdn(:,2:end),'k');
legend('ISO 226-2003','This paper');
xlabel('Frequency, Hz');ylabel('LdB, dB SPL');
axis([20 20000 -10 130]);
set(findobj('FontSize',10),'FontSize',12);
set(get(gca,'XLabel'),'FontSize',12);
set(get(gca,'YLabel'),'FontSize',12);
set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);
set(gca,'LineWidth',1');
text(600,44,'40 phons');
end

elseif flags.do_fig11
    %% oringinal data
%%%%%% Fig 14 in Moore et al,1997
NoiseF0 = 1420;
NoiseBw0 = 210;
NoiseLdB01 = 30;
NoiseBw11 = [30 70 150 250 500 1000 3600];
NoiseLdB11 = [30.9 31.7 30.1 30.9 31.7 34.0 34.0];
NoiseLdB02 = 50;
NoiseBw12 = [35 75 150 250 500 1125 3400];
NoiseLdB12 = [51.1 50.3 50.3 50.3 54.2 57.3 61.9];
NoiseLdB03 = 50;
NoiseBw13 = [35 75 150 250 500 1125 3400];
NoiseLdB13 = [79.0 79.8 79.8 79.3 81.4 83.1 86.2];

%% model calculation

OuterEarOpt = 'PDR10';

F0 = 1420;      % Hz

%%%%%%%%%%%%%%%% Step1: loudness of matching noise
FixNoiseBW = 210;          % Hz
MatchNoiseLdB = 20:5:100;

for k = 1:length(MatchNoiseLdB)
    
    FixNoiseSpectrumLevel(k) = MatchNoiseLdB(k) - 10*log10(FixNoiseBW);    % dB SPL/Hz

    fl2 = (-FixNoiseBW+sqrt(FixNoiseBW.^2+4*F0^2))/2;
    fu2 = fl2 + FixNoiseBW-1;
    comp_f = fl2:fu2;
    comp_dB = FixNoiseSpectrumLevel(k) * ones(1,length(comp_f));

    Ldn2(k) = chen2011(comp_f,comp_dB, OuterEarOpt);    
end

%%%%%%%%%%%%%%%% Step2: loudness of variable bandwidth noise
FlexNoiseBW = [25:50:125,150:50:300, 400:100:1000,1250,1500,2000,3000,4000];     % Hz
NoiseLevel = [30 50 80];    % dB SPL

for i = 1:length(NoiseLevel)
    for j = 1:length(FlexNoiseBW)
        FlexNoiseSpectrumLevel(i,j) =  NoiseLevel(i) - 10*log10(FlexNoiseBW(j));    % dB SPL/Hz
        
        fl1 = (-FlexNoiseBW(j)+sqrt(FlexNoiseBW(j).^2+4*F0^2))/2;
        fu1 = fl1 + FlexNoiseBW(j)-1;
        comp_f = fl1:fu1;
        comp_dB = FlexNoiseSpectrumLevel(i,j) * ones(1,length(comp_f));
        
        Ldn1(j) = chen2011(comp_f,comp_dB, OuterEarOpt);
    end
        
    LdB_samLdn(i,:) = interp1(Ldn2,MatchNoiseLdB,Ldn1,'linear','extrap');   
end

if flags.do_plot
figure;
semilogx(FlexNoiseBW,LdB_samLdn','k',NoiseBw11,NoiseLdB11,'ko',...
        NoiseBw12,NoiseLdB12,'ko',NoiseBw13,NoiseLdB13,'ko');
axis([20 5000 20 100]);
xlabel('Variable bandwidth, Hz');ylabel('Level of matching noise, dB SPL');
set(findobj('FontSize',10),'FontSize',12);
set(get(gca,'XLabel'),'FontSize',12,'Vertical','top');
set(get(gca,'YLabel'),'FontSize',12,'Vertical','middle');
set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);
set(gca,'LineWidth',1');
end
end