some refactoring of newamp simulations
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 4 Sep 2015 23:07:26 +0000 (23:07 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 4 Sep 2015 23:07:26 +0000 (23:07 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2296 01035d8c-6547-0410-b346-abe4f91aad63

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

index f10a985c3f628cb41e2a47eadd959b0cea0ea7b5..7d6a39bbd39db5975429807a894d33d396d95fe6 100644 (file)
@@ -160,13 +160,20 @@ function [decmaskdB dec_samples error_log candidate_log target_log] = make_decma
       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(min(maskdB), candidate);
         error = target - candidate;
+        mse = sum(abs(error)); % MSE in log domain
         error_log = [error_log; error];
         candidate_log = [candidate_log; candidate];
-        mse = sum(abs(error)); % MSE in log domain
         %printf("m: %d f: %f error: %f\n", m, m*Wo*4/pi, mse);
-        if (mse < min_mse)
+
+        too_close = 0;
+        for x=1:sample-1
+          if abs(dec_samples(x,2) - m) < 2
+            too_close = 1;
+          end
+        end
+
+        if (mse < min_mse) && (too_close == 0)
           min_mse = mse;
           min_mse_m = m;
           min_candidate = candidate;
@@ -178,6 +185,12 @@ function [decmaskdB dec_samples error_log candidate_log target_log] = make_decma
       %printf("sample: %d min_mse_m: %d\n", sample, min_mse_m);
     end
 
+    if 0
+      % add floor to mask - unsuccessful attempt at fixing tinkle noises
+      min_AmdB = max(dec_samples(:,1));
+      decmaskdB = max(decmaskdB, min_AmdB - 20);
+    end
+
     % simulate quantisation of amplitudes by adding some noise
 
     if 0
@@ -284,7 +297,7 @@ function maskdB = schroeder(freq_tone_kHz, mask_sample_freqs_kHz, modified_bark_
     if freq_tone_kHz <= x1
       y = y1;
     end
-    if (freq_tone_kHz > 0.5) && (freq_tone_kHz < 1.5)
+    if (freq_tone_kHz > x1) && (freq_tone_kHz < x2)
       y = grad*freq_tone_kHz + y_int;
     end
     if freq_tone_kHz >= x2
@@ -312,8 +325,8 @@ endfunction
 function maskdB = resonator(freq_tone_kHz, mask_sample_freqs_kHz)
   maskdB = zeros(1, length(mask_sample_freqs_kHz));
   for m=1:length(mask_sample_freqs_kHz)
-    maskdB(m) = -12*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m)));
-    printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m));
+    maskdB(m) = -24*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m)));
+    %printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m));
   end
 endfunction
 
index 8119a117103d8164ad1abc3022e4c85aaea9f1bd..715ca1e7b681b3f071ba97e0cf1d71b2205c26b2 100644 (file)
@@ -19,10 +19,14 @@ function newamp_batch(samname, optional_Am_out_name)
   newamp;
   more off;
 
+  max_amp = 80;
+  use_decmask = 1;
+  postfilter_en = 1;
+  decimate = 1;
+
   model_name = strcat(samname,"_model.txt");
   model = load(model_name);
   [frames nc] = size(model);
-  max_amp = 80;
 
   if nargin == 1
     Am_out_name = sprintf("%s_am.out", samname);
@@ -34,23 +38,35 @@ function newamp_batch(samname, optional_Am_out_name)
   fam = fopen(Am_out_name,"wb"); 
 
   for f=1:frames
-    
+    printf("\rframe: %d", f);
     L = min([model(f,2) max_amp-1]);
     Wo = model(f,1);
     Am = model(f,3:(L+2));
+
     AmdB = 20*log10(Am);
 
-    maskdB = mask_model(AmdB, Wo, L);
+    % find mask and decimated mask
+
     mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
-    [newmaskdB local_maxima] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
+    maskdB = mask_model(AmdB, Wo, L);
+    [decmaskdB decmasksamples] = 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);
+    if use_decmask
+      non_masked_m = decmasksamples(:,2);
+      maskdB_ = decmaskdB;
+    else
+      maskdB_ = maskdB;
+      non_masked_m = find(AmdB > maskdB);
+    end
 
     % post filter - bump up samples by 6dB, reduce mask by same level to normalise gain
 
-    maskdB_pf = newmaskdB - 6;
-    maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6;
+    if postfilter_en
+      maskdB_pf = maskdB_ - 6;
+      maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6;
+    else
+      maskdB_pf = maskdB_;
+    end
 
     if 0 
       % Early work as per blog post part 1
@@ -65,13 +81,13 @@ function newamp_batch(samname, optional_Am_out_name)
     end
 
     Am_ = zeros(1,max_amp);
-    Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20);
-    
-    % save to file
+    Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20);  % C array doesnt use A[0]
     fwrite(fam, Am_, "float32");
   end
 
   fclose(fam);
 
+  printf("\n");
+
 endfunction