Ver Fonte

add A2B_matrix.m and pv2params.m by Aaron Heller (from a2b.pdf)

Fernando Pablo Lopez-Lezcano há 10 anos atrás
commit
834992ef9b
2 ficheiros alterados com 58 adições e 0 exclusões
  1. 41 0
      A2B_matrix.m
  2. 17 0
      pv2params.m

+ 41 - 0
A2B_matrix.m

@@ -0,0 +1,41 @@
+function [A2B pv max_err] = A2B_matrix(Y, X, v_z_factor)
+  % fit 4x4 matrix to measured mic data
+  %
+  % Y is the n x m matrix of measurments (’observations’),
+  % n is number of measurement directions
+  % m is number of microphones
+  % X is the n x 3 matrix of are the direction cosines of the
+  % measurment directions (’predictor variables’)
+  % pv is the matrix of unknowns to be estimated
+  % so Y = X pv
+  if (nargin < 2 )
+    X = measurement_dirs_z0(size(Y,1));
+  end
+  X1 = [ ones(size(Y,1), 1) X ];
+  pv = X1 \ Y;
+  max_err = max (Y - (X1 * pv));
+  pv = fill_v_z( pv );
+  A2B = [sqrt(2)/2 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1] / pv;
+end
+
+function X = measurement_dirs_z0(n)
+  if (nargin < 1)
+    n = 8;
+  end
+  x_range = 0 : 2*pi/n : 2*pi*(n-1)/n;
+  X = [ cos(x_range)' sin(x_range)' zeros(n,1) ];
+end
+
+function pv = fill_v_z (pv, signs, elevation)
+  if (nargin < 2)
+    signs = [ +1 -1 -1 +1 ];
+  end;
+  if (nargin < 3)
+    z_factor = sqrt(2)/2;
+  else
+    z_factor = tan(elevation);
+  end;
+  for i = 1:4
+    pv(4,i) = signs(i) * sqrt( pv(2,i)^2 + pv(3,i)^2 ) * z_factor;
+  end;
+end

+ 17 - 0
pv2params.m

@@ -0,0 +1,17 @@
+function pv2params (pv)
+  display(sprintf('mic\t sens\t dir\t fbr\t az\t el\n'));
+  for i = 1:size(pv,1)
+    p = pv(i,1);
+    v = pv(i,2:4);
+    s = ( p + norm(v) )/ 2;
+    d = norm(v) / ( norm(v) + p );
+    fbr = (p+norm(v)) / (p-norm(v));
+    fbr_sign = sign(fbr);
+    fbr_dB = 20 * log10( abs(fbr) );
+    o = v / norm(v);
+    az_el_rad = [ atan2( o(2), o(1) ) asin( o(3) ) ];
+    az_el_deg = 180/pi * az_el_rad;
+    display(sprintf('%5g\t %5g\t %5g\t %5g\t %5g\t %5g\n', ...
+		    i, s, d, fbr_dB, az_el_deg(1), az_el_deg(2)));
+  end
+end