batch and fbf working with slope based vq search
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 18 Jul 2017 03:33:17 +0000 (03:33 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 18 Jul 2017 03:33:17 +0000 (03:33 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3306 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/newamp.m
codec2-dev/octave/newamp1_batch.m
codec2-dev/octave/newamp1_fbf.m

index f31e81fd6db58033a5e88a41c979dfe6d71ef6dd..805282b8c526135316335e087dce86a7d79c637e 100644 (file)
@@ -587,7 +587,7 @@ endfunction
 
 % Take a rate K surface and convert back to time varying rate L
 
-function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz, Fs=8000)
+function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz, Fs=8000, pad_end=0)
   max_amp = 160; K = columns(rate_K_surface);
   [frames col] = size(model);
 
@@ -600,10 +600,20 @@ function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_f
     
     % back down to rate L
 
-    AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz Fs/2000], 
-                            [rate_K_surface(f,1) rate_K_surface(f,:) rate_K_surface(f,K)], 
-                            rate_L_sample_freqs_kHz, 
-                            "spline");
+    % dealing with end effects is an ongoing issue.....need a better solution
+
+    if pad_end
+      AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz Fs/2000], 
+                             [rate_K_surface(f,1) rate_K_surface(f,:) rate_K_surface(f,K)], 
+                             rate_L_sample_freqs_kHz, 
+                             "spline");
+    else
+      AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz], 
+                             [rate_K_surface(f,1) rate_K_surface(f,:)], 
+                             rate_L_sample_freqs_kHz, 
+                             "spline");
+    end
+
     %AmdB_(f,1:L) = interp_para(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz);
     %printf("f: %d %f %f %f\n", f, rate_K_sample_freqs_kHz(1), rate_L_sample_freqs_kHz(1), AmdB_(1));
     model_(f,1) = Wo; model_(f,2) = L; model_(f,3:(L+2)) = 10 .^ (AmdB_(f, 1:L)/20);
index 5eaddf1924098c3e58e9922958b59a98e055d874..cc568943c00fc7efd971692fb6c40bff9fa2d0c1 100644 (file)
@@ -52,9 +52,10 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
   synth_phase = output = 1;
   output_prefix = input_prefix;
   vq_type = "";
-  vq_filename = "";
-  fit_order = 0;
+  vq_filename = ""; 
+  vq_search = "mse";
   mode = "const";
+  fit_order = 0;
 
   % parse variable argument list
 
@@ -70,19 +71,27 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
     if ind
       mode =  varargin{ind+1};
     end
-    ind = arg_exists(varargin, "nomean");
+    ind = arg_exists(varargin, "vq_search");
     if ind
-      fit_order = 0;
+      vq_search = varargin{ind+1};
     end
-    ind = arg_exists(varargin, "noslope");
+    ind = arg_exists(varargin, "vq");
     if ind
-      fit_order = 1;
+      vq_type = varargin{ind};
+      vq_filename = varargin{ind+1};
+      printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
     end
     ind = arg_exists(varargin, "vqh");
     if ind
       vq_type = varargin{ind};
       vq_filename = varargin{ind+1};
-      printf("vq_type: %s vq_filename: %s\n", vq_type, vq_filename);
+      printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
+    end
+    ind = arg_exists(varargin, "vql");
+    if ind
+      vq_type = varargin{ind};
+      vq_filename = varargin{ind+1};
+      printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
     end
     ind = arg_exists(varargin, "no_output");
     if ind
@@ -91,7 +100,10 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
     end
   end
 
-  printf("output_prefix: %s\nfit_order %d output: %d\n", output_prefix, fit_order, output);
+  printf("output: %d\n", output);
+  if (output)
+    printf("output_prefix: %s\n",  output_prefix);
+  end
   
   model_name = strcat(input_prefix,"_model.txt");
   model = load(model_name);
@@ -114,7 +126,7 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
     [model_ surface] = experiment_mel_freq(model, 0, 1, voicing);
   end
   if strcmp(mode, 'const')
