high order vq search functions
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 18 Jul 2017 22:09:39 +0000 (22:09 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 18 Jul 2017 22:09:39 +0000 (22:09 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3311 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/vq_search_gain.m [new file with mode: 0644]
codec2-dev/octave/vq_search_mse.m [new file with mode: 0644]
codec2-dev/octave/vq_search_sg.m [new file with mode: 0644]
codec2-dev/octave/vq_search_slope.m [new file with mode: 0644]

diff --git a/codec2-dev/octave/vq_search_gain.m b/codec2-dev/octave/vq_search_gain.m
new file mode 100644 (file)
index 0000000..ee0096d
--- /dev/null
@@ -0,0 +1,43 @@
+%----------------------------------------------------------------------
+% abs() search with a linear gain term
+
+function [idx contrib errors test_ g mg sl] = vq_search_gain(vq, data)
+  
+  [nVec nCols] = size(vq);
+  nRows = rows(data);
+
+  error = zeros(1,nVec);
+  g = zeros(nRows, nVec);
+  diff  = zeros(nVec, nCols);
+  errors = zeros(1, nRows);
+  idx = zeros(1, nRows);
+  contrib = zeros(nRows, nCols);
+  test_ = zeros(nVec, nCols);
+  weights = ones(1,nCols);
+  %weights(nCols-10+1:nCols) = 0.25;
+
+  for f=1:nRows
+    target = data(f,:);
+    for i=1:nVec
+      % work out gain for best match
+
+      g(f, i) = (sum(target) - sum(vq(i,:)))/nCols;
+      diff(i,:) = target - vq(i,:) - g(f, i);
+      diff(i,:) .* weights;
+
+      % abs in dB is MSE in linear
+
+      error(i) = mean(abs(diff(i,:)));
+
+      %printf("f: %d i: %d g: %f error: %f\n", f, i, g(f, i), error(i));
+    end
+    [mn min_ind] = min(error);
+
+    idx(f) = min_ind;
+
+    errors(f) = mn; 
+    contrib(f,:) = test_(f,:) = vq(min_ind,:) + g(f,min_ind);
+  end
+  mg = 1; sl = 0;
+endfunction
+
diff --git a/codec2-dev/octave/vq_search_mse.m b/codec2-dev/octave/vq_search_mse.m
new file mode 100644 (file)
index 0000000..1d652b5
--- /dev/null
@@ -0,0 +1,26 @@
+% standard mean squared error search
+
+function [idx contrib errors test_ g mg sl] = vq_search_mse(vq, data)
+  [nVec nCols] = size(vq);
+  nRows = rows(data);
+  
+  error = zeros(1,nVec);
+  errors = zeros(1, nRows);
+  idx = zeros(1, nRows);
+  contrib = zeros(nRows, nCols);
+  test_ = zeros(nVec, nCols);
+
+  for f=1:nRows
+    target = data(f,:);
+    for i=1:nVec
+      diff = target - vq(i,:);
+      error(i) = diff * diff';
+    end
+    [mn min_ind] = min(error);
+    errors(f) = mn; idx(f) = min_ind; contrib(f,:) = vq(min_ind,:);
+    test_(f,:) = vq(min_ind,:);
+  end
+
+  g = 0; mg = 1; sl = 0; % dummys for this function
+endfunction
+
diff --git a/codec2-dev/octave/vq_search_sg.m b/codec2-dev/octave/vq_search_sg.m
new file mode 100644 (file)
index 0000000..a104056
--- /dev/null
@@ -0,0 +1,46 @@
+%----------------------------------------------------------------------
+% abs() search with a linear and slope term
+
+function [idx contrib errors test_ g mg sl] = vq_search_slope(vq, data)
+  [nVec nCols] = size(vq);
+  nRows = rows(data);
+  
+  g = mg = sl = zeros(nRows, nVec);
+  diff  = zeros(nVec, nCols);
+  idx = errors = zeros(1, nRows);
+  error = zeros(1, nVec);
+  contrib = zeros(nRows, nCols);
+  test_ = zeros(nVec, nCols);
+
+  weights = ones(1,nCols);
+
+  A  = [sum(1:nCols) (1:nCols)*(1:nCols)'; nCols  sum(1:nCols)];
+
+  for f=1:nRows
+    target = data(f,:);
+    %target = 2*vq(1,:)+1;
+
+    for i=1:nVec
+      c = [target*(1:nCols)' sum(target)]';
+      b = inv(A(:,:,i))*c;
+
+      g(f,i) = b(1); sl(f,i) = b(2);
+      
+      diff(i,:) = target - (vq(i,:) + g(f,i) + sl(f,i)*(1:nCols));
+      diff(i,:) .* weights;
+
+      % abs in dB is MSE in linear
+
+      error(i) = mean(abs(diff(i,:)));
+
+      %printf("f: %d i: %d mg: %f g: %f sl: %f error: %f\n", f, i, mg(f,i), g(f,i), sl(f,i), error(i));
+    end
+    
+    [mn min_ind] = min(error);
+    errors(f) = mn; 
+    idx(f) = min_ind(1);
+   
+    contrib(f,:) = test_(f,:) = vq(min_ind,:) + g(f,min_ind) + sl(f,min_ind)*(1:nCols);
+  end
+
+endfunction
diff --git a/codec2-dev/octave/vq_search_slope.m b/codec2-dev/octave/vq_search_slope.m
new file mode 100644 (file)
index 0000000..9752678
--- /dev/null
@@ -0,0 +1,55 @@
+%----------------------------------------------------------------------
+% abs() search with a linear, ampl scaling, and slope term
+
+function [idx contrib errors test_ g mg sl] = vq_search_slope(vq, data)
+  [nVec nCols] = size(vq);
+  nRows = rows(data);
+  
+  g = mg = sl = zeros(nRows, nVec);
+  diff  = zeros(nVec, nCols);
+  idx = errors = zeros(1, nRows);
+  error = zeros(1, nVec);
+  contrib = zeros(nRows, nCols);
+  test_ = zeros(nVec, nCols);
+
+  weights = ones(1,nCols);
+
+  A = zeros(3,3,nVec);
+  for i=1:nVec
+    A(:,:,i) = [sum(vq(i,:))      nCols        sum(1:nCols); ...
+                vq(i,:)*vq(i,:)'   sum(vq(i,:)) (1:nCols)*vq(i,:)'; ...
+                (1:nCols)*vq(i,:)' sum(1:nCols) (1:nCols)*(1:nCols)'];
+  end
+
+  for f=1:nRows
+    target = data(f,:);
+    %target = 2*vq(1,:)+1;
+
+    for i=1:nVec
+      c = [sum(target) target*vq(i,:)' target*(1:nCols)']';
+      b = inv(A(:,:,i))*c;
+
+      %b(1) = quantise([0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0], b(1));
+      %b(3) = quantise([-1.0 -0.5 0.0 0.5 1.0], b(3));
+      %b(1) = quantise([0.8 1.2], b(1));
+      %b(3) = quantise([-0.2 0.2], b(3));
+      mg(f,i) = b(1); g(f,i) = b(2); sl(f,i) = b(3);
+      
+      diff(i,:) = target - (mg(f,i)*vq(i,:) + g(f,i) + sl(f,i)*(1:nCols));
+      diff(i,:) .* weights;
+
+      % abs in dB is MSE in linear
+
+      error(i) = mean(abs(diff(i,:)));
+
+      %printf("f: %d i: %d mg: %f g: %f sl: %f error: %f\n", f, i, mg(f,i), g(f,i), sl(f,i), error(i));
+    end
+    
+    [mn min_ind] = min(error);
+    errors(f) = mn; 
+    idx(f) = min_ind(1);
+   
+    contrib(f,:) = test_(f,:) = mg(f,min_ind)*vq(min_ind,:) + g(f,min_ind) + sl(f,min_ind)*(1:nCols);
+  end
+
+endfunction