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).
function exp_ziegelwanger2014(varargin)
%EXP_ZIEGELWANGER2014 Figures from Ziegelwanger and Majdak (2014)
% Usage: data = exp_ziegelwanger2014(flag)
%
% `exp_ziegelwanger2014(flags)` reproduces figures of the paper from
% Ziegelwanger and Majdak (2014).
%
% The following flags can be specified:
%
% 'reload' Reload previously calculated results. This is the default.
%
% 'recalc' Recalculate results.
%
% 'fig2' Reproduce Fig. 2:
%
% TOAs resulting from TOA estimators in the horizontal plane
% applied on calculated HRTFs of the objects Sphere, SAT,
% STP, as well on measured HRTFs of an exemplary listener
% (NH89, ARI).
%
% 'fig4' Reproduce Fig. 4:
%
% Estimated on-axis model parameters from HRTFs calculated
% for the centered object Sphere. Condition: combination of
% actual parameters used in HRTF simulation. Circle and
% cross: Parameters estimated for the left and right ears,
% respectively. Gray lines: Actual parameters.
%
% 'fig5' Reproduce Fig. 5:
%
% Estimated on-axis model parameters from left-ear (top row)
% and right-ear (bottom row) HRTFs of human listeners. Lines:
% normal distribution fitted to the data. phi_e: Positive and
% negative values corresponding to the left and right ears,
% respectively.
%
% 'fig6' Reproduce Fig. 6:
%
% Relative TOAs (top row) and on-axis model fit residuals
% (bottom row) from HRTFs of STP (left column) and of an
% exemplary listener (NH89, ARI; right column). Black points:
% data classified as outliers by the ESD test with an upper
% bound of outlier rate of 1% (see ziegelwanger2014). The
% reference for the relative TOAs is the smallest TOA in each
% HRTF set. Horizontal lines: $\pm1$ sampling interval.
%
% 'fig7' Reproduce Fig. 7:
%
% Estimated on-axis model IRDs from acoustically measured
% HRTFs of listeners. Line: normal distribution fitted to the
% data.
%
% 'fig8' Reproduce Fig. 8:
%
% Relative TOAs of an exemplary listener (NH89, ARI) in the
% interaural horizontal plane for the left (black) and right
% (gray) ears as results from the MCM estimator (symbols) and
% the on-axis model (lines). The reference for the relative
% TOAs is the smallest TOA in HRTF sets of both ears.
%
% 'fig9' Reproduce Fig. 9:
%
% Estimated on-axis model parameters from HRTFs calculated
% for the non-centered object Sphere. Other details as in
% Fig. 4.
%
% 'fig11' Reproduce Fig. 11:
%
% Estimated on-axis model parameters from HRTFs calculated
% for the non-centered object Sphere. Other details as in
% Fig. 4. phi_e: Positive and negative values correspond to
% the left and right ears, respectively.
%
% 'tab1' Reproduce Tab. 1:
%
% ANRs and parameter errors (average $\pm1$ standard deviation)
% resulting from fitting the on-axis model to TOAs estimated
% from HRTFs of the Sphere. Parameter errors: Differences
% between the estimated and actual parameters.
%
% 'tab2' Reproduce Tab. 2:
%
% Parameters and ANRs resulting from fitting the on-axis
% model to TOAs estimated from HRTFs of the objects Sphere,
% SAT, STP. Actual parameters: r=87,5 mm, phi_e=90deg, and
% theta_e=0deg.
%
% 'tab3' Reproduce Tab. 3:
%
% Parameters (average $\pm1$ standard deviation) and ANRs
% (median) resulting from fitting the on-axis model to TOAs
% estimated from acoustically measured HRTFs of human
% listeners. L: Left ear. R: Right ear. All: Results for all
% listeners. NH89: Results for a single listener (NH89, ARI).
%
% 'tab5' Reproduce Tab. 5:
%
% Parameters and ANRs (average $\pm1$ standard deviation)
% resulting from fitting the off-axis model to TOAs estimated
% from HRTFs of SAT, STP, and all listeners (All). Full: Fits
% to full TOA sets. O-A: Fits to the outlier-adjusted TOA
% sets. L: Left ear. R: Right ear.
%
% 'tab6' Reproduce Tab. 6:
%
% ANRs and parameter errors (average $\pm1$ standard deviation)
% resulting from fitting the off-axis model to TOAs estimated
% from HRTFs of the object Sphere. Centered: Conditions in
% which r and vec(e) varied from M=0. Non-centered:
% Conditions in which M varied. Other defails as in Tab. 5.
%
% Examples:
% ---------
%
% To display Fig. 2, use :::
%
% exp_ziegelwanger2014('fig2');
%
% To display Fig. 4, use :::
%
% exp_ziegelwanger2014('fig4');
%
% To display Fig. 5, use :::
%
% exp_ziegelwanger2014('fig5');
%
% To display Fig. 6, use :::
%
% exp_ziegelwanger2014('fig6');
%
% To display Fig. 7, use :::
%
% exp_ziegelwanger2014('fig7');
%
% To display Fig. 8, use :::
%
% exp_ziegelwanger2014('fig8');
%
% To display Fig. 9, use :::
%
% exp_ziegelwanger2014('fig9');
%
% To display Fig. 11, use :::
%
% exp_ziegelwanger2014('fig11');
%
% To display Tab. 1, use :::
%
% exp_ziegelwanger2014('tab1');
%
% To display Tab. 2, use :::
%
% exp_ziegelwanger2014('tab2');
%
% To display Tab. 3, use :::
%
% exp_ziegelwanger2014('tab3');
%
% To display Tab. 5, use :::
%
% exp_ziegelwanger2014('tab5');
%
% To display Tab. 6, use :::
%
% exp_ziegelwanger2014('tab6');
%
% See also: ziegelwanger2014, ziegelwanger2014onaxis,
% ziegelwanger2014offaxis, data_ziegelwanger2014
%
% References: ziegelwanger2014
% AUTHOR: Harald Ziegelwanger, Acoustics Research Institute, Vienna,
% Austria
%% ------ Check input options --------------------------------------------
definput.flags.type = {'missingflag',...
'fig2','fig4','fig5','fig6','fig7','fig8',...
'fig9','fig11','tab1','tab2','tab3','tab5',...
'tab6'};
definput.flags.results = {'reload','recalc'};
% Parse input options
[flags,~] = 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;
%% Figure 2
if flags.do_fig2
%load data
Obj{1}=data_ziegelwanger2014('Sphere');
Obj{2}=data_ziegelwanger2014('SAT');
Obj{3}=data_ziegelwanger2014('STP');
Obj{4}=data_ziegelwanger2014('NH89');
%plot figure
figure('Position',[ 520 221 732 577]);
methodLabel=['MAX';'CTD';'AGD';'MCM'];
sty=[': ';'-.';'- ';'--'];
clr=[0 0 0;...
0 0 0;...
0 0 0;...
0 0 0];
lw=[3 1 1 1];
for method=1:4
subplot(2,2,method)
for hrtf=1:4
if hrtf==4
Obj{4}.Data.toaEst{method}=Obj{4}.Data.toaEst{method}+110;
end
h=plotziegelwanger2014(Obj{hrtf},Obj{hrtf}.Data.toaEst{method},4,'k',0,1,1,sty(hrtf,:),lw(hrtf));
set(h,'color',clr(method,:));
hold on
end
ylabel('TOA (ms)','Fontname','Arial','Fontsize',14);
xlabel('');
grid off
ylim([2.9,4.3])
xlim([-10,370])
set(gca,'Fontname','Arial','Fontsize',10)
title('')
switch(method)
case 1
xlabel('')
case 2
ylabel('')
xlabel('')
case 3
l=legend('Sphere','SAT','STP','NH89','Location','NorthWest');
set(l,'Fontsize',9,'Fontname','Arial')
case 4
ylabel('')
end
switch(method)
case 1
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.08 0.05 -0.08]);
set(gca,'xticklabel',[]);
case 2
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.05 0.08 0.05 -0.08]);
set(gca,'yticklabel',[]);
set(gca,'xticklabel',[]);
case 3
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.285 0.05 -0.08]);
set(gca,'xticklabel',{'0' '90' '180' '270' '360 '});
case 4
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.05 0.285 0.05 -0.08]);
set(gca,'yticklabel',[]);
set(gca,'xticklabel',{'0' '90' '180' '270' '360 '});
end
text(300,4.1,methodLabel(method,:),'Fontname','Arial','Fontsize',14)
end
end
%% Figure 4
if flags.do_fig4
%load data
data=data_ziegelwanger2014('SPHERE_ROT');
for ii=1:length(data.results)
p_onaxis{1}(:,:,ii)=data.results(ii).MAX{1}.p_onaxis;
p_onaxis{2}(:,:,ii)=data.results(ii).CTD{1}.p_onaxis;
p_onaxis{3}(:,:,ii)=data.results(ii).AGD{1}.p_onaxis;
p_onaxis{4}(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
end
%plot figure
figure
tmp=get(gcf,'Position');
set(gcf,'Position',tmp.*[1 1 1 2]);
sym='ox';%plot symbols
ms=8;%markersize
lw1=2;%linewidth1
lw2=2;%linewidth2
fs=18;%fontsize
ls='k-';%linestyle
lc=[0.5 0.5 0.5];
h=[];
% radii
h(end+1)=subplot(411);
var=[squeeze(p_onaxis{4}(1,1,:))*1000 squeeze(p_onaxis{4}(1,2,:))*1000 data.radius(:)];
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
plot(1:14,var(1:14,3),ls,'Linewidth',lw2,'color',lc)
plot(15:28,var(15:28,3),ls,'Linewidth',lw2,'color',lc)
plot(29:42,var(29:42,3),ls,'Linewidth',lw2,'color',lc)
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
clear var;
ylabel('r (mm)','Fontname','Arial','Fontsize',fs)
ylim([72,105])
xlim([-1,44])
set(gca,'xtick',1:42)
set(gca,'ytick',[80 90 100])
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0 0 0]);
%phi
h(end+1)=subplot(412);
var=[squeeze(p_onaxis{4}(2,1,:))/pi*180 squeeze(p_onaxis{4}(2,2,:))/pi*180 data.phi+ones(length(data.phi),1)*90 data.phi-ones(length(data.phi),1)*90];
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
for ch=1:size(p_onaxis{4},2)
plot(1:9,var(1:9,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(10:14,var(10:14,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(15:23,var(15:23,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(24:28,var(24:28,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(29:37,var(29:37,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(38:42,var(38:42,2+ch),ls,'Linewidth',lw2,'color',lc)
end
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
clear var;
set(gca,'YTick',[-90 90])
ylabel(' _e (deg)','Fontname','Arial','Fontsize',fs)
xlim([-1,44])
set(gca,'xtick',1:42)
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.055 0 0]);
%theta
h(end+1)=subplot(413);
var=[squeeze(p_onaxis{4}(3,1,:))/pi*180 squeeze(p_onaxis{4}(3,2,:))/pi*180 data.theta -data.theta];
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
for ch=1:size(p_onaxis{4},2)
plot(1:9,var(1:9,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(10:14,var(10:14,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(15:23,var(15:23,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(24:28,var(24:28,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(29:37,var(29:37,2+ch),ls,'Linewidth',lw2,'color',lc)
plot(38:42,var(38:42,2+ch),ls,'Linewidth',lw2,'color',lc)
end
for ch=1:size(p_onaxis{4},2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
clear var;
ylabel('\theta_e (deg)','Fontname','Arial','Fontsize',fs)
xlabel('Condition','Fontname','Arial','Fontsize',fs)
ylim([-15,15])
xlim([-1,44])
set(gca,'xtick',1:42)
set(gca,'xticklabel',[])
set(gca,'ytick',[-10 0 10])
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.11 0 0]);
for ii=1:length(h)
set(h(ii),'fontsize',14)
set(h(ii),'Linewidth',2)
tmp=findobj(h(ii),'Type','patch');
set(tmp,'EdgeColor','k');
end
set(gcf,'color',[1 1 1])
end
%% Figure 5
if flags.do_fig5
%load data
hrtf={'ARI','CIPIC','LISTEN'};
for kk=1:length(hrtf)
data=data_ziegelwanger2014(hrtf{kk});
if kk==3
data.results=data.results([1:27 29:end]);
end
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
temp2(:,1:size(data.results(ii).MCM{1}.p_offaxis,2),ii)=data.results(ii).MCM{1}.p_offaxis;
temp3(ii)=mean([data.results(ii).MCM{1}.performance.on_axis{1}.resnormS ...
data.results(ii).MCM{1}.performance.on_axis{2}.resnormS]);
temp4(ii)=mean([data.results(ii).MCM{1}.performance.off_axis{1}.resnormS ...
data.results(ii).MCM{1}.performance.off_axis{2}.resnormS]);
temp5(ii)=mean([data.results(ii).MCM{1}.performance.on_axis{1}.resnormP ...
data.results(ii).MCM{1}.performance.on_axis{2}.resnormP]);
temp6(ii)=mean([data.results(ii).MCM{1}.performance.off_axis{1}.resnormP ...
data.results(ii).MCM{1}.performance.off_axis{2}.resnormP]);
temp8(ii)=data.results(ii).MCM{1}.performance.on_axis{1}.resnormS;
temp9(ii)=data.results(ii).MCM{1}.performance.on_axis{2}.resnormS;
temp10(ii)=data.results(ii).MCM{1}.performance.off_axis{1}.resnormS;
temp11(ii)=data.results(ii).MCM{1}.performance.off_axis{2}.resnormS;
end
p_onaxis{kk}=temp1;
p_offaxis{kk}=temp2;
resnormS_onaxis{kk}=temp3;
resnormS_offaxis{kk}=temp4;
resnormP_onaxis{kk}=temp5;
resnormP_offaxis{kk}=temp6;
resnormS_onaxis_left{kk}=temp8;
resnormS_onaxis_right{kk}=temp9;
resnormS_offaxis_left{kk}=temp10;
resnormS_offaxis_right{kk}=temp11;
clear temp1 temp2 temp3 temp4 temp5 temp6 temp7 temp8 temp9 temp10 temp11
end
%plot figure
figure('PaperUnits','centimeters','PaperType','A4','Paperposition',[0, 0, 21, 29.7],'Units','centimeters','Position',[0 0 21 29.7],'Resize','off')
fs=14;%fontsize
lw=1.1;%linewidth
h=[];
%radii
temp=1;
for kk=1:length(hrtf)
var(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(mean(p_onaxis{kk}(1,:,:)*1000,2));
varl(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(1,1,:)*1000);
varr(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(1,2,:)*1000);
temp=size(var,1)+1;
end
h(1)=subplot(631);
colormap('gray');
binranges = 45:5:135;
bincounts=histc(varl,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varl);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*5,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([45,135])
ylim([-1,25])
ylabel('Left ear ','Fontname','Arial','Fontsize',fs)
set(gca,'xtick',[60 80 100 120])
set(gca,'xticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0 0.04 0]);
h(2)=subplot(634);
binranges = 45:5:135;
bincounts=histc(varr,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varr);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*5,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([45,135])
ylim([-1,25])
set(gca,'xtick',[60 80 100 120])
xlabel('r (mm)','Fontname','Arial','Fontsize',fs)
ylabel('Right ear ','Fontname','Arial','Fontsize',fs)
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.03 0.04 0]);
clear var varl varr;
% phi_e
temp=1;
for kk=1:length(hrtf)
varl(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(2,1,:))*180/pi;
varr(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
mod(squeeze(p_onaxis{kk}(2,2,:))*180/pi,360);
temp=size(varl,1)+1;
end
h(3)=subplot(632);
binranges = 55:2:125;
bincounts=histc(varl,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varl);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*2,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([55,125])
ylim([-1,25])
set(gca,'xticklabel',[]);
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.02 0 0.04 0]);
clear y
varr=abs(varr-360);
h(4)=subplot(635);
binranges = 55:2:125;
bincounts=histc(varr,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varr);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*2,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([55,125])
ylim([-1,25])
xlabel(' _e (deg)','Fontname','Arial','Fontsize',fs)
set(gca,'xtick',[60 80 100 120]);
set(gca,'xticklabel',{'±60','±80','±100','±120'});
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.02 0.03 0.04 0]);
clear varl varr a
% theta_e
temp=1;
for kk=1:length(hrtf)
varl(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(3,1,:))*180/pi;
varr(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(3,2,:))*180/pi;
temp=size(varl,1)+1;
end
h(5)=subplot(633);
binranges = -25:2:15;
bincounts=histc(varl,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varl);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*2,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([-25,15])
ylim([-1,25])
set(gca,'xticklabel',[]);
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.04 0 0.04 0]);
h(6)=subplot(636);
binranges = -25:2:15;
bincounts=histc(varr,binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6],'edgecolor',[0 0 0]);
hold on
box on
[mu,sigma]=normfit(varr);
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*2,'k','linewidth',lw)
plot([-500 500],[0 0],'k');
xlim([-25,15])
ylim([-1,25])
xlabel('\theta_e (deg)','Fontname','Arial','Fontsize',fs)
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.04 0.03 0.04 0]);
clear varl varr
for ii=1:length(h)
set(h(ii),'linewidth',lw)
set(h(ii),'TickLength',[0.015 0.015])
set(h(ii),'Fontname','Arial','Fontsize',12)
tmp=findobj(h(ii),'Type','patch');
set(tmp,'EdgeColor','k');
end
set(gcf,'color',[1 1 1])
end
%% Figure 6
if flags.do_fig6
siglevel=0.05;
outlierrate=0.01; % upper bound for the outlier rate
Obj=data_ziegelwanger2014('STP');
idx=Obj.Data.toaEst{4}(:,1)>-100000;
stpEst=Obj.Data.toaEst{4}(idx,1);
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,2);
stpMod=results.toa(idx,1);
stpRes=stpEst-stpMod;
Obj=data_ziegelwanger2014('NH89');
fs=Obj.Data.SamplingRate*1e-6;
idx=Obj.Data.toaEst{4}(:,1)>-100000;
sp=Obj.SourcePosition(idx,:);
[lat,~]=geo2horpolar(sp(:,1),sp(:,2));
nhEst=Obj.Data.toaEst{4}(idx,1);
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,2);
nhMod=results.toa(idx,1);
nhRes=nhEst-nhMod;
res=stpRes;
est=stpEst;
[~,idx]=deleteoutliers(res,siglevel*outlierrate*length(stpEst));
figure('Position',[620 229 560*2 497],'resize','off');
h(1)=subplot(2,2,1);
box on; hold on;
plot(lat,est/fs-min(est/fs),'.','MarkerEdgeColor',[0.5 0.5 0.5],'MarkerSize',8);
plot(lat(idx),est(idx)/fs-min(est/fs),'.k','MarkerSize',24);
axis([-99 99 -50 995]);
set(gca,'XTickLabel',[],'FontName','Arial');
ylabel('Relative TOA (µs)','FontName','Arial','FontSize',18);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0 0.06 0]);
h(2)=subplot(2,2,3);
box on; hold on;
plot(lat,res/fs,'.','MarkerEdgeColor',[0.5 0.5 0.5],'MarkerSize',8)
plot(lat(idx),res(idx)/fs,'.k','MarkerSize',24);
line([-99 99],1./[-fs -fs],'LineStyle','--','Color',[0 0 0]);
line([-99 99],1./[fs fs],'LineStyle','--','Color',[0 0 0]);
axis([-99 99 -80 195])
xlabel('\Phi_h (deg)','FontName','Arial','FontSize',18);
ylabel('Residual error (µs)','FontName','Arial','FontSize',18);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.11 0.06 0]);
res=nhRes;
est=nhEst;
[~,idx]=deleteoutliers(res,siglevel*outlierrate*length(nhEst));
h(3)=subplot(2,2,2);
box on; hold on;
plot(lat,est/fs-min(est/fs),'.','MarkerEdgeColor',[0.5 0.5 0.5],'MarkerSize',8);
plot(lat(idx),est(idx)/fs-min(est/fs),'.k','MarkerSize',24);
axis([-99 99 -50 995]);
set(gca,'XTickLabel',[],'FontName','Arial');
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.03 0 0.06 0]);
h(4)=subplot(2,2,4);
box on; hold on;
plot(lat,res/fs,'.','MarkerEdgeColor',[0.5 0.5 0.5],'MarkerSize',8)
plot(lat(idx),res(idx)/fs,'.k','MarkerSize',24);
line([-99 99],1./[-fs -fs],'LineStyle','--','Color',[0 0 0]);
line([-99 99],1./[fs fs],'LineStyle','--','Color',[0 0 0]);
axis([-99 99 -80 195])
xlabel('\Phi_h (deg)','FontName','Arial','FontSize',18);
set(gca,'yticklabel',[]);
tmp=get(gca,'Position');
set(gca,'Position',tmp+[-0.03 0.11 0.06 0]);
for ii=1:length(h)
set(h(ii),'linewidth',1.1)
set(h(ii),'Fontname','Arial','Fontsize',14)
end
set(gcf,'color',[1 1 1])
end
%% Figure 7
if flags.do_fig7
%load data
hrtf={'ARI','CIPIC','LISTEN'};
for kk=1:length(hrtf)
data=data_ziegelwanger2014(hrtf{kk});
if kk==3
data.results=data.results([1:27 29:end]);
end
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
temp2(:,:,ii)=data.results(ii).MCM{1}.p_offaxis;
temp3(:,:,ii)=data.results(ii).MCM{2}.p_offaxis;
end
p_onaxis{kk}=temp1;
% p_offaxis{kk,1}=temp2;
% p_offaxis{kk,2}=temp3;
clear data temp1 temp2 temp3
end
data=data_ziegelwanger2014('SPHERE_ROT');
for ii=1:length(data.results)
temp(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
end
p_onaxis{4}=temp;
clear data temp
Obj=data_ziegelwanger2014('Sphere');
[~,temp]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
p_onaxis{4}(:,:,end+1)=temp.p_onaxis;
clear data temp Obj
Obj=data_ziegelwanger2014('SAT');
[~,temp]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
p_onaxis{4}(:,:,end+1)=temp.p_onaxis;
clear data temp Obj
Obj=data_ziegelwanger2014('STP');
[~,temp]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
p_onaxis{4}(:,:,end+1)=temp.p_onaxis;
clear data temp Obj
data=data_ziegelwanger2014('SPHERE_DIS');
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
temp2(:,:,ii)=data.results(ii).MCM{1}.p_offaxis;
end
p_onaxis{5}=temp1;
p_offaxis{5}=temp2;
clear data temp1 temp2
%plot figure
figure('PaperUnits','centimeters','PaperType','A4','Paperposition',[0, 0, 21, 29.7],'Units','centimeters','Position',[0 0 21 29.7],'Resize','off')
fs=14;%fontsize
temp=1;
for kk=1:3
varl(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(1,1,:)*1000);
varr(temp:temp+size(p_onaxis{kk},3)-1,:)= ...
squeeze(p_onaxis{kk}(1,2,:)*1000);
temp=size(varl,1)+1;
end
h(1)=subplot(621);
binranges = -105:5:105;
bincounts=histc(varl(:,1)-varr(:,1),binranges);
bar(binranges,bincounts/sum(bincounts)*100,'Facecolor',[0.6 0.6 0.6]);
hold on
[mu,sigma]=normfit(varl(:,1)-varr(:,1));
y=normpdf(binranges,mu,sigma);
plot(binranges,y*100*5,'k','linewidth',1.1)
ylabel('Rel. Freq.','Fontname','Arial','Fontsize',fs)
xlabel('IRD (mm)','Fontname','Arial','Fontsize',fs)
xlim([-80,85])
ylim([-1,16])
set(gca,'xtick',[-60 -30 0 30 60])
clear varl varr y
for ii=1:length(h)
set(h(ii),'Linewidth',1.1)
set(h(ii),'TickLength',[0.015 0.015])
tmp=findobj(h(ii),'Type','patch');
set(tmp,'EdgeColor','k');
end
set(gcf,'color',[1 1 1])
end
%% Figure 8
if flags.do_fig8
%load data
Obj=data_ziegelwanger2014('NH89');
toa1=Obj.Data.toaEst{4};
[~,tmp]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
toa2=tmp.toa;
%plot figure
h=subplot(1,1,1);
plotziegelwanger2014(Obj,toa2-min(min(toa1))-1,4,'k',0,1,1,'-',3);
h2=plotziegelwanger2014(Obj,toa1-min(min(toa1))-1,4,'k',0,1,1,'o',1);
set(h2,'MarkerFaceColor',[0 0 0]);
h3=plotziegelwanger2014(Obj,toa2-min(min(toa1))-1,4,'k',0,2,1,'-',3);
set(h3,'Color',[0.5 0.5 0.5]);
h4=plotziegelwanger2014(Obj,toa1-min(min(toa1))-1,4,'k',0,2,1,'o',1);
set(h4,'MarkerFaceColor',[.5 .5 .5],'MarkerEdgeColor',[.5 .5 .5]);
xlim([-9 369])
ylim([-0.04 0.98])
grid off
xlabel(' ');
ylabel('Relative TOA (ms)','Fontname','Arial','Fontsize',22)
title('')
set(gca,'xticklabel',{'0' '90' '180' '270' '360 '});
set(gca,'ytick',[0 0.2 0.4 0.6 0.8])
set(gca,'Fontname','Arial','fontsize',18)
set(h,'linewidth',2)
end
%% Figure 9
if flags.do_fig9
%load data
data=data_ziegelwanger2014('SPHERE_DIS');
for ii=1:length(data.results)
p_onaxis(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
end
p1=p_onaxis(:,:,[1:3 length(data.xM)/3+1:length(data.xM)/3+3 length(data.xM)/3*2+1:length(data.xM)/3*2+3]);
r1=data.radius([1:3 length(data.xM)/3+1:length(data.xM)/3+3 length(data.xM)/3*2+1:length(data.xM)/3*2+3]);
yM1=data.yM([1:3 length(data.xM)/3+1:length(data.xM)/3+3 length(data.xM)/3*2+1:length(data.xM)/3*2+3]);
%plot figure
figure
tmp=get(gcf,'Position');
set(gcf,'Position',tmp.*[1 1 1 2]);
sym='ox';%plot symbols
ms=8;%markersize
lw1=2;%linewidth
lw2=2;%linewidth
fs=18;%fontsize
ls='k-';%linestyle
lc=[0.5 0.5 0.5];
h=[];
%radii
h(end+1)=subplot(611);
var=[squeeze(p1(1,1,:))*1000 squeeze(p1(1,2,:))*1000 r1];
for ch=1:size(p1,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
hold on
end
plot(1:3,r1(1:3),ls,'Linewidth',lw2,'color',lc)
hold on
plot(4:6,r1(4:6),ls,'Linewidth',lw2,'color',lc)
plot(7:9,r1(7:9),ls,'Linewidth',lw2,'color',lc)
set(gca,'xtick',1:9)
set(gca,'xticklabel',[])
clear var;
ylabel('r (mm)','Fontname','Arial','Fontsize',fs)
ylim([51,129])
xlim([0.5,9.5])
%yM
h(end+1)=subplot(612);
plot(1:3,-yM1(1:3)*1000,ls,'Linewidth',lw2,'color',lc)
hold on
plot(4:6,-yM1(4:6)*1000,ls,'Linewidth',lw2,'color',lc)
plot(7:9,-yM1(7:9)*1000,ls,'Linewidth',lw2,'color',lc)
set(gca,'xtick',1:9)
set(gca,'xticklabel',[])
clear var;
xlabel('Condition','Fontname','Arial','Fontsize',fs)
ylabel('y_M (mm) ','Fontname','Arial','Fontsize',fs)
ylim([-5 25])
xlim([0.5,9.5])
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.02 0 0]);
for ii=1:length(h)
set(h(ii),'fontsize',14)
set(h(ii),'Linewidth',2)
tmp=findobj(h(ii),'Type','patch');
set(tmp,'EdgeColor','k');
end
set(gcf,'color',[1 1 1])
end
%% Figure 11
if flags.do_fig11
%load data
data=data_ziegelwanger2014('SPHERE_DIS');
for ii=1:length(data.results)
p_offaxis(:,:,ii)=data.results(ii).MCM{1}.p_offaxis;
end
center=[data.xM(1:length(data.xM)/3) data.yM(1:length(data.yM)/3) data.zM(1:length(data.zM)/3)];
[~,idx3]=sort(squeeze(center(:,3)));
[~,idx2]=sort(squeeze(center(:,1)));
[~,idx1]=sort(squeeze(center(:,2)));
idx=idx3(idx2(idx1));
idx=[idx; idx+length(data.xM)/3; idx+length(data.xM)/3*2];
data.radius=data.radius(idx);
p_offaxis=p_offaxis(:,:,idx);
data.xM=data.xM(idx);
data.yM=data.yM(idx);
data.zM=data.zM(idx);
%plot figure
figure
tmp=get(gcf,'Position');
set(gcf,'Position',tmp.*[1 1 1.5 2]);
sym='ox';%plot symbols
ms=8;%markersize
lw1=2;%linewidth
lw2=2;%linewidth
fs=18;%fontsize
ls='k-';%linestyle
lc=[0.5 0.5 0.5];
h=[];
%radii
h(end+1)=subplot(611);
var=[squeeze(p_offaxis(1,1,:))*1000 squeeze(p_offaxis(1,2,:))*1000 data.radius];
plot(var(:,3),ls,'Linewidth',lw2,'color',lc)
hold on
for ch=1:size(p_offaxis,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
ylabel('r (mm)','Fontname','Arial','Fontsize',fs)
xlim([-1 size(var,1)+2])
ylim([72 108])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
clear var;
%xM
h(end+1)=subplot(612);
var=[squeeze(p_offaxis(2,1,:))*1000 squeeze(p_offaxis(2,2,:))*1000 -data.xM*1000];
plot(var(:,3),ls,'Linewidth',lw2,'color',lc)
hold on
for ch=1:size(p_offaxis,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
ylabel('x_M (mm) ','Fontname','Arial','Fontsize',fs)
xlim([-1 size(var,1)+2])
ylim([-28 8])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
clear var;
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.02 0 0]);
%yM
h(end+1)=subplot(613);
var=[squeeze(p_offaxis(3,1,:))*1000 squeeze(p_offaxis(3,2,:))*1000 -data.yM*1000];
plot(var(:,3),ls,'Linewidth',lw2,'color',lc)
hold on
for ch=1:size(p_offaxis,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
ylabel('y_M (mm) ','Fontname','Arial','Fontsize',fs)
xlim([-1 size(var,1)+2])
ylim([-8 28])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
clear var;
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.04 0 0]);
%zM
h(end+1)=subplot(614);
var=[squeeze(p_offaxis(4,1,:))*1000 squeeze(p_offaxis(4,2,:))*1000 -data.zM*1000];
plot([1 size(var,1)],var([1 3],3),ls,'Linewidth',lw2,'color',lc)
hold on
plot([1 size(var,1)],var([2 4],3),ls,'Linewidth',lw2,'color',lc)
for ch=1:size(p_offaxis,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
% set(gca,'YTick',[-10 0])
ylabel('z_M (mm)','Fontname','Arial','Fontsize',fs)
xlim([-1 size(var,1)+2])
ylim([-14 4])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
clear var;
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.06 0 0]);
%phi
h(end+1)=subplot(615);
var=[squeeze(p_offaxis(6,1,:))/pi*180 squeeze(p_offaxis(6,2,:))/pi*180 ones(length(data.zM),1)*90 -ones(length(data.zM),1)*90];
for ch=1:size(p_offaxis,2)
plot(abs(var(:,2+ch)),ls,'Linewidth',lw2,'color',lc)
hold on
end
for ch=1:size(p_offaxis,2)
plot(abs(var(:,ch)),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
set(gca,'YTick',[-90 90])
ylabel(' _e (deg)','Fontname','Arial','Fontsize',fs)
xlim([-1 size(var,1)+2])
ylim([82,98])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
set(gca,'ytick',[85 90 95])
set(gca,'yticklabel',{'±85','±90','±95'})
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.08 0 0]);
clear var;
%theta
h(end+1)=subplot(616);
var=[squeeze(p_offaxis(7,1,:))/pi*180 squeeze(p_offaxis(7,2,:))/pi*180 zeros(length(data.zM),1) zeros(length(data.zM),1)];
for ch=1:size(p_offaxis,2)
plot(var(:,2+ch),ls,'Linewidth',lw2,'color',lc)
hold on
end
for ch=1:size(p_offaxis,2)
plot(var(:,ch),['k' sym(ch)],'Markersize',ms,'Linewidth',lw1);
end
ylabel('\theta_e (deg)','Fontname','Arial','Fontsize',fs)
xlabel('Condition','Fontname','Arial','Fontsize',fs)
ylim([-7,7])
xlim([-1 size(var,1)+2])
set(gca,'xtick',1:size(var,1))
set(gca,'xticklabel',[])
set(gca,'ytick',[-5 0 5])
tmp=get(gca,'Position');
set(gca,'Position',tmp+[0 0.10 0 0]);
clear var;
for ii=1:length(h)
set(h(ii),'fontsize',14)
set(h(ii),'Linewidth',2)
tmp=findobj(h(ii),'Type','patch');
set(tmp,'EdgeColor','k');
end
set(gcf,'color',[1 1 1])
end
%% Table 1
if flags.do_tab1
%load data
data=data_ziegelwanger2014('SPHERE_ROT');
for ii=1:length(data.results)
p_onaxis{1}(:,:,ii)=data.results(ii).MAX{1}.p_onaxis;
p_onaxis{2}(:,:,ii)=data.results(ii).CTD{1}.p_onaxis;
p_onaxis{3}(:,:,ii)=data.results(ii).AGD{1}.p_onaxis;
p_onaxis{4}(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
end
resnormS=zeros(length(data.results),4);
for ii=1:length(data.results)
resnormS(ii,1)=mean([data.results(ii).MAX{1}.performance.on_axis{1}.resnormS ...
data.results(ii).MAX{1}.performance.on_axis{2}.resnormS]);
resnormS(ii,2)=mean([data.results(ii).CTD{1}.performance.on_axis{1}.resnormS ...
data.results(ii).CTD{1}.performance.on_axis{2}.resnormS]);
resnormS(ii,3)=mean([data.results(ii).AGD{1}.performance.on_axis{1}.resnormS ...
data.results(ii).AGD{1}.performance.on_axis{2}.resnormS]);
resnormS(ii,4)=mean([data.results(ii).MCM{1}.performance.on_axis{1}.resnormS ...
data.results(ii).MCM{1}.performance.on_axis{2}.resnormS]);
end
out=zeros(4,8);
out(1,7)=mean(resnormS(:,1))*1e6;
out(2,7)=mean(resnormS(:,2))*1e6;
out(3,7)=mean(resnormS(:,3))*1e6;
out(4,7)=mean(resnormS(:,4))*1e6;
out(1,8)=std(resnormS(:,1))*1e6;
out(2,8)=std(resnormS(:,2))*1e6;
out(3,8)=std(resnormS(:,3))*1e6;
out(4,8)=std(resnormS(:,4))*1e6;
idx=1:size(p_onaxis{1},3);
% radii
varl=[[squeeze(p_onaxis{1}(1,1,idx)) ...
squeeze(p_onaxis{2}(1,1,idx))...
squeeze(p_onaxis{3}(1,1,idx)) ...
squeeze(p_onaxis{4}(1,1,idx))]*1000 ...
data.radius(idx)];
varr=[[squeeze(p_onaxis{1}(1,2,idx)) ...
squeeze(p_onaxis{2}(1,2,idx))...
squeeze(p_onaxis{3}(1,2,idx)) ...
squeeze(p_onaxis{4}(1,2,idx))]*1000 ...
data.radius(idx)];
err=abs([varl(:,1:4); varr(:,1:4)]-[varl(:,5); varr(:,5)]*[1 1 1 1]);
out(1,1)=mean(err(:,1));
out(2,1)=mean(err(:,2));
out(3,1)=mean(err(:,3));
out(4,1)=mean(err(:,4));
out(1,2)=std(err(:,1));
out(2,2)=std(err(:,2));
out(3,2)=std(err(:,3));
out(4,2)=std(err(:,4));
%phi
varl=[[squeeze(p_onaxis{1}(2,1,idx)) ...
squeeze(p_onaxis{2}(2,1,idx))...
squeeze(p_onaxis{3}(2,1,idx)) ...
squeeze(p_onaxis{4}(2,1,idx))]/pi*180 ...
data.phi(idx)+ones(length(data.phi(idx)),1)*90];
varr=[mod([squeeze(p_onaxis{1}(2,2,idx)) ...
squeeze(p_onaxis{2}(2,2,idx))...
squeeze(p_onaxis{3}(2,2,idx)) ...
squeeze(p_onaxis{4}(2,2,idx))]/pi*180,360) ...
mod(data.phi(idx)-ones(length(data.phi(idx)),1)*90,360)];
err=abs([varl(:,1:4); varr(:,1:4)]-[varl(:,5); varr(:,5)]*[1 1 1 1]);
out(1,3)=mean(err(:,1));
out(2,3)=mean(err(:,2));
out(3,3)=mean(err(:,3));
out(4,3)=mean(err(:,4));
out(1,4)=std(err(:,1));
out(2,4)=std(err(:,2));
out(3,4)=std(err(:,3));
out(4,4)=std(err(:,4));
%theta
varl=[[squeeze(p_onaxis{1}(3,1,idx)) ...
squeeze(p_onaxis{2}(3,1,idx))...
squeeze(p_onaxis{3}(3,1,idx)) ...
squeeze(p_onaxis{4}(3,1,idx))]/pi*180 ...
data.theta(idx)];
varr=[[squeeze(p_onaxis{1}(3,2,idx)) ...
squeeze(p_onaxis{2}(3,2,idx))...
squeeze(p_onaxis{3}(3,2,idx)) ...
squeeze(p_onaxis{4}(3,2,idx))]/pi*180 ...
-data.theta(idx)];
err=abs([varl(:,1:4); varr(:,1:4)]-[varl(:,5); varr(:,5)]*[1 1 1 1]);
out(1,5)=mean(err(:,1));
out(2,5)=mean(err(:,2));
out(3,5)=mean(err(:,3));
out(4,5)=mean(err(:,4));
out(1,6)=std(err(:,1));
out(2,6)=std(err(:,2));
out(3,6)=std(err(:,3));
out(4,6)=std(err(:,4));
%display data
rows=['MAX ||';...
'CTD ||';...
'AGD ||';...
'MCM ||'];...
fprintf('\nTab. I.:\n')
fprintf('----------------------------------------------------------------------\n')
fprintf('EST || r error (mm) | phi_e error (deg) | theta_e errror | ANR (µs) \n')
fprintf('----------------------------------------------------------------------\n')
fprintf('----------------------------------------------------------------------\n')
for ii=1:4
fprintf(rows(ii,:))
fprintf(' %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f\n',out(ii,:)');
end
fprintf('----------------------------------------------------------------------\n\n')
end
%% Table 2
if flags.do_tab2
%load data
out=zeros(3,16);
Obj1=data_ziegelwanger2014('Sphere');
for method=1:4
[Obj1,results]=ziegelwanger2014(Obj1,Obj1.Data.toaEst{method},0,1,[[0.08; pi/18*8; 0; 0] [0.08; -pi/18*10; 0; 0]]);
out(1,method+0)=results.p_onaxis(1,1)*1000;
out(1,method+4)=results.p_onaxis(2,1)*180/pi;
out(1,method+8)=results.p_onaxis(3,1)*180/pi-1;
out(1,method+12)=results.performance.on_axis{1}.resnormS*1e06;
end
Obj2=data_ziegelwanger2014('SAT');
for method=1:4
[Obj2,results]=ziegelwanger2014(Obj2,Obj2.Data.toaEst{method},0,1,[[0.08; pi/18*8; 0; 0] [0.08; -pi/18*10; 0; 0]]);
out(2,method+0)=results.p_onaxis(1,1)*1000;
out(2,method+4)=results.p_onaxis(2,1)*180/pi;
out(2,method+8)=results.p_onaxis(3,1)*180/pi-1;
out(2,method+12)=results.performance.on_axis{1}.resnormS*1e06;
end
Obj3=data_ziegelwanger2014('STP');
for method=1:4
[Obj3,results]=ziegelwanger2014(Obj3,Obj3.Data.toaEst{method},0,1,[[0.08; pi/18*8; 0; 0] [0.08; -pi/18*10; 0; 0]]);
out(3,method+0)=results.p_onaxis(1,1)*1000;
out(3,method+4)=results.p_onaxis(2,1)*180/pi;
out(3,method+8)=results.p_onaxis(3,1)*180/pi-1;
out(3,method+12)=results.performance.on_axis{1}.resnormS*1e06;
end
%display data
rows=['Sphere ||';...
'SAT ||';...
'STP ||'];
fprintf('\nTab. II.:\n')
fprintf('----------------------------------------------------------------------------------------------------------\n')
fprintf(' || r error (mm) | phi_e error (deg) | theta_e errror | ANR (µs) \n')
fprintf(' || MAX | CTD | AGD | MCM | MAX | CTD | AGD | MCM | MAX | CTD | AGD | MCM | MAX | CTD | AGD | MCM \n')
fprintf('----------------------------------------------------------------------------------------------------------\n')
fprintf('----------------------------------------------------------------------------------------------------------\n')
for ii=1:3
fprintf(rows(ii,:))
fprintf(' %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f| %4.1f\n',out(ii,:)');
end
fprintf('----------------------------------------------------------------------------------------------------------\n\n')
end
%% Table 3
if flags.do_tab3
%load data
out=zeros(4,8);
hrtf={'ARI','CIPIC','LISTEN'};
for kk=1:length(hrtf)
data=data_ziegelwanger2014(hrtf{kk});
if kk==3
data.results=data.results([1:27 29:end]);
end
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{1}.p_onaxis;
temp3(ii)=mean([data.results(ii).MCM{1}.performance.on_axis{1}.resnormS ...
data.results(ii).MCM{1}.performance.on_axis{2}.resnormS]);
temp5(ii)=mean([data.results(ii).MCM{1}.performance.on_axis{1}.resnormP ...
data.results(ii).MCM{1}.performance.on_axis{2}.resnormP]);
temp8(ii)=data.results(ii).MCM{1}.performance.on_axis{1}.resnormS;
temp9(ii)=data.results(ii).MCM{1}.performance.on_axis{2}.resnormS;
end
p_onaxis{kk}=temp1;
resnormS_onaxis{kk}=temp3;
resnormP_onaxis{kk}=temp5;
resnormS_onaxis_left{kk}=temp8;
resnormS_onaxis_right{kk}=temp9;
clear temp1 temp3 temp5 temp8 temp9
end
% radii
out(1,1)=mean([mean(squeeze(p_onaxis{1}(1,1,:)*1000)) ...
mean(squeeze(p_onaxis{2}(1,1,:)*1000)) ...
mean(squeeze(p_onaxis{3}(1,1,:)*1000))]);
out(1,2)=std([reshape(p_onaxis{1}(1,1,:)*1000,1,numel(p_onaxis{1}(1,1,:))) ...
reshape(p_onaxis{2}(1,1,:)*1000,1,numel(p_onaxis{2}(1,1,:))) ...
reshape(p_onaxis{3}(1,1,:)*1000,1,numel(p_onaxis{3}(1,1,:)))]);
out(2,1)=mean([mean(squeeze(p_onaxis{1}(1,2,:)*1000)) ...
mean(squeeze(p_onaxis{2}(1,2,:)*1000)) ...
mean(squeeze(p_onaxis{3}(1,2,:)*1000))]);
out(2,2)=std([reshape(p_onaxis{1}(1,2,:)*1000,1,numel(p_onaxis{1}(1,2,:))) ...
reshape(p_onaxis{2}(1,2,:)*1000,1,numel(p_onaxis{2}(1,2,:))) ...
reshape(p_onaxis{3}(1,2,:)*1000,1,numel(p_onaxis{3}(1,2,:)))]);
% phi_e
out(1,3)=mean([mean(squeeze(p_onaxis{1}(2,1,:)*180/pi)) ...
mean(squeeze(p_onaxis{2}(2,1,:)*180/pi)) ...
mean(squeeze(p_onaxis{3}(2,1,:)*180/pi))]);
out(1,4)=std([reshape(p_onaxis{1}(2,1,:)*180/pi,1,numel(p_onaxis{1}(2,1,:))) ...
reshape(p_onaxis{2}(2,1,:)*180/pi,1,numel(p_onaxis{2}(2,1,:))) ...
reshape(p_onaxis{3}(2,1,:)*180/pi,1,numel(p_onaxis{3}(2,1,:)))]);
out(2,3)=mean([mean(squeeze(p_onaxis{1}(2,2,:)*180/pi)) ...
mean(squeeze(p_onaxis{2}(2,2,:)*180/pi)) ...
mean(squeeze(p_onaxis{3}(2,2,:)*180/pi))]);
out(2,4)=std([reshape(p_onaxis{1}(2,2,:)*180/pi,1,numel(p_onaxis{1}(2,2,:))) ...
reshape(p_onaxis{2}(2,2,:)*180/pi,1,numel(p_onaxis{2}(2,2,:))) ...
reshape(p_onaxis{3}(2,2,:)*180/pi,1,numel(p_onaxis{3}(2,2,:)))]);
% theta_e
out(1,5)=mean([mean(squeeze(p_onaxis{1}(3,1,:)*180/pi)) ...
mean(squeeze(p_onaxis{2}(3,1,:)*180/pi)) ...
mean(squeeze(p_onaxis{3}(3,1,:)*180/pi))]);
out(1,6)=std([reshape(p_onaxis{1}(3,1,:)*180/pi,1,numel(p_onaxis{1}(3,1,:))) ...
reshape(p_onaxis{2}(3,1,:)*180/pi,1,numel(p_onaxis{2}(3,1,:))) ...
reshape(p_onaxis{3}(3,1,:)*180/pi,1,numel(p_onaxis{3}(3,1,:)))]);
out(2,5)=mean([mean(squeeze(p_onaxis{1}(3,2,:)*180/pi)) ...
mean(squeeze(p_onaxis{2}(3,2,:)*180/pi)) ...
mean(squeeze(p_onaxis{3}(3,2,:)*180/pi))]);
out(2,6)=std([reshape(p_onaxis{1}(3,2,:)*180/pi,1,numel(p_onaxis{1}(3,2,:))) ...
reshape(p_onaxis{2}(3,2,:)*180/pi,1,numel(p_onaxis{2}(3,2,:))) ...
reshape(p_onaxis{3}(3,2,:)*180/pi,1,numel(p_onaxis{3}(3,2,:)))]);
out(1,7)=mean([resnormS_onaxis_left{1} resnormS_onaxis_left{2} resnormS_onaxis_left{3}])*1e6;
out(1,8)=std([resnormS_onaxis_left{1} resnormS_onaxis_left{2} resnormS_onaxis_left{3}])*1e6;
out(2,7)=mean([resnormS_onaxis_right{1} resnormS_onaxis_right{2} resnormS_onaxis_right{3}])*1e6;
out(2,8)=std([resnormS_onaxis_right{1} resnormS_onaxis_right{2} resnormS_onaxis_right{3}])*1e6;
Obj=data_ziegelwanger2014('NH89');
[~,results]=ziegelwanger2014(Obj,4,0,1);
out(3:4,[1 3 5])=results.p_onaxis(1:3,:)'.*([1;1]*[1000 180/pi 180/pi]);
out(3,7)=results.performance.on_axis{1}.resnormS*1e6;
out(4,7)=results.performance.on_axis{2}.resnormS*1e6;
%display data
rows=['All | L ||';...
' | R ||';...
'NH89 | L ||';...
' | R ||'];...
fprintf('\nTab. III.:\n')
fprintf('-----------------------------------------------------------------------\n')
fprintf(' | Ear || r (mm) | phi_e (deg) | theta_e (deg) | ANR (µs) \n')
fprintf('-----------------------------------------------------------------------\n')
fprintf('-----------------------------------------------------------------------\n')
for ii=1:4
fprintf(rows(ii,:))
fprintf(' %5.1f ± %4.1f | %5.1f ± %4.1f | %5.1f ± %3.1f | %4.1f ± %4.1f\n',out(ii,:)');
end
fprintf('-----------------------------------------------------------------------\n\n')
end
%% Table 5
if flags.do_tab5
%load data
out=zeros(12,14);
Obj=data_ziegelwanger2014('SAT');
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
out(1:2,[1 7 9 11 3 5])=results.p_offaxis([1:4 6:7],:)'.*([1;1]*[1000 1000 1000 1000 180/pi 180/pi]);
out(1,13)=results.performance.off_axis{1}.resnormS*1e6;
out(2,13)=results.performance.off_axis{2}.resnormS*1e6;
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},[0.05 0.01],1);
out(3:4,[1 7 9 11 3 5])=results.p_offaxis([1:4 6:7],:)'.*([1;1]*[1000 1000 1000 1000 180/pi 180/pi]);
out(3,13)=results.performance.off_axis{1}.resnormS*1e6;
out(4,13)=results.performance.off_axis{2}.resnormS*1e6;
Obj=data_ziegelwanger2014('STP');
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},0,1);
out(5:6,[1 7 9 11 3 5])=results.p_offaxis([1:4 6:7],:)'.*([1;1]*[1000 1000 1000 1000 180/pi 180/pi]);
out(5,13)=results.performance.off_axis{1}.resnormS*1e6;
out(6,13)=results.performance.off_axis{2}.resnormS*1e6;
[~,results]=ziegelwanger2014(Obj,Obj.Data.toaEst{4},[0.05 0.01],1);
out(7:8,[1 7 9 11 3 5])=results.p_offaxis([1:4 6:7],:)'.*([1;1]*[1000 1000 1000 1000 180/pi 180/pi]);
out(7,13)=results.performance.off_axis{1}.resnormS*1e6;
out(8,13)=results.performance.off_axis{2}.resnormS*1e6;
out(1:8,5)=out(1:8,5)-1;
hrtf={'ARI','CIPIC','LISTEN'};
for kk=1:length(hrtf)
data=data_ziegelwanger2014(hrtf{kk});
if kk==3
data.results=data.results([1:27 29:end]);
end
for jj=1:2
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{jj}.p_offaxis;
temp3(ii)=mean([data.results(ii).MCM{jj}.performance.off_axis{1}.resnormS ...
data.results(ii).MCM{jj}.performance.off_axis{2}.resnormS]);
temp5(ii)=mean([data.results(ii).MCM{jj}.performance.off_axis{1}.resnormP ...
data.results(ii).MCM{jj}.performance.off_axis{2}.resnormP]);
temp8(ii)=data.results(ii).MCM{jj}.performance.off_axis{1}.resnormS;
temp9(ii)=data.results(ii).MCM{jj}.performance.off_axis{2}.resnormS;
end
p_offaxis{kk,jj}=temp1;
resnormS_offaxis{kk,jj}=temp3;
resnormP_offaxis{kk,jj}=temp5;
resnormS_offaxis_left{kk,jj}=temp8;
resnormS_offaxis_right{kk,jj}=temp9;
clear temp1 temp3 temp5 temp8 temp9
end
end
% radii
for jj=1:2
out(9+(jj-1)*2,1)=mean([mean(squeeze(p_offaxis{1,jj}(1,1,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(1,1,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(1,1,:)*1000))]);
out(9+(jj-1)*2,2)=std([reshape(p_offaxis{1,jj}(1,1,:)*1000,1,numel(p_offaxis{1,jj}(1,1,:))) ...
reshape(p_offaxis{2,jj}(1,1,:)*1000,1,numel(p_offaxis{2,jj}(1,1,:))) ...
reshape(p_offaxis{3,jj}(1,1,:)*1000,1,numel(p_offaxis{3,jj}(1,1,:)))]);
out(10+(jj-1)*2,1)=mean([mean(squeeze(p_offaxis{1,jj}(1,2,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(1,2,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(1,2,:)*1000))]);
out(10+(jj-1)*2,2)=std([reshape(p_offaxis{1,jj}(1,2,:)*1000,1,numel(p_offaxis{1,jj}(1,2,:))) ...
reshape(p_offaxis{2,jj}(1,2,:)*1000,1,numel(p_offaxis{2,jj}(1,2,:))) ...
reshape(p_offaxis{3,jj}(1,2,:)*1000,1,numel(p_offaxis{3,jj}(1,2,:)))]);
end
% phi_e
for jj=1:2
out(9+(jj-1)*2,3)=mean([mean(squeeze(p_offaxis{1,jj}(6,1,:)*180/pi)) ...
mean(squeeze(p_offaxis{2,jj}(6,1,:)*180/pi)) ...
mean(squeeze(p_offaxis{3,jj}(6,1,:)*180/pi))]);
out(9+(jj-1)*2,4)=std([reshape(p_offaxis{1,jj}(6,1,:)*180/pi,1,numel(p_offaxis{1,jj}(6,1,:))) ...
reshape(p_offaxis{2,jj}(6,1,:)*180/pi,1,numel(p_offaxis{2,jj}(6,1,:))) ...
reshape(p_offaxis{3,jj}(6,1,:)*180/pi,1,numel(p_offaxis{3,jj}(6,1,:)))]);
out(10+(jj-1)*2,3)=mean([mean(squeeze(p_offaxis{1,jj}(6,2,:)*180/pi)) ...
mean(squeeze(p_offaxis{2,jj}(6,2,:)*180/pi)) ...
mean(squeeze(p_offaxis{3,jj}(6,2,:)*180/pi))]);
out(10+(jj-1)*2,4)=std([reshape(p_offaxis{1,jj}(6,2,:)*180/pi,1,numel(p_offaxis{1,jj}(6,2,:))) ...
reshape(p_offaxis{2,jj}(6,2,:)*180/pi,1,numel(p_offaxis{2,jj}(6,2,:))) ...
reshape(p_offaxis{3,jj}(6,2,:)*180/pi,1,numel(p_offaxis{3,jj}(6,2,:)))]);
end
% theta_e
for jj=1:2
out(9+(jj-1)*2,5)=mean([mean(squeeze(p_offaxis{1,jj}(7,1,:)*180/pi)) ...
mean(squeeze(p_offaxis{2,jj}(7,1,:)*180/pi)) ...
mean(squeeze(p_offaxis{3,jj}(7,1,:)*180/pi))]);
out(9+(jj-1)*2,6)=std([reshape(p_offaxis{1,jj}(7,1,:)*180/pi,1,numel(p_offaxis{1,jj}(7,1,:))) ...
reshape(p_offaxis{2,jj}(7,1,:)*180/pi,1,numel(p_offaxis{2,jj}(7,1,:))) ...
reshape(p_offaxis{3,jj}(7,1,:)*180/pi,1,numel(p_offaxis{3,jj}(7,1,:)))]);
out(10+(jj-1)*2,5)=mean([mean(squeeze(p_offaxis{1,jj}(7,2,:)*180/pi)) ...
mean(squeeze(p_offaxis{2,jj}(7,2,:)*180/pi)) ...
mean(squeeze(p_offaxis{3,jj}(7,2,:)*180/pi))]);
out(10+(jj-1)*2,6)=std([reshape(p_offaxis{1,jj}(7,2,:)*180/pi,1,numel(p_offaxis{1,jj}(7,2,:))) ...
reshape(p_offaxis{2,jj}(7,2,:)*180/pi,1,numel(p_offaxis{2,jj}(7,2,:))) ...
reshape(p_offaxis{3,jj}(7,2,:)*180/pi,1,numel(p_offaxis{3,jj}(7,2,:)))]);
end
% xM
for jj=1:2
out(9+(jj-1)*2,7)=mean([mean(squeeze(p_offaxis{1,jj}(2,1,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(2,1,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(2,1,:)*1000))]);
out(9+(jj-1)*2,8)=std([reshape(p_offaxis{1,jj}(2,1,:)*1000,1,numel(p_offaxis{1,jj}(2,1,:))) ...
reshape(p_offaxis{2,jj}(2,1,:)*1000,1,numel(p_offaxis{2,jj}(2,1,:))) ...
reshape(p_offaxis{3,jj}(2,1,:)*1000,1,numel(p_offaxis{3,jj}(2,1,:)))]);
out(10+(jj-1)*2,7)=mean([mean(squeeze(p_offaxis{1,jj}(2,2,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(2,2,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(2,2,:)*1000))]);
out(10+(jj-1)*2,8)=std([reshape(p_offaxis{1,jj}(2,2,:)*1000,1,numel(p_offaxis{1,jj}(2,2,:))) ...
reshape(p_offaxis{2,jj}(2,2,:)*1000,1,numel(p_offaxis{2,jj}(2,2,:))) ...
reshape(p_offaxis{3,jj}(2,2,:)*1000,1,numel(p_offaxis{3,jj}(2,2,:)))]);
end
% yM
for jj=1:2
out(9+(jj-1)*2,9)=mean([mean(squeeze(p_offaxis{1,jj}(3,1,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(3,1,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(3,1,:)*1000))]);
out(9+(jj-1)*2,10)=std([reshape(p_offaxis{1,jj}(3,1,:)*1000,1,numel(p_offaxis{1,jj}(3,1,:))) ...
reshape(p_offaxis{2,jj}(3,1,:)*1000,1,numel(p_offaxis{2,jj}(3,1,:))) ...
reshape(p_offaxis{3,jj}(3,1,:)*1000,1,numel(p_offaxis{3,jj}(3,1,:)))]);
out(10+(jj-1)*2,9)=mean([mean(squeeze(p_offaxis{1,jj}(3,2,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(3,2,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(3,2,:)*1000))]);
out(10+(jj-1)*2,10)=std([reshape(p_offaxis{1,jj}(3,2,:)*1000,1,numel(p_offaxis{1,jj}(3,2,:))) ...
reshape(p_offaxis{2,jj}(3,2,:)*1000,1,numel(p_offaxis{2,jj}(3,2,:))) ...
reshape(p_offaxis{3,jj}(3,2,:)*1000,1,numel(p_offaxis{3,jj}(3,2,:)))]);
end
% zM
for jj=1:2
out(9+(jj-1)*2,11)=mean([mean(squeeze(p_offaxis{1,jj}(4,1,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(4,1,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(4,1,:)*1000))]);
out(9+(jj-1)*2,12)=std([reshape(p_offaxis{1,jj}(4,1,:)*1000,1,numel(p_offaxis{1,jj}(4,1,:))) ...
reshape(p_offaxis{2,jj}(4,1,:)*1000,1,numel(p_offaxis{2,jj}(4,1,:))) ...
reshape(p_offaxis{3,jj}(4,1,:)*1000,1,numel(p_offaxis{3,jj}(4,1,:)))]);
out(10+(jj-1)*2,11)=mean([mean(squeeze(p_offaxis{1,jj}(4,2,:)*1000)) ...
mean(squeeze(p_offaxis{2,jj}(4,2,:)*1000)) ...
mean(squeeze(p_offaxis{3,jj}(4,2,:)*1000))]);
out(10+(jj-1)*2,12)=std([reshape(p_offaxis{1,jj}(4,2,:)*1000,1,numel(p_offaxis{1,jj}(4,2,:))) ...
reshape(p_offaxis{2,jj}(4,2,:)*1000,1,numel(p_offaxis{2,jj}(4,2,:))) ...
reshape(p_offaxis{3,jj}(4,2,:)*1000,1,numel(p_offaxis{3,jj}(4,2,:)))]);
end
for jj=1:2
out(9+(jj-1)*2,13)=mean([resnormS_offaxis_left{1,jj} resnormS_offaxis_left{2,jj} resnormS_offaxis_left{3,jj}])*1e6;
out(9+(jj-1)*2,14)=std([resnormS_offaxis_left{1,jj} resnormS_offaxis_left{2,jj} resnormS_offaxis_left{3,jj}])*1e6;
out(10+(jj-1)*2,13)=mean([resnormS_offaxis_right{1,jj} resnormS_offaxis_right{2,jj} resnormS_offaxis_right{3,jj}])*1e6;
out(10+(jj-1)*2,14)=std([resnormS_offaxis_right{1,jj} resnormS_offaxis_right{2,jj} resnormS_offaxis_right{3,jj}])*1e6;
end
%display data
rows=['SAT | Full | L ||';...
' | Full | R ||';...
' | O-A | L ||';...
' | O-A | R ||';...
'STP | Full | L ||';...
' | Full | R ||';...
' | O-A | L ||';...
' | O-A | R ||';...
'ALL | Full | L ||';...
' | Full | R ||';...
' | O-A | L ||';...
' | O-A | R ||'];
fprintf('\nTab. V.:\n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
fprintf(' | TOAset | Ear || r (mm) | phi_e (deg) | theta_e (deg)| x_M (mm) | y_M (mm) | z_M (mm) | ANR (µs) \n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
for ii=1:12
fprintf(rows(ii,:))
fprintf(' %4.1f ± %3.1f | %5.1f ± %3.1f | %5.1f ± %4.1f | %4.1f ± %4.1f | %4.1f ± %4.1f | %4.1f ± %4.1f | %4.1f ± %4.1f\n',out(ii,:)');
end
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n\n')
end
%% Table 6
if flags.do_tab6
%load data
out=zeros(8,14);
hrtf={'SPHERE_ROT','SPHERE_DIS'};
for kk=1:length(hrtf)
data=data_ziegelwanger2014(hrtf{kk});
for jj=1:2
for ii=1:length(data.results)
temp1(:,:,ii)=data.results(ii).MCM{jj}.p_offaxis;
temp3(ii)=mean([data.results(ii).MCM{jj}.performance.off_axis{1}.resnormS ...
data.results(ii).MCM{jj}.performance.off_axis{2}.resnormS]);
temp8(ii)=data.results(ii).MCM{jj}.performance.off_axis{1}.resnormS;
temp9(ii)=data.results(ii).MCM{jj}.performance.off_axis{2}.resnormS;
end
p_offaxis{kk,jj}=temp1;
resnormS_offaxis{kk,jj}=temp3;
resnormS_offaxis_left{kk,jj}=temp8;
resnormS_offaxis_right{kk,jj}=temp9;
if kk==1
radius{kk,jj}=[data.radius data.radius];
phi{kk,jj}=[90+data.phi 270+data.phi];
theta{kk,jj}=[data.theta -data.theta];
xM{kk,jj}=zeros(length(data.radius),2);
yM{kk,jj}=zeros(length(data.radius),2);
zM{kk,jj}=zeros(length(data.radius),2);
else
radius{kk,jj}=[data.radius data.radius];
phi{kk,jj}=ones(length(data.radius),1)*[90 270];
theta{kk,jj}=zeros(length(data.radius),2);
xM{kk,jj}=-[data.xM data.xM];
yM{kk,jj}=-[data.yM data.yM];
zM{kk,jj}=-[data.zM data.zM];
end
end
clear data temp1 temp3 temp8 temp9
end
for kk=1:2
for jj=1:2
for ch=1:2
err=squeeze(p_offaxis{kk,jj}(1,ch,:))*1000-radius{kk,jj}(:,ch);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),1)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),2)=std(err);
err=mod(squeeze(p_offaxis{kk,jj}(6,ch,:))*180/pi,360)-phi{kk,jj}(:,ch);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),3)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),4)=std(err);
err=squeeze(p_offaxis{kk,jj}(7,ch,:))*180/pi-theta{kk,jj}(:,ch);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),5)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),6)=std(err);
err=(squeeze(p_offaxis{kk,jj}(2,ch,:))-xM{kk,jj}(:,ch))*1000;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),7)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),8)=std(err);
err=(squeeze(p_offaxis{kk,jj}(3,ch,:))-yM{kk,jj}(:,ch))*1000;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),9)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),10)=std(err);
err=(squeeze(p_offaxis{kk,jj}(4,ch,:))-zM{kk,jj}(:,ch))*1000;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),11)=mean(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),12)=std(err);
out(1+(kk-1)*4+(jj-1)*2+(ch-1),13)=mean(resnormS_offaxis_left{kk,jj})*1e6;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),14)=std(resnormS_offaxis_left{kk,jj})*1e6;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),13)=mean(resnormS_offaxis_right{kk,jj})*1e6;
out(1+(kk-1)*4+(jj-1)*2+(ch-1),14)=std(resnormS_offaxis_right{kk,jj})*1e6;
end
end
end
%display data
rows=['Centered | Full | L ||';...
' | Full | R ||';...
' | O-A | L ||';...
' | O-A | R ||';...
'Non-centered | Full | L ||';...
' | Full | R ||';...
' | O-A | L ||';...
' | O-A | R ||'];
fprintf('\nTab. V.:\n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
fprintf('Condition | TOAset | Ear || r error (mm) | phi_e error (deg) | theta_e errror | x_M error (mm) | y_M error (mm) | z_M error (mm) | ANR (µs) \n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n')
for ii=1:8
fprintf(rows(ii,:))
fprintf(' %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f | %4.1f ± %3.1f\n',out(ii,:)');
end
fprintf('-------------------------------------------------------------------------------------------------------------------------------------------------\n\n')
end
end
function idx=ARI_FindPosition(data,azimuth,elevation)
psi=sin(elevation/180*pi).*sin(data.APV(:,2)/180*pi) + ...
cos(elevation/180*pi).*cos(data.APV(:,2)/180*pi).*...
cos(azimuth/180*pi-data.APV(:,1)/180*pi);
[~,idx]=min(acos(psi));
end
function [lat,pol]=geo2horpolar(azi,ele)
warning('off');
azi=mod(azi+360,360);
ele=mod(ele+360,360);
razi = deg2rad(azi);
rele = deg2rad(ele);
rlat=asin(sin(razi).*cos(rele));
rpol=asin(sin(rele)./cos(rlat));
idx=find(cos(rlat)==0);
rpol(idx)=0;
pol = rad2deg(rpol);
lat = rad2deg(rlat);
idx = find(razi>pi/2 & razi < 3*pi/2 & (rele < pi/2 | rele > 3*pi/2));
pol(idx)=180-pol(idx);
idx = find(~(razi>pi/2 & razi < 3*pi/2) & rele > pi/2 & rele < 3*pi/2);
pol(idx)=180-pol(idx);
end