for m=m_st:m_en
single_mask_m = schroeder(m*Wo*4/pi, mask_sample_freqs_kHz) + AmdB(m);
candidate = max(decmaskdB, single_mask_m);
- candidate = max(min(maskdB), candidate);
error = target - candidate;
+ mse = sum(abs(error)); % MSE in log domain
error_log = [error_log; error];
candidate_log = [candidate_log; candidate];
- mse = sum(abs(error)); % MSE in log domain
%printf("m: %d f: %f error: %f\n", m, m*Wo*4/pi, mse);
- if (mse < min_mse)
+
+ too_close = 0;
+ for x=1:sample-1
+ if abs(dec_samples(x,2) - m) < 2
+ too_close = 1;
+ end
+ end
+
+ if (mse < min_mse) && (too_close == 0)
min_mse = mse;
min_mse_m = m;
min_candidate = candidate;
%printf("sample: %d min_mse_m: %d\n", sample, min_mse_m);
end
+ if 0
+ % add floor to mask - unsuccessful attempt at fixing tinkle noises
+ min_AmdB = max(dec_samples(:,1));
+ decmaskdB = max(decmaskdB, min_AmdB - 20);
+ end
+
% simulate quantisation of amplitudes by adding some noise
if 0
if freq_tone_kHz <= x1
y = y1;
end
- if (freq_tone_kHz > 0.5) && (freq_tone_kHz < 1.5)
+ if (freq_tone_kHz > x1) && (freq_tone_kHz < x2)
y = grad*freq_tone_kHz + y_int;
end
if freq_tone_kHz >= x2
function maskdB = resonator(freq_tone_kHz, mask_sample_freqs_kHz)
maskdB = zeros(1, length(mask_sample_freqs_kHz));
for m=1:length(mask_sample_freqs_kHz)
- maskdB(m) = -12*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m)));
- printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m));
+ maskdB(m) = -24*abs(log2(freq_tone_kHz/mask_sample_freqs_kHz(m)));
+ %printf("m: %d ft: %f fm: %f ft/fm: %f maskdB: %f\n", m, freq_tone_kHz, mask_sample_freqs_kHz(m), freq_tone_kHz/mask_sample_freqs_kHz(m), maskdB(m));
end
endfunction
newamp;
more off;
+ max_amp = 80;
+ use_decmask = 1;
+ postfilter_en = 1;
+ decimate = 1;
+
model_name = strcat(samname,"_model.txt");
model = load(model_name);
[frames nc] = size(model);
- max_amp = 80;
if nargin == 1
Am_out_name = sprintf("%s_am.out", samname);
fam = fopen(Am_out_name,"wb");
for f=1:frames
-
+ printf("\rframe: %d", f);
L = min([model(f,2) max_amp-1]);
Wo = model(f,1);
Am = model(f,3:(L+2));
+
AmdB = 20*log10(Am);
- maskdB = mask_model(AmdB, Wo, L);
+ % find mask and decimated mask
+
mask_sample_freqs_kHz = (1:L)*Wo*4/pi;
- [newmaskdB local_maxima] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
+ maskdB = mask_model(AmdB, Wo, L);
+ [decmaskdB decmasksamples] = make_decmask_abys(maskdB, AmdB, Wo, L, mask_sample_freqs_kHz);
- [nlm tmp] = size(local_maxima);
- non_masked_m = local_maxima(1:min(4,nlm),2);
+ if use_decmask
+ non_masked_m = decmasksamples(:,2);
+ maskdB_ = decmaskdB;
+ else
+ maskdB_ = maskdB;
+ non_masked_m = find(AmdB > maskdB);
+ end
% post filter - bump up samples by 6dB, reduce mask by same level to normalise gain
- maskdB_pf = newmaskdB - 6;
- maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6;
+ if postfilter_en
+ maskdB_pf = maskdB_ - 6;
+ maskdB_pf(non_masked_m) = maskdB_pf(non_masked_m) + 6;
+ else
+ maskdB_pf = maskdB_;
+ end
if 0
% Early work as per blog post part 1
end
Am_ = zeros(1,max_amp);
- Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20);
-
- % save to file
+ Am_(2:L) = 10 .^ (maskdB_pf(1:L-1)/20); % C array doesnt use A[0]
fwrite(fam, Am_, "float32");
end
fclose(fam);
+ printf("\n");
+
endfunction