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.
43 lines
1.0 KiB
43 lines
1.0 KiB
%----------------------------------------------------------------------
|
|
% 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
|
|
|
|
|