offset.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % Diese Funktion bestimmt die aufgrund der Korrektur mit der Leermessung
  3. % auftretende Verschiebung der HRIRs in negative Richtung und korri-
  4. % giert diese. Die Fensterlänge kann dabei beliebig gewählt werden. Der
  5. % Parameter "smooth" gibt an , ob die HRIRs geglättet werden sollen
  6. % (smooth = 1) oder nicht (smooth = 0). Das Programm orientiert sich an
  7. % dem paper von Keller, Hartung, Takahashi aus dem Jahr 1998.
  8. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9. function [hrirshift_l, hrirshift_r, az_num, el_num] = offset(hrir_l, hrir_r, fensterzeit, smooth)
  10. % Fensterzeit in ms zwischen 0 und 500
  11. fensterlaenge = fensterzeit * 100;
  12. L = size(hrir_l,3);
  13. zeilen = size(hrir_l,1);
  14. spalten = size(hrir_l,2);
  15. fenster = zeros(1,L);
  16. fenster(1) = 1;
  17. fenster(L-(fensterlaenge-2):L) = 1;
  18. hrirsmooth_l = zeros(zeilen,spalten,L);
  19. hrirsmooth_r = zeros(zeilen,spalten,L);
  20. offset_l = zeros(zeilen,spalten);
  21. offset_r = zeros(zeilen,spalten);
  22. for i = 1:zeilen
  23. for j = 1:spalten
  24. HRIR_l = squeeze(hrir_l(i,j,:)).';
  25. HRIR_r = squeeze(hrir_r(i,j,:)).';
  26. faltung_l = cconv(HRIR_l.^2, fenster,L);
  27. faltung_r = cconv(HRIR_r.^2, fenster,L);
  28. offset_l(i,j) = find(faltung_l == max(faltung_l),1);
  29. offset_r(i,j) = find(faltung_r == max(faltung_r),1);
  30. filter_l = zeros(1,L);
  31. filter_r = zeros(1,L);
  32. if offset_l(i,j)+fensterlaenge-1 <= L
  33. filter_l(1,offset_l(i,j):offset_l(i,j)+fensterlaenge-1) = 1;
  34. else
  35. filter_l(1,offset_l(i,j):L) = 1;
  36. filter_l(1,1:fensterlaenge-L+offset_l(i,j)-1) = 1;
  37. end
  38. if offset_r(i,j)+fensterlaenge-1 <= L
  39. filter_r(1,offset_r(i,j):offset_r(i,j)+fensterlaenge-1) = 1;
  40. else
  41. filter_r(1,offset_r(i,j):L) = 1;
  42. filter_r(1,1:fensterlaenge-L+offset_r(i,j)-1) = 1;
  43. end
  44. hrirsmooth_l(i,j,:) = HRIR_l .* filter_l;
  45. hrirsmooth_r(i,j,:) = HRIR_r .* filter_r;
  46. end
  47. end
  48. offset_l(offset_l < L/2) = nan;
  49. offset_r(offset_r < L/2) = nan;
  50. [off_l, I_l] = min(offset_l(:));
  51. [off_r, I_r] = min(offset_r(:));
  52. if off_l <= off_r
  53. offset = off_l;
  54. I = I_l;
  55. else
  56. offset = off_r;
  57. I = I_r;
  58. end
  59. if isnan(offset) == 1
  60. az_num = 0;
  61. el_num = 0;
  62. if smooth == 0
  63. hrirshift_l = hrir_l;
  64. hrirshift_r = hrir_r;
  65. else
  66. hrirshift_l = hrirsmooth_l;
  67. hrirshift_r = hrirsmooth_r;
  68. end
  69. else
  70. [az_num, el_num] = ind2sub(size(offset_l), I);
  71. if smooth == 0
  72. hrirshift_l = circshift(hrir_l, [0,0,(L-offset)+1]);
  73. hrirshift_r = circshift(hrir_r, [0,0,(L-offset)+1]);
  74. else
  75. hrirshift_l = circshift(hrirsmooth_l, [0,0,(L-offset)+1]);
  76. hrirshift_r = circshift(hrirsmooth_r, [0,0,(L-offset)+1]);
  77. end
  78. end
  79. end