sg vq search doing OK on fisrt 1khz for hts1a/hts2a/vk5qi
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 2 Aug 2017 05:07:27 +0000 (05:07 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 2 Aug 2017 05:07:27 +0000 (05:07 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3345 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/newamp1_batch.m
codec2-dev/octave/vq_search_sg.m

index 90935d758de86f20bd24305ab34a0a4b0ce4ca60..b8bad7d3856bef12c4c6d524a15d17a860b488da 100644 (file)
@@ -107,9 +107,11 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
   if strcmp(mode, 'const')
     [model_ surface b_log] = experiment_const_freq(model, varargin{:});
     ind = arg_exists(varargin, "vq_search");
-    if ind && strcmp(varargin{ind+1},"para")
-      fn = sprintf("%s_b_log.txt", output_prefix);
-      save(fn,"b_log");
+    if ind
+      if strcmp(varargin{ind+1},"para") || strcmp(varargin{ind+1},"cubic") || strcmp(varargin{ind+1},"sg")
+        fn = sprintf("%s_b_log.txt", output_prefix);
+        save(fn,"b_log");
+      end
     end
   end
   if strcmp(mode, 'piecewise')
@@ -261,7 +263,12 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin)
     end
   end
   
-  quant_en = arg_exists(varargin, "quant");
+  ind = arg_exists(varargin, "vq_gain");
+  if ind
+    avq_filename = varargin{ind+1};
+    x = load(avq_filename); vq_gain = x.vq;
+    quant_en = 1;
+  end
 
   % OK start processing .....
 
@@ -337,8 +344,13 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin)
         [idx contrib errors test_ g mg sl] = vq_search_gain(vq, rate_K_surface_no_mean(:,vq_st:vq_en), weights);
       end
 
+      if strcmp(vq_search, "mg")
+        [idx contrib errors b_log] = vq_search_mg(vq, rate_K_surface_no_mean(:,vq_st:vq_en));
+      end
+
       if strcmp(vq_search, "sg")
-        [idx contrib errors test_ g mg sl] = vq_search_sg(vq, rate_K_surface_no_mean(:,vq_st:vq_en));
+        [idx contrib errors b_log] = vq_search_sg(vq, rate_K_surface_no_mean(:,vq_st:vq_en));
+        b_log = [b_log energy' idx'];
       end
 
       if strcmp(vq_search, "slope")
@@ -351,16 +363,41 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin)
         
         if quant_en
           for f=1:frames
+            v = vq(idx(f),:);
+            k = 1:vq_cols; k2 = k.^2;
+#{
             target = rate_K_surface_no_mean(f,vq_st:vq_en);
-            % recalc gain using some index
-            v = mg(f)*vq(idx(f),1:vq_cols-10);
-            g = (sum(target(1:vq_cols-10)) - sum(v))/length(target);
-            contrib(f,:) = mg(f)*vq(idx(f),:) + g;
-            contrib(f, vq_cols-4:vq_cols) += -3:-6:-30;
+            
+            % search vq_gain for best match to gain coefficients
+
+            [nr nc] = size(vq_gain);
+            d = g = zeros(nr,1);
+            for r=1:nr
+              %con = vq_gain(r,1)*v + vq_gain(r,2)*k2 + vq_gain(r,3)*k;
+              con = v + vq_gain(r,2)*k2 + vq_gain(r,3)*k;
+              g(r) = (sum(target) - sum(con))/vq_cols;
+              con  += g(r);
+              d(r) = (target-con)*(target-con)';
+            end
+            [dmin imin] = min(d);
+            b_ = vq_gain(imin,:);
+            printf("idx(%d): %d imin: %d b(1); %f b(2): %f b3: %f\n", f, idx(f), imin, b_(1), b_(2), b_(3));
+          
+            % recalc contrib
+
+           %contrib(f,:) = b_(1)*v + b_(2)*k2 + b_(3)*k + g(imin);
+#}
+
+           contrib(f,:) = v + (-1/12.5)*b_log(f,3)*k2 + b_log(f,3)*k + b_log(f, 4);
           end
         end
       end
 
+      if strcmp(vq_search, "cubic")
+        [idx contrib errors b_log] = vq_search_cubic(rate_K_surface_no_mean(:,vq_st:vq_en));
+        b_log = [b_log energy' idx'];
+      end
+
       rate_K_surface_no_mean_(:, vq_st:vq_en) = contrib;
       res(:, vq_st:vq_en) = rate_K_surface_no_mean(:, vq_st:vq_en) - contrib;
       ind(:,i) = idx;
index a1040561d1a787045d90ad663dd289755bb3d895..fc93b13fa1452fcf74f75839e7928483f7d3bd3a 100644 (file)
@@ -1,46 +1,42 @@
 %----------------------------------------------------------------------
 % abs() search with a linear and slope term
 
-function [idx contrib errors test_ g mg sl] = vq_search_slope(vq, data)
+function [idx contrib errors b_log2] = vq_search_sg(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)];
+  b_log = zeros(nVec, 2);
+  b_log2 = [];
 
+  k = 1:nCols;
+  
   for f=1:nRows
-    target = data(f,:);
-    %target = 2*vq(1,:)+1;
+    t = data(f,:);
 
     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));
+      v = vq(i,:);
+      A  = [k*k' sum(k); sum(k) nCols];
+      c = [(t*k'-v*k') (sum(t)-sum(v))]';
+      b = inv(A)*c;
+      b(1) = quantise([-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0], b(1));
+      b_log(i,:) = b; 
+      diff = t - (v + b(1)*k + b(2));
+      error(i) = diff*diff';
+      %printf("  i: %d error %f\n", 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);
+    b = b_log(min_ind,:);
+    v = vq(min_ind,:);
+    printf("f: %d idx: %d b(1): %f b(2): %f\n", f, idx(f), b(1), b(2));
+    contrib(f,:) = v + b(1)*k + b(2);
+    b_log2 = [b_log2; b];
   end
 
 endfunction