found bug with using mask for interpolation when decimating in time, replaced with...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 17 Mar 2016 08:00:40 +0000 (08:00 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 17 Mar 2016 08:00:40 +0000 (08:00 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2749 01035d8c-6547-0410-b346-abe4f91aad63

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

index 597ef007e4c7ee5bcf0bd7462ba5a980327d8045..1f0b4e8fb025796e6238c59fab9bfbd5985883d6 100644 (file)
@@ -137,7 +137,7 @@ endfunction
 
 function [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz, freq_quant, amp_quant)
 
-    Nsamples = 4;
+    Nsamples = 3;
 
     % search range
 
@@ -215,7 +215,7 @@ function [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask
      
       % then quantise differences
 
-      for i=2:4
+      for i=2:Nsamples
         targ = masker_freqs_kHz(i) - masker_freqs_kHz(i-1);
         [q_freq abits] = quantise(0.2:0.2:1.6, targ);
         bits = [bits abits];
@@ -234,7 +234,7 @@ function [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask
       % Fit straight line
 
       f = masker_freqs_kHz*1000;
-      [gradient intercept] = linreg(f, masker_amps_dB, 4);
+      [gradient intercept] = linreg(f, masker_amps_dB, Nsamples);
       % use quantised gradient to take into account quantisation
       % errors in rest of quantisation
 
@@ -273,7 +273,7 @@ function [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask
 
       masker_amps_dB_lin_delta_ = zeros(4,1);
       if amp_quant == 1
-        for i=1:4
+        for i=1:Nsamples
           masker_amps_dB_lin_delta_(i) = quantise(-21:3:21, masker_amps_dB_lin_delta(i));
           printf("dlin: %f dlin_: %f\n", masker_amps_dB_lin_delta(i), masker_amps_dB_lin_delta_(i));
           % masker_amps_dB_lin_delta_(i) = masker_amps_dB_lin_delta(i);
@@ -287,7 +287,7 @@ function [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask
 
     if 0
     printf("\n");
-    for i=1:4
+    for i=1:Nsamples
       printf("freq: %f amp: %f\n", masker_freqs_kHz(i), masker_amps_dB(i));
     end
     end
@@ -450,37 +450,49 @@ endfunction
 
 % decimate frame rate of mask, use linear interpolation in the log domain 
 
-function maskdB_ = decimate_frame_rate(maskdB, model, decimate, f, frames, mask_sample_freqs_kHz)
+function maskdB_ = decimate_frame_rate(model, decimate, f, frames, mask_sample_freqs_kHz)
     max_amp = 80;
 
     Wo = model(f,1);
     L = min([model(f,2) max_amp-1]);
 
-    if (mod(f-1,decimate) && (f < (frames-decimate)))
+    % determine frames that bracket the one we need to interp
 
-      % determine frames that bracket the one we need to interp
+    left_f = decimate*floor((f-1)/decimate)+1; 
+    right_f = left_f + decimate;
+    if right_f > frames
+      right_f = left_f;
+    end
 
-      left_f = decimate*floor(f/decimate)+1; 
-      right_f = decimate*ceil(f/decimate)+1;
+    % determine fraction of each frame to use
 
-      % determine fraction of each frame to use
+    left_fraction  = 1 - mod((f-1),decimate)/decimate;
+    right_fraction = 1 - left_fraction;
 
-      right_fraction  = mod(f-1,decimate)/decimate;
-      left_fraction = 1 - right_fraction;
+    printf("f: %d left_f: %d right_f: %d left_fraction: %f right_fraction: %f \n", f, left_f, right_f, left_fraction, right_fraction)
 
-      printf("f: %d left_f: %d right_f: %d left_fraction: %f right_fraction: %f \n",f,left_f,right_f,left_fraction,right_fraction)
+    % fit splines to left and right masks
 
-      % determine mask for left and right frames, sampling at Wo for this frame
+    left_Wo = model(left_f,1);
+    left_L = min([model(left_f,2) max_amp-1]);
+    left_AmdB = 20*log10(model(left_f,3:(left_L+2)));
+    left_mask_sample_freqs_kHz = (1:left_L)*left_Wo*4/pi;
 
-      mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
-      maskdB_left = resample_mask(model, left_f, mask_sample_freqs_kHz);
-      maskdB_right = resample_mask(model, right_f, mask_sample_freqs_kHz);
+    right_Wo = model(right_f,1);
+    right_L = min([model(right_f,2) max_amp-1]);
+    right_AmdB = 20*log10(model(right_f,3:(right_L+2)));
+    right_mask_sample_freqs_kHz = (1:right_L)*right_Wo*4/pi;
 
-      maskdB_ = left_fraction*maskdB_left + right_fraction*maskdB_right;
-    else
-      printf("\n");
-      maskdB_ = maskdB;
-    end
+    maskdB_left_pp = splinefit(left_mask_sample_freqs_kHz, left_AmdB, left_L);
+    maskdB_right_pp = splinefit(right_mask_sample_freqs_kHz, right_AmdB, right_L);
+
+    % determine mask for left and right frames, sampling at Wo for this frame
+
+    mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
+    maskdB_left = ppval(maskdB_left_pp, mask_sample_freqs_kHz);
+    maskdB_right = ppval(maskdB_right_pp, mask_sample_freqs_kHz);
+
+    maskdB_ = left_fraction*maskdB_left + right_fraction*maskdB_right;
 endfunction
 
 
index 7a8150e7966cd486a0cc0a4f8d1f5c777afff215..aeea6163449d7cc9051afa21564daa546256bb33 100644 (file)
@@ -69,28 +69,35 @@ function newamp_fbf(samname, f=10)
     end
 
     [maskdB Am_freqs_kHz] = mask_model(AmdB, Wo, L);
+    [maskdB2 Am_freqs_kHz2] = mask_model(maskdB, Wo, L);
+
     %plot(Am_freqs_kHz*1000, maskdB, 'g');
+    %plot(Am_freqs_kHz2*1000, maskdB2, 'r');
 
     % optionally plot synthesised spectrum (early simple model)
 
     if 0
       AmdB_ = maskdB;
-      AmdB_(not_masked_m) += 6;
       plot(Am_freqs_kHz*1000, AmdB_, 'g');
       plot(Am_freqs_kHz*1000, AmdB_, 'g+');
     end
 
     % decimate in frequency
 
+    if 1
     mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
     [decmaskdB masker_freqs_kHz min_error mse_log1 mse_log2] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz, freq_quant, amp_quant);
+    end
+
     figure(2)
     
     tonef_kHz = masker_freqs_kHz;
     nlm = length(tonef_kHz);
 
+    if 1
     plot(tonef_kHz*1000, zeros(1,nlm), ';AbyS Mask Freqs;bk+');
     plot(mask_sample_freqs_kHz*1000, decmaskdB, ';AbyS Mask;m');
+    end
     legend('boxoff');
     %plot(mask_sample_freqs_kHz*1000, min_error);
     hold off;