if ind
mode = varargin{ind+1};
end
-#{
- ind = arg_exists(varargin, "vq_search");
- if ind
- vq_search = varargin{ind+1};
- end
- ind = arg_exists(varargin, "vq");
- if ind
- vq_type = varargin{ind};
- vq_filename = varargin{ind+1};
- printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
- end
- ind = arg_exists(varargin, "vqh");
- if ind
- vq_type = varargin{ind};
- vq_filename = varargin{ind+1};
- printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
- end
- ind = arg_exists(varargin, "vql");
- if ind
- vq_type = varargin{ind};
- vq_filename = varargin{ind+1};
- printf("vq_type: %s vq_filename: %s vq_search: %s\n", vq_type, vq_filename, vq_search);
- end
-#}
+
ind = arg_exists(varargin, "no_output");
if ind
output = 0;
[model_ surface] = experiment_mel_freq(model, 0, 1, voicing);
end
if strcmp(mode, 'const')
- [model_ surface] = experiment_const_freq(model, varargin{:});
+ [model_ surface b_log] = experiment_const_freq(model, varargin{:});
+ ind = arg_exists(varargin, "vq_search");
+ if ind && strcmp(varargin{ind+1},"para")
+ fn = sprintf("%s_b_log.txt", output_prefix);
+ save(fn,"b_log");
+ end
end
if strcmp(mode, 'piecewise')
model_ = experiment_piecewise(model);
% Basic unquantised rate K linear sampling then back to rate L. Used for generating
% training vectors and testing vector quntisers.
-function [model_ rate_K_surface] = experiment_const_freq(model, varargin)
+function [model_ rate_K_surface b_log] = experiment_const_freq(model, varargin)
melvq;
[frames nc] = size(model);
Fs = 8000;
vq_search = "gain"; % defaul to gain search method as it's our favourite atm
nvq = 0; % number of vector quantisers
vq_start = [];
+ quant_en = 0;
+ b_log = [];
rate_K_sample_freqs_kHz = [0.1:0.1:4];
K = length(rate_K_sample_freqs_kHz);
if nvq < 2
vq_filename = avq_filename;
else
- vq_filename = [vqfilname; avq_filename];
+ vq_filename = [vq_filename; avq_filename];
end
printf("nvq %d vq_start: %d vq_filename: %s weight_en: %d\n", nvq, vq_start(nvq), avq_filename, weight_en > 0);
anind = arg_exists(varargin(ind+1:length(varargin)), "vq");
end
end
+ quant_en = arg_exists(varargin, "quant");
+
% OK start processing .....
energy = zeros(1,frames);
end
if strcmp(vq_search, "para")
- [idx contrib errors test_ g mg sl] = vq_search_para(vq, rate_K_surface_no_mean(:,vq_st:vq_en), weights);
+ [idx contrib errors b_log] = vq_search_para(vq, rate_K_surface_no_mean(:,vq_st:vq_en));
+ b_log = [b_log energy' idx'];
+
+ if quant_en
+ for f=1:frames
+ target = rate_K_surface_no_mean(f,vq_st:vq_en);
+ % recalc gain using some index
+ v = mg(f)*vq(idx(f),1:vq_cols-10);
+ g = (sum(target(1:vq_cols-10)) - sum(v))/length(target);
+ contrib(f,:) = mg(f)*vq(idx(f),:) + g;
+ contrib(f, vq_cols-4:vq_cols) += -3:-6:-30;
+ end
+ end
end
rate_K_surface_no_mean_(:, vq_st:vq_en) = contrib;
printf("rate K resampling SD: %3.2f\n", mean(sd));
figure(fg++); clf; subplot(211); plot(energy); subplot(212); plot(sd); title('sdL');
figure(fg++); clf; hist(sd);
+
endfunction
quant_en = 0; vq_search = "gain";
mask_en = 0;
nvec = 0;
- weight_en = 0;
+ weight_en = quant_en = 0;
% optional VQ
rate_K_vec = resample_const_rate_f(model(f,:), rate_K_sample_freqs_kHz, Fs);
if fit_order == 0
- slope = 0; b = mean(rate_K_vec);
- rate_K_vec_fit = rate_K_vec - b;
+ slope = 0; meanf = mean(rate_K_vec);
+ rate_K_vec_fit = rate_K_vec - meanf;
end
% plots ----------------------------------
- figure(2); clf;
- plot((1:L)*Wo*4000/pi, AmdB,";AmdB;g+-");
+ figure(2); clf;
+ l = sprintf(";rate %d AmdB;g+-", L);
+ plot((1:L)*Wo*4000/pi, AmdB, l);
axis([1 4000 -20 80]);
hold on;
plot(rate_K_sample_freqs_kHz*1000, rate_K_vec, ";rate K;b+-");
- if mask_en
+ % default to the ideal
+
+ rate_K_vec_ = rate_K_vec_fit;
+
+ if mask_en && nvec
% experimental masking stuff that I can't seem to get to work
maskdB = determine_mask(rate_K_vec, rate_K_sample_freqs_kHz, rate_K_sample_freqs_kHz, bark_model=1);
plot(rate_K_sample_freqs_kHz*1000, maskdB, ";mask dB;c+-");
end
- if mask_en
- target = rate_K_vec;
- mask_thresh = 3;
- ind = find (maskdB - target > mask_thresh);
- target(ind) = maskdB(ind) - mask_thresh;
- plot(rate_K_sample_freqs_kHz*1000, target, ";target;m+-");
- target = target(vq_st:vq_en) - b;
- else
- target = rate_K_vec_fit(vq_st:vq_en);
- end
+ if nvec
+ if mask_en
+ target = rate_K_vec;
+ mask_thresh = 3;
+ ind = find (maskdB - target > mask_thresh);
+ target(ind) = maskdB(ind) - mask_thresh;
+ plot(rate_K_sample_freqs_kHz*1000, target, ";target;m+-");
+ target = target(vq_st:vq_en) - b;
+ else
+ target = rate_K_vec_fit(vq_st:vq_en);
+ end
- weights = ones(1, vq_en - vq_st + 1);
- if weight_en
+ weights = ones(1, vq_en - vq_st + 1);
+ if weight_en
- % generate weighting. if min is 20dB and max 40dB, weight at min
- % is 1 and max 2, same for -10 to 10. So gradient = 0.05, we only
- % haveto calculate y intercept
+ % generate weighting. if min is 20dB and max 40dB, weight at min
+ % is 1 and max 2, same for -10 to 10. So gradient = 0.05, we only
+ % haveto calculate y intercept
- gradient = 0.05; yint = 1 - gradient*min(target);
- weights = gradient*target + yint;
+ gradient = 0.05; yint = 1 - gradient*min(target);
+ weights = gradient*target + yint;
+ end
end
-
+
if nvec
if strcmp(vq_search, "mse")
if strcmp(vq_search, "para")
printf("\n");
- [idx contrib errors test_ g mg sl] = vq_search_para(vq, target, weights);
+ [idx contrib errors b] = vq_search_para(vq, target);
+ if quant_en
+ % recalc gain using some index
+ g = (sum(target(1:vq_cols-10)) - sum(mg*vq(idx,1:vq_cols-10)))/length(target);
+ contrib = mg*vq(idx,:) + g;
+ contrib(vq_cols-4:vq_cols) += -3:-6:-30;
+ end
rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
% printf("g: %3.2f mg: %3.2f sl: %3.2f\n", g(idx), mg(idx), sl(idx));
end
- rate_K_vec_ = rate_K_vec_fit; rate_K_vec_(vq_st:vq_en) = contrib;
- rate_K_vec_ += b;
- [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec_, rate_K_sample_freqs_kHz, Fs);
- AmdB_ = AmdB_(1:L);
+ rate_K_vec_(vq_st:vq_en) = contrib;
- sdL = std(AmdB - AmdB_);
plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, contrib, 'm+-');
- l = sprintf(";diff sd = %3.2f;k+-", sdL);
+ l = sprintf(";diff vq sd = %3.2f;k+-", std(target - contrib));
plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, target - contrib, l);
- plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
- hold off;
end
+ % And .... back to rate L
+
+ rate_K_vec_ += meanf;
+ [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec_, rate_K_sample_freqs_kHz, Fs);
+ AmdB_ = AmdB_(1:L);
+ sdL = std(abs(AmdB - AmdB_));
+
+ plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
+ if nvec == 0
+ l = sprintf(";errorx10 sd %3.2f dB;bk+-", sdL);
+ plot((1:L)*Wo*4000/pi, 10*(AmdB - AmdB_), l);
+ end
+ hold off;
+
if weight_en
figure(3); clf;
subplot(211);
% interactive menu ------------------------------------------
- printf("\rframe: %d menu: n-next b-back q-quit w-weight[%d]", f, weight_en);
+ printf("\rframe: %d menu: n-next b-back q-quit w-quant[%d]", f, quant_en);
fflush(stdout);
k = kbhit();
if k == 'w'
- weight_en++;
- if weight_en == 2
- weight_en = 0;
+ quant_en++;
+ if quant_en == 2
+ quant_en = 0;
end
endif
if k == 'n'
%----------------------------------------------------------------------
% abs() search with a linear, ampl scaling, and slope term
-function [idx contrib errors test_ g mg sl] = vq_search_para(vq, data)
+function [idx contrib errors b_log2] = vq_search_para(vq, data)
[nVec nCols] = size(vq);
nRows = rows(data);
- g = mg = sl = zeros(nRows, nVec);
+ g = mg = sl = zeros(nRows, 1);
diff = zeros(nVec, nCols);
idx = errors = zeros(1, nRows);
error = zeros(1, nVec);
b_log = zeros(nVec, 4);
+ b_log2 = [];
for i=1:nVec
v = vq(i,:);
for i=1:nVec
v = vq(i,:);
c = [t*v' t*k2' t*k' sum(t)]';
- b = inv(A(:,:,i))*c;
+ b = inv(A(:,:,i))*c;
+ % b(1) = max(b(1),0.5);
+ % b(2) = max(b(2),-0.2); b(2) = min(b(2),0.1);
diff(i,:) = t - (b(1)*v + b(2)*k2 + b(3)*k + b(4));
b_log(i,:) = b;
error(i) = diff(i,:) * diff(i,:)';
v = vq(min_ind,:);
printf("f: %d i: %d b(1): %f b(2): %f b(3): %f b(4): %f\n", f, idx(f), b(1), b(2), b(3), b(4));
- contrib(f,:) = test_(f,:) = b(1)*v + b(2)*k2 + b(3)*k + b(4);
+ contrib(f,:) = b(1)*v + b(2)*k2 + b(3)*k + b(4);
+ b_log2 = [b_log2; b];
end
endfunction