%----------------------------------------------------------------------
% abs() search with a linear, ampl scaling, and slope term
-function [idx contrib errors test_ g mg sl] = vq_search_slope(vq, data)
+function [idx contrib errors b_log2] = 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);
+ 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,:)) 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)'];
+ 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 = 2*vq(1,:)+1;
for i=1:nVec
- c = [sum(target) target*vq(i,:)' target*(1:nCols)']';
+ c = [sum(target) target*(1:nCols)' target*vq(i,:)' ]';
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);
+ b(1) = max(0.5,b(1)); b(1) = min(1,b(1));
+ b_log(i,:) = b;
- diff(i,:) = target - (mg(f,i)*vq(i,:) + g(f,i) + sl(f,i)*(1:nCols));
- diff(i,:) .* weights;
+ diff(i,:) = target - (b(1)*vq(i,:) + b(2)*(1:nCols) + b(3));
+ %diff(i,nCols-5:nCols) *= 0.25;
- % abs in dB is MSE in linear
+ error(i) = diff(i,:) * diff(i,:)';
+ b_log(i,:) = b;
- 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));
+ %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);
-
- contrib(f,:) = test_(f,:) = mg(f,min_ind)*vq(min_ind,:) + g(f,min_ind) + sl(f,min_ind)*(1:nCols);
+ b = b_log(min_ind,:);
+ b_log2(f,:) = b;
+
+ printf("f: %d mg: %f sl: %f g: %f\n", f, b(1), b(2), b(3));
+ contrib(f,:) = test_(f,:) = 0.8*vq(min_ind,:) + b(2)*(1:nCols) + b(3);
end
endfunction