From 818555308a820b20636ed3fc00bb07c719a7e0a6 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 2 Aug 2017 05:07:27 +0000 Subject: [PATCH] sg vq search doing OK on fisrt 1khz for hts1a/hts2a/vk5qi git-svn-id: https://svn.code.sf.net/p/freetel/code@3345 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/newamp1_batch.m | 57 +++++++++++++++++++++++++------ codec2-dev/octave/vq_search_sg.m | 44 +++++++++++------------- 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/codec2-dev/octave/newamp1_batch.m b/codec2-dev/octave/newamp1_batch.m index 90935d75..b8bad7d3 100644 --- a/codec2-dev/octave/newamp1_batch.m +++ b/codec2-dev/octave/newamp1_batch.m @@ -107,9 +107,11 @@ function [surface mean_f] = newamp1_batch(input_prefix, varargin) if strcmp(mode, 'const') [model_ surface b_log] = experiment_const_freq(model, varargin{:}); ind = arg_exists(varargin, "vq_search"); - if ind && strcmp(varargin{ind+1},"para") - fn = sprintf("%s_b_log.txt", output_prefix); - save(fn,"b_log"); + if ind + if strcmp(varargin{ind+1},"para") || strcmp(varargin{ind+1},"cubic") || strcmp(varargin{ind+1},"sg") + fn = sprintf("%s_b_log.txt", output_prefix); + save(fn,"b_log"); + end end end if strcmp(mode, 'piecewise') @@ -261,7 +263,12 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin) end end - quant_en = arg_exists(varargin, "quant"); + ind = arg_exists(varargin, "vq_gain"); + if ind + avq_filename = varargin{ind+1}; + x = load(avq_filename); vq_gain = x.vq; + quant_en = 1; + end % OK start processing ..... @@ -337,8 +344,13 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin) [idx contrib errors test_ g mg sl] = vq_search_gain(vq, rate_K_surface_no_mean(:,vq_st:vq_en), weights); end + if strcmp(vq_search, "mg") + [idx contrib errors b_log] = vq_search_mg(vq, rate_K_surface_no_mean(:,vq_st:vq_en)); + end + if strcmp(vq_search, "sg") - [idx contrib errors test_ g mg sl] = vq_search_sg(vq, rate_K_surface_no_mean(:,vq_st:vq_en)); + [idx contrib errors b_log] = vq_search_sg(vq, rate_K_surface_no_mean(:,vq_st:vq_en)); + b_log = [b_log energy' idx']; end if strcmp(vq_search, "slope") @@ -351,16 +363,41 @@ function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin) if quant_en for f=1:frames + v = vq(idx(f),:); + k = 1:vq_cols; k2 = k.^2; +#{ target = rate_K_surface_no_mean(f,vq_st:vq_en); - % recalc gain using some index - v = mg(f)*vq(idx(f),1:vq_cols-10); - g = (sum(target(1:vq_cols-10)) - sum(v))/length(target); - contrib(f,:) = mg(f)*vq(idx(f),:) + g; - contrib(f, vq_cols-4:vq_cols) += -3:-6:-30; + + % search vq_gain for best match to gain coefficients + + [nr nc] = size(vq_gain); + d = g = zeros(nr,1); + for r=1:nr + %con = vq_gain(r,1)*v + vq_gain(r,2)*k2 + vq_gain(r,3)*k; + con = v + vq_gain(r,2)*k2 + vq_gain(r,3)*k; + g(r) = (sum(target) - sum(con))/vq_cols; + con += g(r); + d(r) = (target-con)*(target-con)'; + end + [dmin imin] = min(d); + b_ = vq_gain(imin,:); + printf("idx(%d): %d imin: %d b(1); %f b(2): %f b3: %f\n", f, idx(f), imin, b_(1), b_(2), b_(3)); + + % recalc contrib + + %contrib(f,:) = b_(1)*v + b_(2)*k2 + b_(3)*k + g(imin); +#} + + contrib(f,:) = v + (-1/12.5)*b_log(f,3)*k2 + b_log(f,3)*k + b_log(f, 4); end end end + if strcmp(vq_search, "cubic") + [idx contrib errors b_log] = vq_search_cubic(rate_K_surface_no_mean(:,vq_st:vq_en)); + b_log = [b_log energy' idx']; + end + rate_K_surface_no_mean_(:, vq_st:vq_en) = contrib; res(:, vq_st:vq_en) = rate_K_surface_no_mean(:, vq_st:vq_en) - contrib; ind(:,i) = idx; diff --git a/codec2-dev/octave/vq_search_sg.m b/codec2-dev/octave/vq_search_sg.m index a1040561..fc93b13f 100644 --- a/codec2-dev/octave/vq_search_sg.m +++ b/codec2-dev/octave/vq_search_sg.m @@ -1,46 +1,42 @@ %---------------------------------------------------------------------- % abs() search with a linear and slope term -function [idx contrib errors test_ g mg sl] = vq_search_slope(vq, data) +function [idx contrib errors b_log2] = vq_search_sg(vq, data) [nVec nCols] = size(vq); nRows = rows(data); - g = mg = sl = zeros(nRows, nVec); - diff = zeros(nVec, nCols); idx = errors = zeros(1, nRows); error = zeros(1, nVec); contrib = zeros(nRows, nCols); - test_ = zeros(nVec, nCols); - weights = ones(1,nCols); - - A = [sum(1:nCols) (1:nCols)*(1:nCols)'; nCols sum(1:nCols)]; + b_log = zeros(nVec, 2); + b_log2 = []; + k = 1:nCols; + for f=1:nRows - target = data(f,:); - %target = 2*vq(1,:)+1; + t = data(f,:); for i=1:nVec - c = [target*(1:nCols)' sum(target)]'; - b = inv(A(:,:,i))*c; - - g(f,i) = b(1); sl(f,i) = b(2); - - diff(i,:) = target - (vq(i,:) + g(f,i) + sl(f,i)*(1:nCols)); - diff(i,:) .* weights; - - % abs in dB is MSE in linear - - error(i) = mean(abs(diff(i,:))); - - %printf("f: %d i: %d mg: %f g: %f sl: %f error: %f\n", f, i, mg(f,i), g(f,i), sl(f,i), error(i)); + v = vq(i,:); + A = [k*k' sum(k); sum(k) nCols]; + c = [(t*k'-v*k') (sum(t)-sum(v))]'; + b = inv(A)*c; + b(1) = quantise([-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0], b(1)); + b_log(i,:) = b; + diff = t - (v + b(1)*k + b(2)); + error(i) = diff*diff'; + %printf(" i: %d error %f\n", i, error(i)); end [mn min_ind] = min(error); errors(f) = mn; idx(f) = min_ind(1); - - contrib(f,:) = test_(f,:) = vq(min_ind,:) + g(f,min_ind) + sl(f,min_ind)*(1:nCols); + b = b_log(min_ind,:); + v = vq(min_ind,:); + printf("f: %d idx: %d b(1): %f b(2): %f\n", f, idx(f), b(1), b(2)); + contrib(f,:) = v + b(1)*k + b(2); + b_log2 = [b_log2; b]; end endfunction -- 2.25.1