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
61 lines
1.7 KiB
6 years ago
|
%----------------------------------------------------------------------
|
||
|
% 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
|