-    [model_ surface] = experiment_const_freq(model, fit_order, vq_type, vq_filename);
+    [model_ surface] = experiment_const_freq(model, vq_type, vq_filename, vq_search);
   end
   if strcmp(mode, 'piecewise')
     model_ = experiment_piecewise(model);
@@ -133,8 +145,8 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
     fWo  = fopen(Wo_out_name,"wb"); 
   
     if synth_phase
-     Hm_out_name = sprintf("%s_hm.out", output_prefix);
-     fhm = fopen(Hm_out_name,"wb"); 
+      Hm_out_name = sprintf("%s_hm.out", output_prefix);
+      fhm = fopen(Hm_out_name,"wb"); 
     end
 
     for f=1:frames
@@ -186,14 +198,8 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin)
     end
   end
 
-  if fit_order == 0;
-    for f=1:frames
-      surface(f,:) -= mean(surface(f,:));
-    end
-  end
-
-  if fit_order == 1
-    surface = slope_and_mean_removal(surface);
+  for f=1:frames
+    surface(f,:) -= mean(surface(f,:));
   end
 
   printf("\n")
@@ -225,7 +231,7 @@ endfunction
 % Basic unquantised rate K linear sampling then back to rate L.  Used for generating 
 % training vectors and testing vector quntisers.
 
-function [model_ rate_K_surface] = experiment_const_freq(model, fit_order, vq_type, vq_filename)
+function [model_ rate_K_surface] = experiment_const_freq(model, vq_type, vq_filename, vq_search="mse")
   melvq;
   [frames nc] = size(model);
   Fs = 8000;
