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
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 function [denseHRTFdataset, denseHRIRdataset, denseHRTFdataset_sfd] = supdeq_deq(eqHRTFdataset, deqDataset, N, samplingGrid, windowLength, normalization, parallax)
0065
0066 if nargin < 5 || isempty(windowLength)
0067 windowLength = [];
0068 end
0069
0070 if nargin <6 || isempty(normalization)
0071 normalization = [];
0072 end
0073
0074 if nargin < 7 || isempty(parallax)
0075 parallax = true;
0076 end
0077
0078
0079 if isfield(eqHRTFdataset,'limited')
0080 if eqHRTFdataset.limited
0081 if isfield(deqDataset,'limited')
0082 if ~deqDataset.limited
0083 error('Limited eq transfer functions applied for equalization, but not applied for de-equalization!');
0084 end
0085 else
0086 error('Limited eq transfer functions applied for equalization, but not applied for de-equalization!');
0087 end
0088 end
0089 end
0090
0091
0092 if isfield(eqHRTFdataset,'limited') && isfield(deqDataset,'limited')
0093 if eqHRTFdataset.limited && deqDataset.limited
0094 if eqHRTFdataset.limitInfo.appliedRadius ~= deqDataset.limitInfo.appliedRadius
0095 error('Applied radius of limited equalization and de-equalization dataset must be the same!');
0096 end
0097 if eqHRTFdataset.limitInfo.fA ~= deqDataset.limitInfo.fA
0098 error('fA of limited equalization and de-equalization dataset must be the same!');
0099 end
0100 end
0101 end
0102
0103
0104 if isfield(eqHRTFdataset,'phaseOnly')
0105 phaseOnly = 1;
0106 else
0107 phaseOnly = 0;
0108 end
0109
0110
0111 fs = eqHRTFdataset.f(end)*2;
0112
0113
0114
0115 if deqDataset.waveType == 0
0116
0117
0118
0119 fprintf('Extracting %d deq transfer functions. This may take some time...\n',size(samplingGrid,1));
0120 [deqTF_L,deqTF_R] = supdeq_getArbHRTF(deqDataset,samplingGrid,[],[],'ak');
0121 fprintf('%d deq transfer functions extracted...\n',size(samplingGrid,1))
0122
0123 if phaseOnly
0124 fprintf('Phase only de-equalization...\n')
0125
0126 deqTF_L_phase = angle(deqTF_L);
0127 deqTF_R_phase = angle(deqTF_R);
0128 deqTF_L_mag = ones(size(deqTF_L,1),size(deqTF_L,2));
0129 deqTF_R_mag = ones(size(deqTF_R,1),size(deqTF_R,2));
0130 deqTF_L = deqTF_L_mag.*exp(1i*deqTF_L_phase);
0131 deqTF_R = deqTF_R_mag.*exp(1i*deqTF_R_phase);
0132 end
0133
0134
0135
0136 fprintf('Extracting %d HRTFs. This may take some time...\n',size(samplingGrid,1));
0137 [eqHRTF_L,eqHRTF_R] = supdeq_getArbHRTF(eqHRTFdataset,samplingGrid,[],[],'ak');
0138 fprintf('%d HRTFs extracted...\n',size(samplingGrid,1))
0139
0140
0141 HRTF_deequalized_L = zeros(size(samplingGrid,1),length(deqDataset.f));
0142 HRTF_deequalized_R = zeros(size(samplingGrid,1),length(deqDataset.f));
0143 for kk = 1:size(samplingGrid,1)
0144 HRTF_deequalized_L(kk,:)=eqHRTF_L(kk,:).*deqTF_L(kk,:);
0145 HRTF_deequalized_R(kk,:)=eqHRTF_R(kk,:).*deqTF_R(kk,:);
0146
0147 if ~mod(kk,100)
0148 fprintf('%d of %d HRTFs de-equalized...\n',kk,size(samplingGrid,1))
0149 end
0150
0151 end
0152
0153 end
0154
0155
0156
0157 if deqDataset.waveType == 1
0158
0159 fprintf('Applying DVF...\n');
0160
0161
0162
0163 fprintf('Extracting %d deq transfer functions. This may take some time...\n',size(samplingGrid,1));
0164 [deqTF_L,deqTF_R] = supdeq_getArbHRTF(deqDataset,samplingGrid,[],[],'ak');
0165 fprintf('%d deq transfer functions extracted...\n',size(samplingGrid,1))
0166
0167 if parallax
0168
0169 fprintf('Considering acoustic parallax...\n');
0170
0171
0172 [samplingGridParL,samplingGridParR] = supdeq_parallax(samplingGrid,deqDataset.sourceDistance,deqDataset.radius,deqDataset.earPosition);
0173
0174
0175
0176 fprintf('Extracting %d HRTFs. This may take some time...\n',size(samplingGridParL,1));
0177
0178 [eqHRTF_L,~] = supdeq_getArbHRTF(eqHRTFdataset,samplingGridParL,'DEG',0,'ak');
0179 [~,eqHRTF_R] = supdeq_getArbHRTF(eqHRTFdataset,samplingGridParR,'DEG',1,'ak');
0180 fprintf('%d HRTFs extracted...\n',size(samplingGrid,1))
0181
0182 else
0183
0184 fprintf('Not considering acoustic parallax...\n');
0185
0186
0187
0188 fprintf('Extracting %d HRTFs. This may take some time...\n',size(samplingGrid,1));
0189 [eqHRTF_L,eqHRTF_R] = supdeq_getArbHRTF(eqHRTFdataset,samplingGrid,[],[],'ak');
0190 fprintf('%d HRTFs extracted...\n',size(samplingGrid,1))
0191
0192 end
0193
0194
0195 HRTF_deequalized_L = zeros(size(samplingGrid,1),length(deqDataset.f));
0196 HRTF_deequalized_R = zeros(size(samplingGrid,1),length(deqDataset.f));
0197 for kk = 1:size(samplingGrid,1)
0198 HRTF_deequalized_L(kk,:)=eqHRTF_L(kk,:).*deqTF_L(kk,:);
0199 HRTF_deequalized_R(kk,:)=eqHRTF_R(kk,:).*deqTF_R(kk,:);
0200
0201 if ~mod(kk,100)
0202 fprintf('%d of %d HRTFs de-equalized...\n',kk,size(samplingGrid,1))
0203 end
0204
0205 end
0206
0207 end
0208
0209
0210
0211
0212
0213 HRTF_deequalized_L_double = conj([HRTF_deequalized_L(:,:), conj(fliplr(HRTF_deequalized_L(:,2:end-1)))])';
0214 HRTF_deequalized_R_double = conj([HRTF_deequalized_R(:,:), conj(fliplr(HRTF_deequalized_R(:,2:end-1)))])';
0215
0216 HRIR_deequalized_L = real(ifft(HRTF_deequalized_L_double));
0217 HRIR_deequalized_R = real(ifft(HRTF_deequalized_R_double));
0218
0219 if eqHRTFdataset.FFToversize > 1
0220 newLength = size(HRIR_deequalized_L,1)/eqHRTFdataset.FFToversize;
0221 HRIR_deequalized_L = HRIR_deequalized_L(1:newLength,:);
0222 HRIR_deequalized_R = HRIR_deequalized_R(1:newLength,:);
0223 end
0224
0225
0226 if ~isempty(windowLength)
0227 disp('Applying windows...');
0228
0229
0230 if ~isempty(normalization)
0231 disp('Applying normalization...');
0232
0233
0234 maxL = max(max(abs(HRIR_deequalized_L)));
0235 maxR = max(max(abs(HRIR_deequalized_R)));
0236
0237
0238 if maxL >= maxR
0239 normFactor = normalization/maxL;
0240 elseif maxR > maxL
0241 normFactor = normalization/maxR;
0242 end
0243
0244
0245 HRIR_deequalized_L = HRIR_deequalized_L*normFactor;
0246 HRIR_deequalized_R = HRIR_deequalized_R*normFactor;
0247 end
0248
0249
0250
0251 win = supdeq_win(size(HRIR_deequalized_L,1),windowLength);
0252
0253 for kk = 1:size(HRIR_deequalized_L,2)
0254 HRIR_deequalized_L(:,kk) = HRIR_deequalized_L(:,kk) .* win;
0255 HRIR_deequalized_R(:,kk) = HRIR_deequalized_R(:,kk) .* win;
0256 end
0257
0258
0259 denseHRIRdataset.HRIR_L = HRIR_deequalized_L';
0260 denseHRIRdataset.HRIR_R = HRIR_deequalized_R';
0261 denseHRIRdataset.fs = eqHRTFdataset.f(end)*2;
0262 denseHRIRdataset.samplingGrid = samplingGrid;
0263 denseHRIRdataset.deqEarDistance = deqDataset.earDistance;
0264 denseHRIRdataset.deqWaveType = deqDataset.waveType;
0265 if deqDataset.waveType == 1
0266 denseHRIRdataset.sourceDistance = deqDataset.sourceDistance;
0267 end
0268 if ~isempty(normalization)
0269 denseHRIRdataset.normFactor = normFactor;
0270 end
0271 denseHRIRdataset.windowLength = windowLength;
0272
0273
0274
0275 HRTF_deequalized_win_L = fft(HRIR_deequalized_L',size(HRIR_deequalized_L,1)*eqHRTFdataset.FFToversize,2);
0276 HRTF_deequalized_win_L = HRTF_deequalized_win_L(:,1:end/2+1);
0277 HRTF_deequalized_win_R = fft(HRIR_deequalized_R',size(HRIR_deequalized_R,1)*eqHRTFdataset.FFToversize,2);
0278 HRTF_deequalized_win_R = HRTF_deequalized_win_R(:,1:end/2+1);
0279
0280
0281 denseHRTFdataset.HRTF_L = HRTF_deequalized_win_L;
0282 denseHRTFdataset.HRTF_R = HRTF_deequalized_win_R;
0283 denseHRTFdataset.f = eqHRTFdataset.f;
0284 denseHRTFdataset.fs = eqHRTFdataset.f(end)*2;
0285 denseHRTFdataset.FFToversize = eqHRTFdataset.FFToversize;
0286 denseHRTFdataset.samplingGrid = samplingGrid;
0287 denseHRTFdataset.deqEarDistance = deqDataset.earDistance;
0288 denseHRTFdataset.deqWaveType = deqDataset.waveType;
0289 if deqDataset.waveType == 1
0290 denseHRTFdataset.sourceDistance = deqDataset.sourceDistance;
0291 end
0292 if ~isempty(normalization)
0293 denseHRTFdataset.normFactor = normFactor;
0294 end
0295 denseHRTFdataset.windowLength = windowLength;
0296
0297
0298
0299 fprintf('Performing spherical Fourier transform with N = %d. This may take some time...\n',N);
0300 denseHRTFdataset_sfd = supdeq_hrtf2sfd(HRTF_deequalized_win_L,HRTF_deequalized_win_R,N,samplingGrid,fs,'ak');
0301 denseHRTFdataset_sfd.FFToversize = eqHRTFdataset.FFToversize;
0302 denseHRTFdataset_sfd.deqEarDistance = deqDataset.earDistance;
0303 denseHRTFdataset_sfd.deqWaveType = deqDataset.waveType;
0304 if deqDataset.waveType == 1
0305 denseHRTFdataset_sfd.sourceDistance = deqDataset.sourceDistance;
0306 end
0307 if ~isempty(normalization)
0308 denseHRTFdataset_sfd.normFactor = normFactor;
0309 end
0310 denseHRTFdataset_sfd.windowLength = windowLength;
0311
0312 fprintf('Done with de-equalization...\n');
0313
0314 else
0315
0316
0317 if ~isempty(normalization)
0318 disp('Applying normalization...');
0319
0320
0321 maxL = max(max(abs(HRIR_deequalized_L)));
0322 maxR = max(max(abs(HRIR_deequalized_R)));
0323
0324
0325 if maxL >= maxR
0326 normFactor = normalization/maxL;
0327 elseif maxR > maxL
0328 normFactor = normalization/maxR;
0329 end
0330
0331
0332 HRIR_deequalized_L = HRIR_deequalized_L*normFactor;
0333 HRIR_deequalized_R = HRIR_deequalized_R*normFactor;
0334
0335
0336 denseHRIRdataset.HRIR_L = HRIR_deequalized_L';
0337 denseHRIRdataset.HRIR_R = HRIR_deequalized_R';
0338 denseHRIRdataset.fs = eqHRTFdataset.f(end)*2;
0339 denseHRIRdataset.samplingGrid = samplingGrid;
0340 denseHRIRdataset.deqEarDistance = deqDataset.earDistance;
0341 denseHRIRdataset.deqWaveType = deqDataset.waveType;
0342 if deqDataset.waveType == 1
0343 denseHRIRdataset.sourceDistance = deqDataset.sourceDistance;
0344 end
0345 denseHRIRdataset.normFactor = normFactor;
0346
0347
0348
0349 HRTF_deequalized_L = fft(HRIR_deequalized_L',size(HRIR_deequalized_L,1)*eqHRTFdataset.FFToversize,2);
0350 HRTF_deequalized_L = HRTF_deequalized_L(:,1:end/2+1);
0351 HRTF_deequalized_R = fft(HRIR_deequalized_R',size(HRIR_deequalized_R,1)*eqHRTFdataset.FFToversize,2);
0352 HRTF_deequalized_R = HRTF_deequalized_R(:,1:end/2+1);
0353
0354
0355 denseHRTFdataset.HRTF_L = HRTF_deequalized_L;
0356 denseHRTFdataset.HRTF_R = HRTF_deequalized_R;
0357 denseHRTFdataset.f = eqHRTFdataset.f;
0358 denseHRTFdataset.fs = eqHRTFdataset.f(end)*2;
0359 denseHRTFdataset.FFToversize = eqHRTFdataset.FFToversize;
0360 denseHRTFdataset.samplingGrid = samplingGrid;
0361 denseHRTFdataset.deqEarDistance = deqDataset.earDistance;
0362 denseHRTFdataset.deqWaveType = deqDataset.waveType;
0363 if deqDataset.waveType == 1
0364 denseHRTFdataset.sourceDistance = deqDataset.sourceDistance;
0365 end
0366 denseHRTFdataset.normFactor = normFactor;
0367
0368
0369
0370 fprintf('Performing spherical Fourier transform with N = %d. This may take some time...\n',N);
0371 denseHRTFdataset_sfd = supdeq_hrtf2sfd(HRTF_deequalized_L,HRTF_deequalized_R,N,samplingGrid,fs,'ak');
0372 denseHRTFdataset_sfd.FFToversize = eqHRTFdataset.FFToversize;
0373 denseHRTFdataset_sfd.deqEarDistance = deqDataset.earDistance;
0374 denseHRTFdataset_sfd.deqWaveType = deqDataset.waveType;
0375 if deqDataset.waveType == 1
0376 denseHRTFdataset_sfd.sourceDistance = deqDataset.sourceDistance;
0377 end
0378 denseHRTFdataset_sfd.normFactor = normFactor;
0379 fprintf('Done with de-equalization...\n');
0380
0381
0382 else
0383
0384 denseHRIRdataset.HRIR_L = HRIR_deequalized_L';
0385 denseHRIRdataset.HRIR_R = HRIR_deequalized_R';
0386 denseHRIRdataset.fs = eqHRTFdataset.f(end)*2;
0387 denseHRIRdataset.samplingGrid = samplingGrid;
0388 denseHRIRdataset.deqEarDistance = deqDataset.earDistance;
0389 denseHRIRdataset.deqWaveType = deqDataset.waveType;
0390 if deqDataset.waveType == 1
0391 denseHRIRdataset.sourceDistance = deqDataset.sourceDistance;
0392 end
0393
0394
0395 denseHRTFdataset.HRTF_L = HRTF_deequalized_L;
0396 denseHRTFdataset.HRTF_R = HRTF_deequalized_R;
0397 denseHRTFdataset.f = eqHRTFdataset.f;
0398 denseHRTFdataset.fs = eqHRTFdataset.f(end)*2;
0399 denseHRTFdataset.FFToversize = eqHRTFdataset.FFToversize;
0400 denseHRTFdataset.samplingGrid = samplingGrid;
0401 denseHRTFdataset.deqEarDistance = deqDataset.earDistance;
0402 denseHRTFdataset.deqWaveType = deqDataset.waveType;
0403 if deqDataset.waveType == 1
0404 denseHRTFdataset.sourceDistance = deqDataset.sourceDistance;
0405 end
0406
0407
0408
0409 fprintf('Performing spherical Fourier transform with N = %d. This may take some time...\n',N);
0410 denseHRTFdataset_sfd = supdeq_hrtf2sfd(HRTF_deequalized_L,HRTF_deequalized_R,N,samplingGrid,fs,'ak');
0411 denseHRTFdataset_sfd.FFToversize = eqHRTFdataset.FFToversize;
0412 denseHRTFdataset_sfd.deqEarDistance = deqDataset.earDistance;
0413 denseHRTFdataset_sfd.deqWaveType = deqDataset.waveType;
0414 if deqDataset.waveType == 1
0415 denseHRTFdataset_sfd.sourceDistance = deqDataset.sourceDistance;
0416 end
0417 fprintf('Done with de-equalization...\n');
0418
0419 end
0420 end
0421
0422 end
0423