0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 clear all;
0051 close all;
0052
0053
0054 sparseOrder = 2;
0055
0056 [sparseHRTFdataset,sparseHRIRdataset] = supdeq_getSparseDataset(supdeq_lebedev([],sparseOrder),sparseOrder,44);
0057
0058 fs = sparseHRTFdataset.f(end)*2;
0059
0060
0061 denseSamplingGrid = supdeq_lebedev(2702);
0062
0063 referenceHRTFdataset = importdata('HRIRs_sfd_N44.mat');
0064
0065
0066 Ndense = referenceHRTFdataset.N;
0067
0068
0069 rKU100 = supdeq_optRadius(0.155,0.25,0.20,'Algazi');
0070
0071 c = 343;
0072
0073
0074
0075
0076
0077 toa_L = AKonsetDetect(sparseHRIRdataset.HRIR_L, 10, -20, 'rel', [3e3 fs]);
0078 toa_R = AKonsetDetect(sparseHRIRdataset.HRIR_R, 10, -20, 'rel', [3e3 fs]);
0079
0080
0081 toa_L_nm = AKsht(toa_L, false, sparseHRIRdataset.samplingGrid, sparseHRIRdataset.Nmax, 'complex', fs, false, 'real');
0082 toa_R_nm = AKsht(toa_R, false, sparseHRIRdataset.samplingGrid, sparseHRIRdataset.Nmax, 'complex', fs, false, 'real');
0083
0084
0085 HRIR_L_OBTA = AKfractionalDelayCyclic(sparseHRIRdataset.HRIR_L, -toa_L);
0086 HRIR_R_OBTA = AKfractionalDelayCyclic(sparseHRIRdataset.HRIR_R, -toa_R);
0087
0088
0089 HRTF_L_OBTA = AKboth2singleSidedSpectrum (fft(HRIR_L_OBTA));
0090 HRTF_R_OBTA = AKboth2singleSidedSpectrum (fft(HRIR_R_OBTA));
0091 obtaHRTFdataset = supdeq_hrtf2sfd(HRTF_L_OBTA.',HRTF_R_OBTA.',sparseHRTFdataset.Nmax,sparseHRTFdataset.samplingGrid,fs,'ak');
0092
0093
0094 [HRIR_L_Dense_OBTA, HRIR_R_Dense_OBTA] = supdeq_getArbHRIR(obtaHRTFdataset,denseSamplingGrid,'DEG',2,'ak');
0095
0096
0097 toa_L_Dense = AKisht(toa_L_nm, false, denseSamplingGrid(:,1:2), 'complex', false, false, 'real');
0098 toa_R_Dense = AKisht(toa_R_nm, false, denseSamplingGrid(:,1:2), 'complex', false, false, 'real');
0099
0100
0101 HRIR_L_Dense_OBTA = AKfractionalDelayCyclic(HRIR_L_Dense_OBTA, toa_L_Dense);
0102 HRIR_R_Dense_OBTA = AKfractionalDelayCyclic(HRIR_R_Dense_OBTA, toa_R_Dense);
0103
0104
0105
0106 HRTF_L_Dense_OBTA = AKboth2singleSidedSpectrum (fft(HRIR_L_Dense_OBTA,size(HRIR_L_Dense_OBTA,1)*referenceHRTFdataset.FFToversize));
0107 HRTF_R_Dense_OBTA = AKboth2singleSidedSpectrum (fft(HRIR_R_Dense_OBTA,size(HRIR_R_Dense_OBTA,1)*referenceHRTFdataset.FFToversize));
0108 denseHRTFdataset_obta = supdeq_hrtf2sfd(HRTF_L_Dense_OBTA.',HRTF_R_Dense_OBTA.',Ndense,denseSamplingGrid,fs,'ak');
0109 denseHRTFdataset_obta.FFToversize = referenceHRTFdataset.FFToversize;
0110
0111
0112 clearvars -EXCEPT denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0113
0114
0115
0116
0117
0118 nPoints = size(sparseHRTFdataset.samplingGrid,1);
0119 az = sparseHRTFdataset.samplingGrid(:,1);
0120 az(az>180) = (360-az(az>180))*-1;
0121 el = 90-sparseHRTFdataset.samplingGrid(:,2);
0122 azRad = az * pi / 180;
0123 elRad = el * pi / 180;
0124
0125
0126 tl = cos(elRad).*sin(azRad)*rKU100*(c^-1);
0127 tr = -tl;
0128
0129
0130 fVec = sparseHRTFdataset.f;
0131 fCut = 1500;
0132 [~,fCutBin] = min(abs(fVec-fCut));
0133
0134
0135 wc = 2*pi*fVec(fCutBin);
0136 apl = zeros(nPoints,length(fVec));
0137 apl(:,1:fCutBin-1) = 1;
0138 apr = zeros(nPoints,length(fVec));
0139 apr(:,1:fCutBin-1) = 1;
0140 for id = 1:nPoints
0141 for kk = fCutBin:size(apl,2)
0142 apl(id,kk) = exp(-1j*(2*pi*fVec(kk)-wc)*tl(id));
0143 apr(id,kk) = exp(-1j*(2*pi*fVec(kk)-wc)*tr(id));
0144 end
0145 end
0146
0147
0148 HRTF_L_FDTA = sparseHRTFdataset.HRTF_L .* apl;
0149 HRTF_R_TAZ = sparseHRTFdataset.HRTF_R .* apr;
0150
0151
0152 fdtaHRTFdataset = supdeq_hrtf2sfd(HRTF_L_FDTA,HRTF_R_TAZ,sparseHRTFdataset.Nmax,sparseHRTFdataset.samplingGrid,fs,'ak');
0153
0154
0155 [HRTF_L_Dense_FDTA, HRTF_R_Dense_FDTA] = supdeq_getArbHRTF(fdtaHRTFdataset,denseSamplingGrid,'DEG',2,'ak');
0156
0157
0158 nPointsDense = size(denseSamplingGrid,1);
0159 azDense = denseSamplingGrid(:,1);
0160 azDense(azDense>180) = (360-azDense(azDense>180))*-1;
0161 elDense = 90-denseSamplingGrid(:,2);
0162 azDenseRad = azDense * pi / 180;
0163 elDenseRad = elDense * pi / 180;
0164
0165
0166 tlDense = cos(elDenseRad).*sin(azDenseRad)*rKU100*(c^-1);
0167 trDense = -tlDense;
0168
0169 aplDense = zeros(nPointsDense,length(fVec));
0170 aplDense(:,1:fCutBin-1) = 1;
0171 aprDense = zeros(nPointsDense,length(fVec));
0172 aprDense(:,1:fCutBin-1) = 1;
0173 for id = 1:nPointsDense
0174 for kk = fCutBin:size(apl,2)
0175
0176 aplDense(id,kk) = exp(1j*(2*pi*fVec(kk)-wc)*tlDense(id));
0177 aprDense(id,kk) = exp(1j*(2*pi*fVec(kk)-wc)*trDense(id));
0178 end
0179 end
0180
0181
0182 HRTF_L_Dense_FDTA = HRTF_L_Dense_FDTA .* aplDense;
0183 HRTF_R_Dense_FDTA = HRTF_R_Dense_FDTA .* aprDense;
0184
0185
0186 denseHRTFdataset_fdta = supdeq_hrtf2sfd(HRTF_L_Dense_FDTA,HRTF_R_Dense_FDTA,Ndense,denseSamplingGrid,fs,'ak');
0187 denseHRTFdataset_fdta.FFToversize = referenceHRTFdataset.FFToversize;
0188
0189
0190 clearvars -EXCEPT denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0191
0192
0193
0194
0195 eqDataset = supdeq_getEqDataset(Ndense,2*rKU100,length(referenceHRTFdataset.f)*2-2,fs);
0196
0197
0198
0199 eqDataset = supdeq_limitEqDataset(eqDataset,sparseHRTFdataset.Nmax,eqDataset.radius);
0200
0201
0202 [eqHRTFdataset, HRTF_equalized_L, HRTF_equalized_R] = supdeq_eq(sparseHRTFdataset,eqDataset,sparseHRTFdataset.Nmax,sparseHRTFdataset.samplingGrid);
0203
0204
0205 [~,~,denseHRTFdataset_supdeq] = supdeq_deq(eqHRTFdataset, eqDataset, Ndense, denseSamplingGrid);
0206
0207
0208 clearvars -EXCEPT denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0209
0210
0211
0212
0213 k = 2*pi*sparseHRTFdataset.f/c; k = k.';
0214
0215
0216 sg = sparseHRTFdataset.samplingGrid * pi / 180;
0217
0218
0219 cosThetaL = cos(sg(:,2)')*cos(pi/2) + sin(sg(:,2)')*sin(pi/2) .* cos(sg(:,1)'-pi/2);
0220 phaseCorL = exp(-1j*rKU100 * k .* cosThetaL);
0221 cosThetaR = cos(sg(:,2)')*cos(pi/2) + sin(sg(:,2)')*sin(pi/2) .* cos(sg(:,1)'+pi/2);
0222 phaseCorR = exp(-1j*rKU100 * k .* cosThetaR);
0223
0224
0225 HRTF_L_PC = sparseHRTFdataset.HRTF_L .* phaseCorL.';
0226 HRTF_R_PC = sparseHRTFdataset.HRTF_R .* phaseCorR.';
0227
0228
0229 pcHRTFdataset = supdeq_hrtf2sfd(HRTF_L_PC,HRTF_R_PC,sparseHRTFdataset.Nmax,sparseHRTFdataset.samplingGrid,fs,'ak');
0230
0231
0232 [HRTF_L_Dense_PC, HRTF_R_Dense_PC] = supdeq_getArbHRTF(pcHRTFdataset,denseSamplingGrid,'DEG',2,'ak');
0233
0234
0235 denseSamplingGridRad = denseSamplingGrid * pi / 180;
0236
0237
0238
0239 cosThetaDenseL = cos(denseSamplingGridRad(:,2)')*cos(pi/2) + sin(denseSamplingGridRad(:,2)')*sin(pi/2) .* cos(denseSamplingGridRad(:,1)'-pi/2);
0240
0241 phaseCorDenseL = exp(1j*rKU100 * k .* cosThetaDenseL);
0242 cosThetaDenseR = cos(denseSamplingGridRad(:,2)')*cos(pi/2) + sin(denseSamplingGridRad(:,2)')*sin(pi/2) .* cos(denseSamplingGridRad(:,1)'+pi/2);
0243
0244 phaseCorDenseR = exp(1j*rKU100 * k .* cosThetaDenseR);
0245 HRTF_L_Dense_PC = HRTF_L_Dense_PC .* phaseCorDenseL.';
0246 HRTF_R_Dense_PC = HRTF_R_Dense_PC .* phaseCorDenseR.';
0247
0248
0249 denseHRTFdataset_pc = supdeq_hrtf2sfd(HRTF_L_Dense_PC,HRTF_R_Dense_PC,Ndense,denseSamplingGrid,fs,'ak');
0250 denseHRTFdataset_pc.FFToversize = referenceHRTFdataset.FFToversize;
0251
0252
0253 clearvars -EXCEPT denseHRTFdataset_pc denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267 supdeq_calcSpectralDifference(denseHRTFdataset_obta,referenceHRTFdataset,[],[],[],true);
0268 titleString = ['OBTA - N=',num2str(sparseOrder)];
0269 title(titleString);
0270 ylim([0 6]);
0271
0272
0273 supdeq_calcSpectralDifference(denseHRTFdataset_fdta,referenceHRTFdataset,[],[],[],true);
0274 titleString = ['FDTA - N=',num2str(sparseOrder)];
0275 title(titleString);
0276 ylim([0 6]);
0277
0278
0279 supdeq_calcSpectralDifference(denseHRTFdataset_supdeq,referenceHRTFdataset,[],[],[],true);
0280 titleString = ['SUpDEq - N=',num2str(sparseOrder)];
0281 title(titleString);
0282 ylim([0 6]);
0283
0284
0285 supdeq_calcSpectralDifference(denseHRTFdataset_pc,referenceHRTFdataset,[],[],[],true);
0286 titleString = ['PC - N=',num2str(sparseOrder)];
0287 title(titleString);
0288 ylim([0 6]);
0289
0290
0291
0292 clearvars -EXCEPT denseHRTFdataset_pc denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0293
0294
0295
0296 testSamplingGrid = [(250:290).',ones(41,1)*90];
0297
0298 supdeq_calcSpectralDifference(denseHRTFdataset_obta,referenceHRTFdataset,testSamplingGrid,[],[],true);
0299 titleString = ['OBTA - Lateral - N=',num2str(sparseOrder)];
0300 title(titleString);
0301 ylim([0 15]);
0302
0303
0304 supdeq_calcSpectralDifference(denseHRTFdataset_fdta,referenceHRTFdataset,testSamplingGrid,[],[],true);
0305 titleString = ['FDTA - Lateral - N=',num2str(sparseOrder)];
0306 title(titleString);
0307 ylim([0 15]);
0308
0309
0310 supdeq_calcSpectralDifference(denseHRTFdataset_supdeq,referenceHRTFdataset,testSamplingGrid,[],[],true);
0311 titleString = ['SUpDEq - Lateral - N=',num2str(sparseOrder)];
0312 title(titleString);
0313 ylim([0 15]);
0314
0315
0316 supdeq_calcSpectralDifference(denseHRTFdataset_pc,referenceHRTFdataset,testSamplingGrid,[],[],true);
0317 titleString = ['PC - Lateral - N=',num2str(sparseOrder)];
0318 title(titleString);
0319 ylim([0 15]);
0320
0321
0322
0323 clearvars -EXCEPT denseHRTFdataset_pc denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0324
0325
0326
0327
0328 az = 90;
0329 el = 90;
0330
0331
0332 hrir_ref = supdeq_getArbHRIR(referenceHRTFdataset,[az,el]);
0333 hrir_obta = supdeq_getArbHRIR(denseHRTFdataset_obta,[az,el]);
0334 hrir_fdta = supdeq_getArbHRIR(denseHRTFdataset_fdta,[az,el]);
0335 hrir_supdeq = supdeq_getArbHRIR(denseHRTFdataset_supdeq,[az,el]);
0336 hrir_pc = supdeq_getArbHRIR(denseHRTFdataset_pc,[az,el]);
0337
0338
0339 supdeq_plotIR(hrir_ref,hrir_obta,[],[],32)
0340 supdeq_plotIR(hrir_ref,hrir_fdta,[],[],32)
0341 supdeq_plotIR(hrir_ref,hrir_supdeq,[],[],32)
0342 supdeq_plotIR(hrir_ref,hrir_pc,[],[],32)
0343
0344
0345 clearvars -EXCEPT denseHRTFdataset_pc denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0346
0347
0348
0349
0350 az = 270;
0351 el = 90;
0352
0353
0354 hrir_ref = supdeq_getArbHRIR(referenceHRTFdataset,[az,el]);
0355 hrir_obta = supdeq_getArbHRIR(denseHRTFdataset_obta,[az,el]);
0356 hrir_fdta = supdeq_getArbHRIR(denseHRTFdataset_fdta,[az,el]);
0357 hrir_supdeq = supdeq_getArbHRIR(denseHRTFdataset_supdeq,[az,el]);
0358 hrir_pc = supdeq_getArbHRIR(denseHRTFdataset_pc,[az,el]);
0359
0360
0361 supdeq_plotIR(hrir_ref,hrir_obta,[],[],32)
0362 supdeq_plotIR(hrir_ref,hrir_fdta,[],[],32)
0363 supdeq_plotIR(hrir_ref,hrir_supdeq,[],[],32)
0364 supdeq_plotIR(hrir_ref,hrir_pc,[],[],32)
0365
0366
0367 clearvars -EXCEPT denseHRTFdataset_pc denseHRTFdataset_supdeq denseHRTFdataset_fdta denseHRTFdataset_obta c denseSamplingGrid fs Ndense referenceHRTFdataset rKU100 sparseHRIRdataset sparseHRTFdataset sparseOrder
0368
0369
0370
0371
0372 circGrid(1:360,1) = 0:359;
0373 circGrid(1:360,2) = 90;
0374
0375
0376 [circGrid_ref_L,circGrid_ref_R] = supdeq_getArbHRIR(referenceHRTFdataset,circGrid,'DEG',2,'ak');
0377 [circGrid_obta_L,circGrid_obta_R] = supdeq_getArbHRIR(denseHRTFdataset_obta,circGrid,'DEG',2,'ak');
0378 [circGrid_fdta_L,circGrid_fdta_R] = supdeq_getArbHRIR(denseHRTFdataset_fdta,circGrid,'DEG',2,'ak');
0379 [circGrid_supdeq_L,circGrid_supdeq_R] = supdeq_getArbHRIR(denseHRTFdataset_supdeq,circGrid,'DEG',2,'ak');
0380 [circGrid_pc_L,circGrid_pc_R] = supdeq_getArbHRIR(denseHRTFdataset_pc,circGrid,'DEG',2,'ak');
0381
0382
0383
0384 th = -10;
0385 for id = 1:size(circGrid,1)
0386
0387 ITD_ref(id) = supdeq_calcITD([circGrid_ref_L(:,id),circGrid_ref_R(:,id)],fs,th);
0388 ITD_obta(id) = supdeq_calcITD([circGrid_obta_L(:,id),circGrid_obta_R(:,id)],fs,th);
0389 ITD_fdta(id) = supdeq_calcITD([circGrid_fdta_L(:,id),circGrid_fdta_R(:,id)],fs,th);
0390 ITD_supdeq(id) = supdeq_calcITD([circGrid_supdeq_L(:,id),circGrid_supdeq_R(:,id)],fs,th);
0391 ITD_pc(id) = supdeq_calcITD([circGrid_pc_L(:,id),circGrid_pc_R(:,id)],fs,th);
0392
0393 end
0394
0395 figure;
0396 lineWidth = 1.2;
0397 plot(ITD_ref,'LineWidth',lineWidth)
0398 hold on;
0399 plot(ITD_obta,'LineWidth',lineWidth); plot(ITD_fdta,'LineWidth',lineWidth); plot(ITD_supdeq,'LineWidth',lineWidth); plot(ITD_pc,'LineWidth',lineWidth);
0400 legend('Ref','OBTA','FDTA','SUpDEq','PA','Location','SouthEast');
0401 xlabel('Azimuth in degrees'); xlim([0 360]);
0402 ylabel('ITD in ms');
0403
0404
0405
0406 for id = 1:size(circGrid,1)
0407
0408 ILD_ref(id) = supdeq_calcILD([circGrid_ref_L(:,id),circGrid_ref_R(:,id)]);
0409 ILD_obta(id) = supdeq_calcILD([circGrid_obta_L(:,id),circGrid_obta_R(:,id)]);
0410 ILD_fdta(id) = supdeq_calcILD([circGrid_fdta_L(:,id),circGrid_fdta_R(:,id)]);
0411 ILD_supdeq(id) = supdeq_calcILD([circGrid_supdeq_L(:,id),circGrid_supdeq_R(:,id)]);
0412 ILD_pc(id) = supdeq_calcILD([circGrid_pc_L(:,id),circGrid_pc_R(:,id)]);
0413
0414 end
0415
0416 figure;
0417 lineWidth = 1.2;
0418 plot(ILD_ref,'LineWidth',lineWidth)
0419 hold on;
0420 plot(ILD_obta,'LineWidth',lineWidth); plot(ILD_fdta,'LineWidth',lineWidth); plot(ILD_supdeq,'LineWidth',lineWidth); plot(ILD_pc,'LineWidth',lineWidth);
0421 legend('Ref','OBTA','FDTA','SUpDEq','PC','Location','NorthEast');
0422 xlabel('Azimuth in degrees'); xlim([0 360]);
0423 ylabel('ILD in dB');