@@ -235,6 +241,14 @@ function [model_ rate_K_surface] = experiment_const_freq(model, fit_order, vq_ty
   rate_K_sample_freqs_kHz = [0.1:0.1:4];
   K = length(rate_K_sample_freqs_kHz);
 
+  % optional full band VQ
+
+  if strcmp(vq_type, "vq")
+    quant_en = 1;
+    x = load(vq_filename); vq = x.vq;
+    [vq_rows vq_cols] = size(vq); vq_st = 1; vq_en = vq_cols;
+  end
   if strcmp(vq_type, "vql")
     quant_en = 1;
     x = load(vq_filename); vq = x.vq;
@@ -256,42 +270,35 @@ function [model_ rate_K_surface] = experiment_const_freq(model, fit_order, vq_ty
   rate_K_surface = resample_const_rate_f(model, rate_K_sample_freqs_kHz, Fs);
 
   rate_K_surface_fit = zeros(frames,K);
-  b = slope = zeros(1,frames);
-
-  if fit_order == 0
-    for f=1:frames
-      b(f) = mean(rate_K_surface(f,:));
-      rate_K_surface_fit(f,:) = rate_K_surface(f,:) - b(f);
-    end
-  end
+  b = zeros(1,frames);
 
-  if fit_order == 1
-    for f=1:frames
-      [aslope ab] = linreg(1:K, rate_K_surface(f,:), K);
-      rate_K_surface_fit(f,:) = rate_K_surface(f,:) - aslope*(1:K) - ab;
-      slope(f) = aslope; b(f) = ab;
-    end
+  for f=1:frames
+    b(f) = mean(rate_K_surface(f,:));
+    rate_K_surface_fit(f,:) = rate_K_surface(f,:) - b(f);
   end
-
   % optional vector quantise
   
   if quant_en
  
     rate_K_surface_fit_ = rate_K_surface_fit;
-    res = zeros(frames,vq_cols); ind = [];
+    res = zeros(frames, vq_cols); ind = [];
 
     for f=1:frames
       target = rate_K_surface_fit(f, vq_st:vq_en);
 
-      [diff_weighted weights error g mn_ind] = search_vq_weighted(target, vq);
-      if (f>=73) && (f<=75)
-        printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f\n", f, mn_ind, g(mn_ind), error(mn_ind));
+      if strcmp(vq_search, "mse")
+        [idx contrib errors test_ g mg sl] = vq_search_mse(vq, target);
+        rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
       end
-      rate_K_surface_fit_(f, vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
 
-      res(f,vq_st:vq_en) = rate_K_surface_fit(f,vq_st:vq_en) - rate_K_surface_fit_(f,vq_st:vq_en);
-      %res(f,vq_st:vq_en) = diff_weighted(mn_ind,:);
-      ind = [ind mn_ind];
+      if strcmp(vq_search, "slope")
+        [idx contrib errors test_ g mg sl] = vq_search_slope(vq, target);
+        rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+      end
+      
+      res(f, vq_st:vq_en) = target - contrib;
+      ind = [ind idx];
     end
     
     figure(fg++); clf; mesh(res);
@@ -304,7 +311,7 @@ function [model_ rate_K_surface] = experiment_const_freq(model, fit_order, vq_ty
   end
 
   for f=1:frames
-    rate_K_surface_(f,:) = rate_K_surface_fit_(f,:) + slope(f)*(1:K) + b(f);
+    rate_K_surface_(f,:) = rate_K_surface_fit_(f,:) + b(f);
   end
 
   [model_ AmdB_] = resample_rate_L(model, rate_K_surface_, rate_K_sample_freqs_kHz, Fs);
@@ -313,16 +320,13 @@ function [model_ rate_K_surface] = experiment_const_freq(model, fit_order, vq_ty
   % in the rate K <-> L transition.  Can optionally plot distorted
   % frames
 
-  plot_sd_thresh = 10;
+  plot_sd_thresh = 5;
   sd = zeros(1,frames);
   for f=1:frames
     Wo = model(f,1);
     L = model(f,2);
     AmdB = 20*log10(model(f,3:(L+2)));
     sd(f) = std(AmdB(1:L) - AmdB_(f,1:L));
-    if (f>=73) && (f<=75)
-      printf("f: %d sdL: %3.2f\n", f, sd(f));
-    end
     if (sd(f) > plot_sd_thresh) && (fg < 10)
       printf("fg: %d f: %d\n", fg, f);
       figure(fg++); clf; plot((1:L)*Wo*4/pi, AmdB(1:L),'b+-'); hold on; plot((1:L)*Wo*4/pi, AmdB_(f,1:L),'r+-');
index 3b9d29d8a001be0e2903c0f12ea5dc42ead44d23..82c98188a5eff31b8ebe41277bbaa260dc5a19a0 100644 (file)
 %   octave:14> newamp1_fbf("../build_linux/src/hts1a",50)
 
 
-function newamp1_fbf(samname, f=10, varargin)
+function newamp1_fbf(samname, f=73, varargin)
   more off;
 
   newamp;
   melvq;
 
   Fs = 8000; rate_K_sample_freqs_kHz = [0.1:0.1:4]; K = length(rate_K_sample_freqs_kHz);
-  quant_en = 0;
+  quant_en = 0; vq_search = "mse";
 
+  % optional full band VQ
+
+  ind = arg_exists(varargin, "vq");
+  if ind
+    quant_en = 1;
+    vq_filename = varargin{ind+1};
+    x = load(vq_filename); vq = x.vq;
+    [vq_rows vq_cols] = size(vq); vq_st = 1; vq_en = vq_cols;
+  end
+  
   % optional split VQ low freq quantiser
 
   ind = arg_exists(varargin, "vql");
@@ -44,12 +54,24 @@ function newamp1_fbf(samname, f=10, varargin)
     [vq_rows vq_cols] = size(vq); vq_st = 11; vq_en = K;
   end
 
+  % different vq search algorithms
+
+  ind = arg_exists(varargin, "vq_search");
+  if ind
+    vq_search = varargin{ind+1};
+  end
+
   fit_order = 0;
   ind = arg_exists(varargin, "noslope");
   if ind
     fit_order = 1;
   end
 
+  if quant_en
+    printf("quant_en: %d vq_filename: %s vq_st: %d vq_en: %d vq_search: %s\n", 
+           quant_en, vq_filename, vq_st, vq_en, vq_search);
+  end
+
   % load up text files dumped from c2sim ---------------------------------------
 
   sn_name = strcat(samname,"_sn.txt");
@@ -60,14 +82,6 @@ function newamp1_fbf(samname, f=10, varargin)
   model = load(model_name);
   [frames tmp] = size(model);
 
-  voicing_name = strcat(samname,"_pitche.txt");
-  voicing = zeros(1,frames);
-  
-  if exist(voicing_name, "file") == 2
-    pitche = load(voicing_name);
-    voicing = pitche(:, 3);
-  end
-
   % Keyboard loop --------------------------------------------------------------
 
   k = ' ';
@@ -78,15 +92,13 @@ function newamp1_fbf(samname, f=10, varargin)
     Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am);
     Am_freqs_kHz = (1:L)*Wo*4/pi;
 
+    % remove constant gain term
+
     rate_K_vec = resample_const_rate_f(model(f,:), rate_K_sample_freqs_kHz, Fs);
     if fit_order == 0
       slope = 0; b = mean(rate_K_vec); 
       rate_K_vec_fit = rate_K_vec - b;
     end
-    if fit_order == 1
-      [slope b] = linreg(1:K, rate_K_vec, K);
-      rate_K_vec_fit = rate_K_vec - slope*(1:K) - b;
-    end
 
     % plots ----------------------------------
   
@@ -99,67 +111,40 @@ function newamp1_fbf(samname, f=10, varargin)
     if quant_en
       target = rate_K_vec_fit(vq_st:vq_en);
       
-      [diff_weighted weights error g mn_ind] = search_vq_weighted(target, vq);
-      rate_K_vec_fit_ = rate_K_vec_fit;
-      rate_K_vec_fit_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
-      rate_K_vec_ = slope*(1:K) + rate_K_vec_fit_ + b;
+      if strcmp(vq_search, "mse")
+        [idx contrib errors test_ g mg sl] = vq_search_mse(vq, target);
+        rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+      end
+
+      if strcmp(vq_search, "slope")
+        [idx contrib errors test_ g mg sl] = vq_search_slope(vq, target);
+        rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+      end
+
+      rate_K_vec_ = rate_K_vec_fit; rate_K_vec_(vq_st:vq_en) = contrib;
+      rate_K_vec_ += b;
       [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec_, rate_K_sample_freqs_kHz, Fs);
       AmdB_ = AmdB_(1:L);
 
       sdL = std(AmdB - AmdB_);
-      printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f sdL: %3.2f\n", 
-             f, mn_ind, g(mn_ind), error(mn_ind), sdL);
+      %printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f sdL: %3.2f\n", 
+      %       f, mn_ind, g(mn_ind), error(mn_ind), sdL);
 
-      plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff_weighted(mn_ind,:), ";diff;k+-");
+      plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, target - contrib, ";diff;k+-");
       plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
       hold off;
 
