% Take a rate K surface and convert back to time varying rate L
-function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz, Fs=8000)
+function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz, Fs=8000, pad_end=0)
max_amp = 160; K = columns(rate_K_surface);
[frames col] = size(model);
% back down to rate L
- AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz Fs/2000],
- [rate_K_surface(f,1) rate_K_surface(f,:) rate_K_surface(f,K)],
- rate_L_sample_freqs_kHz,
- "spline");
+ % dealing with end effects is an ongoing issue.....need a better solution
+
+ if pad_end
+ AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz Fs/2000],
+ [rate_K_surface(f,1) rate_K_surface(f,:) rate_K_surface(f,K)],
+ rate_L_sample_freqs_kHz,
+ "spline");
+ else
+ AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz],
+ [rate_K_surface(f,1) rate_K_surface(f,:)],
+ rate_L_sample_freqs_kHz,
+ "spline");
+ end
+
%AmdB_(f,1:L) = interp_para(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz);
%printf("f: %d %f %f %f\n", f, rate_K_sample_freqs_kHz(1), rate_L_sample_freqs_kHz(1), AmdB_(1));
model_(f,1) = Wo; model_(f,2) = L; model_(f,3:(L+2)) = 10 .^ (AmdB_(f, 1:L)/20);
synth_phase = output = 1;
output_prefix = input_prefix;
vq_type = "";
- vq_filename = "";
- fit_order = 0;
+ vq_filename = "";
+ vq_search = "mse";
mode = "const";
+ fit_order = 0;
% parse variable argument list
if ind
mode = varargin{ind+1};
end
- ind = arg_exists(varargin, "nomean");
+ ind = arg_exists(varargin, "vq_search");
if ind
- fit_order = 0;
+ vq_search = varargin{ind+1};
end
- ind = arg_exists(varargin, "noslope");
+ ind = arg_exists(varargin, "vq");
if ind
- fit_order = 1;
+ 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\n", vq_type, vq_filename);
+ 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
end
end
- printf("output_prefix: %s\nfit_order %d output: %d\n", output_prefix, fit_order, output);
+ printf("output: %d\n", output);
+ if (output)
+ printf("output_prefix: %s\n", output_prefix);
+ end
model_name = strcat(input_prefix,"_model.txt");
model = load(model_name);
[model_ surface] = experiment_mel_freq(model, 0, 1, voicing);
end
if strcmp(mode, 'const')
- [model_ surface] = experiment_const_freq(model, fit_order, vq_type, vq_filename);
+ [model_ surface] = experiment_const_freq(model, vq_type, vq_filename, vq_search);
end
if strcmp(mode, 'piecewise')
model_ = experiment_piecewise(model);
fWo = fopen(Wo_out_name,"wb");
if synth_phase
- Hm_out_name = sprintf("%s_hm.out", output_prefix);
- fhm = fopen(Hm_out_name,"wb");
+ Hm_out_name = sprintf("%s_hm.out", output_prefix);
+ fhm = fopen(Hm_out_name,"wb");
end
for f=1:frames
end
end
- if fit_order == 0;
- for f=1:frames
- surface(f,:) -= mean(surface(f,:));
- end
- end
-
- if fit_order == 1
- surface = slope_and_mean_removal(surface);
+ for f=1:frames
+ surface(f,:) -= mean(surface(f,:));
end
printf("\n")
% 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, fit_order, vq_type, vq_filename)
+function [model_ rate_K_surface] = experiment_const_freq(model, vq_type, vq_filename, vq_search="mse")
melvq;
[frames nc] = size(model);
Fs = 8000;
rate_K_sample_freqs_kHz = [0.1:0.1:4];
K = length(rate_K_sample_freqs_kHz);
+ % optional full band VQ
+
+ if strcmp(vq_type, "vq")
+ quant_en = 1;
+ x = load(vq_filename); vq = x.vq;
+ [vq_rows vq_cols] = size(vq); vq_st = 1; vq_en = vq_cols;
+ end
+
if strcmp(vq_type, "vql")
quant_en = 1;
x = load(vq_filename); vq = x.vq;
rate_K_surface = resample_const_rate_f(model, rate_K_sample_freqs_kHz, Fs);
rate_K_surface_fit = zeros(frames,K);
- b = slope = zeros(1,frames);
-
- if fit_order == 0
- for f=1:frames
- b(f) = mean(rate_K_surface(f,:));
- rate_K_surface_fit(f,:) = rate_K_surface(f,:) - b(f);
- end
- end
+ b = zeros(1,frames);
- if fit_order == 1
- for f=1:frames
- [aslope ab] = linreg(1:K, rate_K_surface(f,:), K);
- rate_K_surface_fit(f,:) = rate_K_surface(f,:) - aslope*(1:K) - ab;
- slope(f) = aslope; b(f) = ab;
- end
+ for f=1:frames
+ b(f) = mean(rate_K_surface(f,:));
+ rate_K_surface_fit(f,:) = rate_K_surface(f,:) - b(f);
end
-
+
% optional vector quantise
if quant_en
rate_K_surface_fit_ = rate_K_surface_fit;
- res = zeros(frames,vq_cols); ind = [];
+ res = zeros(frames, vq_cols); ind = [];
for f=1:frames
target = rate_K_surface_fit(f, vq_st:vq_en);
- [diff_weighted weights error g mn_ind] = search_vq_weighted(target, vq);
- if (f>=73) && (f<=75)
- printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f\n", f, mn_ind, g(mn_ind), error(mn_ind));
+ if strcmp(vq_search, "mse")
+ [idx contrib errors test_ g mg sl] = vq_search_mse(vq, target);
+ rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
end
- rate_K_surface_fit_(f, vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
- res(f,vq_st:vq_en) = rate_K_surface_fit(f,vq_st:vq_en) - rate_K_surface_fit_(f,vq_st:vq_en);
- %res(f,vq_st:vq_en) = diff_weighted(mn_ind,:);
- ind = [ind mn_ind];
+ if strcmp(vq_search, "slope")
+ [idx contrib errors test_ g mg sl] = vq_search_slope(vq, target);
+ rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+ end
+
+ res(f, vq_st:vq_en) = target - contrib;
+ ind = [ind idx];
end
figure(fg++); clf; mesh(res);
end
for f=1:frames
- rate_K_surface_(f,:) = rate_K_surface_fit_(f,:) + slope(f)*(1:K) + b(f);
+ rate_K_surface_(f,:) = rate_K_surface_fit_(f,:) + b(f);
end
[model_ AmdB_] = resample_rate_L(model, rate_K_surface_, rate_K_sample_freqs_kHz, Fs);
% in the rate K <-> L transition. Can optionally plot distorted
% frames
- plot_sd_thresh = 10;
+ plot_sd_thresh = 5;
sd = zeros(1,frames);
for f=1:frames
Wo = model(f,1);
L = model(f,2);
AmdB = 20*log10(model(f,3:(L+2)));
sd(f) = std(AmdB(1:L) - AmdB_(f,1:L));
- if (f>=73) && (f<=75)
- printf("f: %d sdL: %3.2f\n", f, sd(f));
- end
if (sd(f) > plot_sd_thresh) && (fg < 10)
printf("fg: %d f: %d\n", fg, f);
figure(fg++); clf; plot((1:L)*Wo*4/pi, AmdB(1:L),'b+-'); hold on; plot((1:L)*Wo*4/pi, AmdB_(f,1:L),'r+-');
% octave:14> newamp1_fbf("../build_linux/src/hts1a",50)
-function newamp1_fbf(samname, f=10, varargin)
+function newamp1_fbf(samname, f=73, varargin)
more off;
newamp;
melvq;
Fs = 8000; rate_K_sample_freqs_kHz = [0.1:0.1:4]; K = length(rate_K_sample_freqs_kHz);
- quant_en = 0;
+ quant_en = 0; vq_search = "mse";
+ % optional full band VQ
+
+ ind = arg_exists(varargin, "vq");
+ if ind
+ quant_en = 1;
+ vq_filename = varargin{ind+1};
+ x = load(vq_filename); vq = x.vq;
+ [vq_rows vq_cols] = size(vq); vq_st = 1; vq_en = vq_cols;
+ end
+
% optional split VQ low freq quantiser
ind = arg_exists(varargin, "vql");
[vq_rows vq_cols] = size(vq); vq_st = 11; vq_en = K;
end
+ % different vq search algorithms
+
+ ind = arg_exists(varargin, "vq_search");
+ if ind
+ vq_search = varargin{ind+1};
+ end
+
fit_order = 0;
ind = arg_exists(varargin, "noslope");
if ind
fit_order = 1;
end
+ if quant_en
+ printf("quant_en: %d vq_filename: %s vq_st: %d vq_en: %d vq_search: %s\n",
+ quant_en, vq_filename, vq_st, vq_en, vq_search);
+ end
+
% load up text files dumped from c2sim ---------------------------------------
sn_name = strcat(samname,"_sn.txt");
model = load(model_name);
[frames tmp] = size(model);
- voicing_name = strcat(samname,"_pitche.txt");
- voicing = zeros(1,frames);
-
- if exist(voicing_name, "file") == 2
- pitche = load(voicing_name);
- voicing = pitche(:, 3);
- end
-
% Keyboard loop --------------------------------------------------------------
k = ' ';
Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am);
Am_freqs_kHz = (1:L)*Wo*4/pi;
+ % remove constant gain term
+
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;
end
- if fit_order == 1
- [slope b] = linreg(1:K, rate_K_vec, K);
- rate_K_vec_fit = rate_K_vec - slope*(1:K) - b;
- end
% plots ----------------------------------
if quant_en
target = rate_K_vec_fit(vq_st:vq_en);
- [diff_weighted weights error g mn_ind] = search_vq_weighted(target, vq);
-
- rate_K_vec_fit_ = rate_K_vec_fit;
- rate_K_vec_fit_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind);
- rate_K_vec_ = slope*(1:K) + rate_K_vec_fit_ + b;
+ if strcmp(vq_search, "mse")
+ [idx contrib errors test_ g mg sl] = vq_search_mse(vq, target);
+ rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+ end
+
+ if strcmp(vq_search, "slope")
+ [idx contrib errors test_ g mg sl] = vq_search_slope(vq, target);
+ rate_K_surface_fit_(f, vq_st:vq_en) = contrib;
+ 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);
sdL = std(AmdB - AmdB_);
- printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f sdL: %3.2f\n",
- f, mn_ind, g(mn_ind), error(mn_ind), sdL);
+ %printf("f: %d mn_ind: %d g: %3.2f sdK: %3.2f sdL: %3.2f\n",
+ % f, mn_ind, g(mn_ind), error(mn_ind), sdL);
- plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff_weighted(mn_ind,:), ";diff;k+-");
+ plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, target - contrib, ";diff;k+-");
plot((1:L)*Wo*4000/pi, AmdB_,";AmdB bar;r+-");
hold off;
- figure (4); clf;
- plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, weights, ";weights;k+-");
- axis([0 4000 0 max(weights)]);
-
- figure (5); clf; plot(error);
-
- % sort and plot top m matches
-
- figure(3); clf;
- m = 4;
- [error_list index_list] = sort(error);
-
- mse_list = error_list(1:m);
- index_list = index_list(1:m);
- for i=1:m
- subplot(sqrt(m),sqrt(m),i);
- indx = index_list(i);
- y_offset = g(indx) + b;
- if quant_en == 2
- y_offset = 0;
- end
- l = sprintf("b+-;ind %d g %3.2f sd %3.2f;",indx, g(indx), error(indx));
- plot(target + y_offset,l);
- hold on;
- if index_list(i) == mn_ind
- plot(vq(indx,:) + y_offset,'r-+');
- else
- plot(vq(indx,:) + y_offset,'g+-');
- end
- if quant_en != 2
- plot(diff_weighted(indx,:), "ko-");
- end
- hold off;
- end
end
% interactive menu ------------------------------------------
- printf("\rframe: %d menu: n-next b-back q-quit m-show_quant[%d] o-fit order[%d]", f, quant_en, fit_order);
+ printf("\rframe: %d menu: n-next b-back q-quit m-show_quant[%d]", f, quant_en);
fflush(stdout);
k = kbhit();
if k == 'm'
quant_en++;
- if quant_en > 2
+ if quant_en == 2
quant_en = 0;
end
endif