From: drowe67 Date: Thu, 17 Mar 2016 08:00:40 +0000 (+0000) Subject: found bug with using mask for interpolation when decimating in time, replaced with... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=c1cb4f71082becdcaaa85575b34eb62de87f91d8;p=freetel-svn-tracking.git found bug with using mask for interpolation when decimating in time, replaced with cubic spline and much better git-svn-id: https://svn.code.sf.net/p/freetel/code@2749 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/newamp.m b/codec2-dev/octave/newamp.m index 597ef007..1f0b4e8f 100644 --- a/codec2-dev/octave/newamp.m +++ b/codec2-dev/octave/newamp.m @@ -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 diff --git a/codec2-dev/octave/newamp_fbf.m b/codec2-dev/octave/newamp_fbf.m index 7a8150e7..aeea6163 100644 --- a/codec2-dev/octave/newamp_fbf.m +++ b/codec2-dev/octave/newamp_fbf.m @@ -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;