-      figure (4); clf; 
-      plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, weights, ";weights;k+-");  
-      axis([0 4000 0 max(weights)]);
-
-      figure (5); clf; plot(error);
-
-      % sort and plot top m matches
-
-      figure(3); clf;
-      m = 4;
-      [error_list index_list] = sort(error);
-
-      mse_list = error_list(1:m);
-      index_list = index_list(1:m);
-      for i=1:m
-        subplot(sqrt(m),sqrt(m),i);
-        indx = index_list(i);
-        y_offset = g(indx) + b;
-        if quant_en == 2
-           y_offset = 0;
-        end
-        l = sprintf("b+-;ind %d g %3.2f sd %3.2f;",indx, g(indx), error(indx));
-        plot(target + y_offset,l);
-        hold on;
-        if index_list(i) == mn_ind
-          plot(vq(indx,:) + y_offset,'r-+');
-        else
-          plot(vq(indx,:) + y_offset,'g+-');
-        end
-        if quant_en != 2
-          plot(diff_weighted(indx,:), "ko-");
-        end
-        hold off;
-      end
     end
 
     % interactive menu ------------------------------------------
 
-    printf("\rframe: %d  menu: n-next  b-back  q-quit  m-show_quant[%d] o-fit order[%d]", f, quant_en, fit_order);
+    printf("\rframe: %d  menu: n-next  b-back  q-quit  m-show_quant[%d]", f, quant_en);
     fflush(stdout);
     k = kbhit();
 
     if k == 'm'
       quant_en++;
-      if quant_en > 2
+      if quant_en == 2
         quant_en = 0;
       end
     endif