From: drowe67 Date: Tue, 18 Jul 2017 22:09:39 +0000 (+0000) Subject: high order vq search functions X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=6cc04c540864b4b0490b01d4c2627fc06ef1f36d;p=freetel-svn-tracking.git high order vq search functions git-svn-id: https://svn.code.sf.net/p/freetel/code@3311 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/vq_search_gain.m b/codec2-dev/octave/vq_search_gain.m new file mode 100644 index 00000000..ee0096d7 --- /dev/null +++ b/codec2-dev/octave/vq_search_gain.m @@ -0,0 +1,43 @@ +%---------------------------------------------------------------------- +% abs() search with a linear gain term + +function [idx contrib errors test_ g mg sl] = vq_search_gain(vq, data) + + [nVec nCols] = size(vq); + nRows = rows(data); + + error = zeros(1,nVec); + g = zeros(nRows, nVec); + diff = zeros(nVec, nCols); + errors = zeros(1, nRows); + idx = zeros(1, nRows); + contrib = zeros(nRows, nCols); + test_ = zeros(nVec, nCols); + weights = ones(1,nCols); + %weights(nCols-10+1:nCols) = 0.25; + + for f=1:nRows + target = data(f,:); + for i=1:nVec + % work out gain for best match + + g(f, i) = (sum(target) - sum(vq(i,:)))/nCols; + diff(i,:) = target - vq(i,:) - g(f, i); + diff(i,:) .* weights; + + % abs in dB is MSE in linear + + error(i) = mean(abs(diff(i,:))); + + %printf("f: %d i: %d g: %f error: %f\n", f, i, g(f, i), error(i)); + end + [mn min_ind] = min(error); + + idx(f) = min_ind; + + errors(f) = mn; + contrib(f,:) = test_(f,:) = vq(min_ind,:) + g(f,min_ind); + end + mg = 1; sl = 0; +endfunction + diff --git a/codec2-dev/octave/vq_search_mse.m b/codec2-dev/octave/vq_search_mse.m new file mode 100644 index 00000000..1d652b53 --- /dev/null +++ b/codec2-dev/octave/vq_search_mse.m @@ -0,0 +1,26 @@ +% standard mean squared error search + +function [idx contrib errors test_ g mg sl] = vq_search_mse(vq, data) + [nVec nCols] = size(vq); + nRows = rows(data); + + error = zeros(1,nVec); + errors = zeros(1, nRows); + idx = zeros(1, nRows); + contrib = zeros(nRows, nCols); + test_ = zeros(nVec, nCols); + + for f=1:nRows + target = data(f,:); + for i=1:nVec + diff = target - vq(i,:); + error(i) = diff * diff'; + end + [mn min_ind] = min(error); + errors(f) = mn; idx(f) = min_ind; contrib(f,:) = vq(min_ind,:); + test_(f,:) = vq(min_ind,:); + end + + g = 0; mg = 1; sl = 0; % dummys for this function +endfunction + diff --git a/codec2-dev/octave/vq_search_sg.m b/codec2-dev/octave/vq_search_sg.m new file mode 100644 index 00000000..a1040561 --- /dev/null +++ b/codec2-dev/octave/vq_search_sg.m @@ -0,0 +1,46 @@ +%---------------------------------------------------------------------- +% abs() search with a linear and slope term + +function [idx contrib errors test_ g mg sl] = vq_search_slope(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)]; + + for f=1:nRows + target = data(f,:); + %target = 2*vq(1,:)+1; + + 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)); + 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); + end + +endfunction diff --git a/codec2-dev/octave/vq_search_slope.m b/codec2-dev/octave/vq_search_slope.m new file mode 100644 index 00000000..9752678e --- /dev/null +++ b/codec2-dev/octave/vq_search_slope.m @@ -0,0 +1,55 @@ +%---------------------------------------------------------------------- +% abs() search with a linear, ampl scaling, and slope term + +function [idx contrib errors test_ g mg sl] = vq_search_slope(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 = zeros(3,3,nVec); + for i=1:nVec + A(:,:,i) = [sum(vq(i,:)) nCols sum(1:nCols); ... + vq(i,:)*vq(i,:)' sum(vq(i,:)) (1:nCols)*vq(i,:)'; ... + (1:nCols)*vq(i,:)' sum(1:nCols) (1:nCols)*(1:nCols)']; + end + + for f=1:nRows + target = data(f,:); + %target = 2*vq(1,:)+1; + + for i=1:nVec + c = [sum(target) target*vq(i,:)' target*(1:nCols)']'; + b = inv(A(:,:,i))*c; + + %b(1) = quantise([0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0], b(1)); + %b(3) = quantise([-1.0 -0.5 0.0 0.5 1.0], b(3)); + %b(1) = quantise([0.8 1.2], b(1)); + %b(3) = quantise([-0.2 0.2], b(3)); + mg(f,i) = b(1); g(f,i) = b(2); sl(f,i) = b(3); + + diff(i,:) = target - (mg(f,i)*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)); + end + + [mn min_ind] = min(error); + errors(f) = mn; + idx(f) = min_ind(1); + + contrib(f,:) = test_(f,:) = mg(f,min_ind)*vq(min_ind,:) + g(f,min_ind) + sl(f,min_ind)*(1:nCols); + end + +endfunction