trying out a new analysisi by synthesis method for choosing the location of samples...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 25 Aug 2015 05:59:04 +0000 (05:59 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 25 Aug 2015 05:59:04 +0000 (05:59 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2282 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/newamp.m
codec2-dev/octave/newamp_batch.m
codec2-dev/octave/newamp_fbf.m

index c6bc3e9f10f11a6116ff175e78bd1b532c32489a..aedd37fed82249d38bda87ba464e835851b3f97c 100644 (file)
@@ -117,6 +117,49 @@ function [decmaskdB local_maxima_sort] = make_decmask(maskdB, AmdB, Wo, L, mask_
 endfunction
 
 
+% Alternative way to come up with a decimated mask model, using
+% analysis by synthesis to determine the best place to put samples.
+% Ahh, takes me back to when I was a slip of a speech coder, playing
+% with my first CELP codec!
+
+function [decmaskdB dec_samples] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz)
+
+    % band pass filter: limit search to 250 to 3800 Hz
+
+    m_st = max(1,floor((pi*250/4000)/Wo));
+    m_en = floor((pi*3800/4000)/Wo);
+
+    target = maskdB;
+    decmaskdB = zeros(1,L);
+    dec_samples = [];
+
+
+    for sample=1:4
+
+      % find best position for sample to minimise distance to target
+
+      min_mse = 1E32;
+      for m=m_st:m_en
+        single_mask_m = schroeder(m*Wo*4/pi, mask_sample_freqs_kHz) + AmdB(m);
+        candidate = max(decmaskdB, single_mask_m);
+        candidate = max(zeros(1,L), candidate);
+        error = target - candidate;
+        mse = sum(error .^ 2);
+        %printf("m: %d f: %f error: %f\n", m, m*Wo*4/pi, mse);
+        if (mse < min_mse)
+          min_mse = mse;
+          min_mse_m = m;
+          min_candidate = candidate;
+        end
+      end
+
+      decmaskdB = min_candidate;
+      dec_samples = [dec_samples; AmdB(min_mse_m) min_mse_m];
+    end
+
+endfunction
+
+
 % determine cumulative mask, using amplitude of each harmonic.  Mask is
 % sampled across L points in the linear domain
 
@@ -131,19 +174,12 @@ function maskdB = determine_mask(masker_amps_dB, masker_freqs_kHz, mask_sample_f
 end
 
 
-% Sample mask as model for Am, tweaked a bit to enhance
-% the formants:antiformant radtio, like the LPC postfilter
+% Sample mask as model for Am
 
-function [maskdB_pf Am_freqs_kHz peaks_kHz] = mask_model(AmdB, Wo, L)
+function [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L)
 
     Am_freqs_kHz = (1:L)*Wo*4/pi;
     maskdB = determine_mask(AmdB, Am_freqs_kHz, Am_freqs_kHz);
-    non_masked_m = find(maskdB < AmdB);
-    peaks_kHz = non_masked_m*Wo*4/pi;
-    maskdB_pf = maskdB;
-    %maskdB_pf = zeros(1,L);
-    %maskdB_pf(non_masked_m) = maskdB(non_masked_m) + 6;
-
 endfunction
 
 
index 62db37793cae8b18bf738bd367a6831b06bb4a8c..db432e718b667badddd9c19154c079098bbc6a6e 100644 (file)
@@ -36,7 +36,7 @@ function newamp_batch(samname)
 
     maskdB = mask_model(AmdB, Wo, L);
     mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
-    [newmaskdB local_maxima] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
+    [newmaskdB local_maxima] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
 
     [nlm tmp] = size(local_maxima);
     non_masked_m = local_maxima(1:min(4,nlm),2);
index 44a16cef6cc5029b1c6065fdb616ce07edea1aff..39e0cbde95c6b394f6a5db3668b9b9d46976b4b0 100644 (file)
@@ -14,6 +14,7 @@
 
 function newamp_fbf(samname, f)
   
+  more off;
   newamp;
 
   sn_name = strcat(samname,"_sn.txt");
@@ -51,7 +52,7 @@ function newamp_fbf(samname, f)
     plot((0:255)*4000/256, Sw(f,:),";Sw;");
 
     [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L);
-    %plot(Am_freqs_kHz*1000, maskdB, 'g');
+    plot(Am_freqs_kHz*1000, maskdB, 'g');
 
     % optionally show harmonics that are not masked
 
@@ -72,7 +73,7 @@ function newamp_fbf(samname, f)
     % estimate low rate samples
 
     mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
-    [decmaskdB local_maxima] = make_decmask(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
+    [decmaskdB local_maxima] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
     
     [nlm tmp] = size(local_maxima(:,2));
     nlm = min(nlm,4);
@@ -99,6 +100,8 @@ function newamp_fbf(samname, f)
 
     hold off;
 
+    figure(3)
+    plot(decmaskdB)
     % interactive menu
 
     printf("\rframe: %d  menu: n-next  b-back  p-png  q-quit m-all", f);