% prevent clipping or large level variations. pf_gain of 1.2 to 1.5
% (dB) seems to work OK.
-function vec = post_filter(vec, pf_gain = 1.5, voicing)
- % rate K vector describing spectrum of current frame
+function vec = post_filter(vec, sample_freq_kHz, pf_gain = 1.5, voicing)
+ % vec is rate K vector describing spectrum of current frame
+ % lets pre-emp before applying PF. 20dB/dec over 300Hz
+
+ pre = 20*log10(sample_freq_kHz/0.3);
+ vec += pre;
levels_before_linear = 10 .^ (vec/20);
e_before = sum(levels_before_linear .^2);
% if voicing flag supplied use it apply PF just for voiced frames
- if nargin == 3
+ #{
+ if nargin == 3
if voicing
vec *= pf_gain;
end
else
vec *= pf_gain;
end
-
+ #}
+ vec *= pf_gain;
+
levels_after_linear = 10 .^ (vec/20);
e_after = sum(levels_after_linear .^2);
gain = e_after/e_before;
gaindB = 10*log10(gain);
vec -= gaindB;
+
+ vec -= pre;
endfunction
%model_ = experiment_filter(model);
%model_ = experiment_filter_dec_filter(model);
- %[model_ surface] = experiment_mel_freq(model, 1, 0);
+ %[model_ surface] = experiment_mel_freq(model, 1, 1, voicing);
model_ = experiment_dec_abys(model, 8, 1, 1, 1, voicing);
%model_ = experiment_dec_linear(model_);
% experiment to resample freq axis on mel scale, then optionally vq
-function [model_ rate_K_surface] = experiment_mel_freq(model, vq_en=0, plots=1)
+function [model_ rate_K_surface] = experiment_mel_freq(model, vq_en=0, plots=1, voicing)
[frames nc] = size(model);
K = 20;
[rate_K_surface rate_K_sample_freqs_kHz] = resample_const_rate_f_mel(model, K);
[res rate_K_surface_ ind] = mbest(train_120_vq, rate_K_surface_no_mean, m);
- % pf, needs some energy equalisation, does gd things for hts1a/hts2a
- rate_K_surface_ *= 1.2;
+ for f=1:frames
+ rate_K_surface_(f,:) = post_filter(rate_K_surface_(f,:), 1.5, voicing(f));
+ end
for f=1:frames
rate_K_surface_(f,:) += mean_f(f);
if pf_en == 1
for f=1:frames
- rate_K_surface_(f,:) = post_filter(rate_K_surface_(f,:), 1.5, voicing(f));
+ rate_K_surface_(f,:) = post_filter(rate_K_surface_(f,:), sample_freqs_kHz, 1.5, voicing(f));
end
end
best_mse = 1E32;
best_m = f+1;
- printf("%d %d\n", f+1, M+f-1);
if fixed_dec
m = f+M/2;
+ printf("%d %d %d\n", f, m, M+f);
centre_vec = surface(m,:);
sample_points = [f m f+M];
for k=1:K
best_surface_(resample_points,k) = interp1(sample_points, [left_vec(k) centre_vec(k) right_vec(k)], resample_points, "spline", 0);
end
else
+ printf("%d %d\n", f, M+f);
for m=f+1:M+f-2
% Use interpolation to construct candidate surface_ segment
end
model_ = resample_rate_L(model, best_surface_, sample_freqs_kHz);
+ figure(5);
+ plot(mean_f,'+-')
+ figure(6)
+ hist(mean_f)
endfunction