better weighting function, fbf on hts1a, hts2a, vk5qi looks gd
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 27 Jun 2017 05:45:35 +0000 (05:45 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 27 Jun 2017 05:45:35 +0000 (05:45 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3260 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/newamp1_fbf.m

index a72580c827cb7e7f436235abe2f5fd6bc0e5bfb4..d9d6a12822d8bcad501bd7db7ebd6bb8f6be3994 100644 (file)
@@ -83,45 +83,64 @@ function newamp1_fbf(samname, f=10, varargin)
     axis([1 4000 -20 80]);
     hold on;
     plot(rate_K_sample_freqs_kHz*1000, rate_K_vec, ";rate K;b+-");
-    if quant_en != 2
-      plot(rate_K_sample_freqs_kHz*1000, maskdB, ";mask;c+-");
-    end
+    %if quant_en != 2
+    %  plot(rate_K_sample_freqs_kHz*1000, maskdB, ";mask;c+-");
+    %end
     if quant_en == 2
       plot(rate_K_sample_freqs_kHz*1000, maskdB-rate_K_vec, ";maskdB - rate K;m+-");
     end
+    #{
     masked_indx = find(maskdB >= rate_K_vec);
     unmasked_indx = find(maskdB < rate_K_vec);
+    masked_indx = (vq_en-5:vq_en);
+    unmasked_indx = (vq_st:vq_en-6);
     stem(rate_K_sample_freqs_kHz(unmasked_indx)*1000, 10*ones(1,length(unmasked_indx)), ";unmasked_index;ko-");
+    #}
 
     if quant_en
       error = g = zeros(1, vq_rows);
 
       % find mse for each vector
 
-      target = rate_K_vec(vq_st:vq_en);
-      masked_indx = find(maskdB(vq_st:vq_en) >= rate_K_vec(vq_st:vq_en));
-      diff = diff_mask = zeros(vq_rows, vq_cols);
+      target = rate_K_vec_no_mean(vq_st:vq_en);
+      weight_gain = 0.1;
+      %masked_indx = find(maskdB(vq_en-5:vq_en) >= rate_K_vec(vq_en-5:vq_en));
+      %masked_indx = find(masked_indx > (vq_cols-5))
+      diff =  weights = diff_weighted = zeros(vq_rows, vq_cols);
       for i=1:vq_rows
+
+        % work out gain for best match
+
         g(i) = sum(target - vq(i,:))/vq_cols;
+
+        % Find weighted difference.  This allocated more importance
+        % (error) to samples with higher energy, and stops really low
+        % level harmonics from having any impact.  Note addition in dB
+        % is multiplication in linear
+
         diff(i,:) = target - vq(i,:) - g(i);
-        diff_mask(i,:) = diff(i,:);
-        %masked_indx
-        diff_mask(i,masked_indx) = 0;
-        error(i) = sum(abs(diff_mask(i,:)));
+        weights(i,:) = max(0.1,weight_gain .* (target + 20));
+        
+        diff_weighted(i,:) = diff(i,:) .* weights(i,:);
+
+        error(i) = sum(abs(diff_weighted(i,:)));
       end
 
       [mn mn_ind] = min(error);
 
-      rate_K_vec_ = rate_K_vec;
-      rate_K_vec_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
+      rate_K_vec_no_mean_ = rate_K_vec_no_mean;
+      rate_K_vec_no_mean_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
+      rate_K_vec_ = rate_K_vec_no_mean_ + mean(rate_K_vec);
       [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec_, rate_K_sample_freqs_kHz, Fs);
       AmdB_ = AmdB_(1:L);
       if quant_en == 2
-        plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff(mn_ind,:), ";diff;k+-");
+        plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff_weighted(mn_ind,:), ";diff;k+-");
       end
       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(mn_ind,:), ";weights;k+-");
+
       % sort and plot top m matches
 
       figure(3); clf;
@@ -133,16 +152,17 @@ function newamp1_fbf(samname, f=10, varargin)
       for i=1:m
         subplot(sqrt(m),sqrt(m),i);
         indx = index_list(i);
-        plot(target,'b+-');
+        plot(target + mean(rate_K_vec),'b+-');
         hold on;
         if index_list(i) == mn_ind
-          plot(vq(indx,:) + g(indx),'r+-');
+          plot(vq(indx,:) + g(indx) + mean(rate_K_vec),'r+-');
         else
-          plot(vq(indx,:) + g(indx),'g+-');
+          plot(vq(indx,:) + g(indx) + mean(rate_K_vec),'g+-');
         end
         plot(diff(indx,:), ";diff;k+-");
-        plot(diff_mask(indx,:), ";diff;ko-");
+        plot(diff_weighted(indx,:), ";weighted diff;ko-");
         hold off;
+        legend("location", "southwest");
       end
     end