From: drowe67 Date: Fri, 4 Sep 2015 23:07:26 +0000 (+0000) Subject: some refactoring of newamp simulations X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=9d7243d8ab537c877c522bfc103017f02e272af7;p=freetel-svn-tracking.git some refactoring of newamp simulations git-svn-id: https://svn.code.sf.net/p/freetel/code@2296 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/newamp.m b/codec2-dev/octave/newamp.m index f10a985c..7d6a39bb 100644 --- a/codec2-dev/octave/newamp.m +++ b/codec2-dev/octave/newamp.m @@ -160,13 +160,20 @@ function [decmaskdB dec_samples error_log candidate_log target_log] = make_decma 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; @@ -178,6 +185,12 @@ function [decmaskdB dec_samples error_log candidate_log target_log] = make_decma %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 @@ -284,7 +297,7 @@ function maskdB = schroeder(freq_tone_kHz, mask_sample_freqs_kHz, modified_bark_ 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 @@ -312,8 +325,8 @@ endfunction 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 diff --git a/codec2-dev/octave/newamp_batch.m b/codec2-dev/octave/newamp_batch.m index 8119a117..715ca1e7 100644 --- a/codec2-dev/octave/newamp_batch.m +++ b/codec2-dev/octave/newamp_batch.m @@ -19,10 +19,14 @@ function newamp_batch(samname, optional_Am_out_name) 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); @@ -34,23 +38,35 @@ function newamp_batch(samname, optional_Am_out_name) 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 @@ -65,13 +81,13 @@ function newamp_batch(samname, optional_Am_out_name) 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