You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.7 KiB

%----------------------------------------------------------------------
% abs() search with a linear, ampl scaling, and slope term
function [idx contrib errors b_log2] = vq_search_slope(vq, data, closed_quant_fn, open_quant_fn)
[nVec nCols] = size(vq);
nRows = rows(data);
diff = zeros(nVec, nCols);
idx = errors = zeros(1, nRows);
error = zeros(1, nVec);
contrib = zeros(nRows, nCols);
b_log = zeros(nVec, 3);
b_log2 = [];
weights = ones(1,nCols);
A = zeros(3,3,nVec);
for i=1:nVec
A(:,:,i) = [ sum(vq(i,:)) sum(1:nCols) nCols; ...
(1:nCols)*vq(i,:)' (1:nCols)*(1:nCols)' sum(1:nCols); ...
vq(i,:)*vq(i,:)' (1:nCols)*vq(i,:)' sum(vq(i,:)) ];
end
for f=1:nRows
target = data(f,:);
for i=1:nVec
c = [sum(target) target*(1:nCols)' target*vq(i,:)' ]';
b = inv(A(:,:,i))*c;
if nargin >= 3;
b = feval(closed_quant_fn,b);
end
b_log(i,:) = b;
diff(i,:) = target - (b(1)*vq(i,:) + b(2)*(1:nCols) + b(3));
error(i) = diff(i,:) * diff(i,:)';
%printf("f: %d i: %d mg: %f g: %f sl: %f error: %f\n", f, i, b(1), b(2), b(3), error(i));
end
[mn min_ind] = min(error);
errors(f) = mn;
idx(f) = min_ind(1);
b = b_log(min_ind,:);
% optional quantisation performed after error min loop
% - note we recalc gain to match energy after quantisation
if nargin == 4
b = feval(open_quant_fn, b);
b(3) = (sum(target) - sum(b(1)*vq(min_ind,:) + b(2)*(1:nCols)))/nCols;
end
printf("f: %d i: %d mg: %f sl: %f g: %f\n", f, idx(f), b(1), b(2), b(3));
b_log2(f,:) = b;
contrib(f,:) = b(1)*vq(min_ind,:) + b(2)*(1:nCols) + b(3);
end
endfunction