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.
42 lines
1.0 KiB
42 lines
1.0 KiB
%----------------------------------------------------------------------
|
|
% abs() search with a linear and slope term
|
|
|
|
function [idx contrib errors b_log2] = vq_search_sg(vq, data)
|
|
[nVec nCols] = size(vq);
|
|
nRows = rows(data);
|
|
|
|
idx = errors = zeros(1, nRows);
|
|
error = zeros(1, nVec);
|
|
contrib = zeros(nRows, nCols);
|
|
|
|
b_log = zeros(nVec, 2);
|
|
b_log2 = [];
|
|
|
|
k = 1:nCols;
|
|
|
|
for f=1:nRows
|
|
t = data(f,:);
|
|
|
|
for i=1:nVec
|
|
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);
|
|
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
|
|
|