From b9cfe98494b4ddee383d41f4003c88dbaf1156cb Mon Sep 17 00:00:00 2001 From: drowe67 Date: Tue, 27 Feb 2018 02:56:36 +0000 Subject: [PATCH] wideband octave sim working again, tweaked interpolator functions git-svn-id: https://svn.code.sf.net/p/freetel/code@3403 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/c2wideband_batch.m | 6 ++++-- codec2-dev/octave/c2wideband_fbf.m | 8 ++++---- codec2-dev/octave/newamp.m | 22 +++++++++++++--------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/codec2-dev/octave/c2wideband_batch.m b/codec2-dev/octave/c2wideband_batch.m index 7a9a0006..fb61f6a8 100644 --- a/codec2-dev/octave/c2wideband_batch.m +++ b/codec2-dev/octave/c2wideband_batch.m @@ -53,7 +53,8 @@ function [surface mean_f] = c2wideband_batch(input_prefix, varargin) % defaults - synth_phase = output = 1; + synth_phase = 1; + output = 1; output_prefix = input_prefix; fit_order = 0; mode = "dct2"; @@ -133,6 +134,7 @@ function [surface mean_f] = c2wideband_batch(input_prefix, varargin) for f=1:frames_out %printf("%d ", f); Wo = model_(f,1); L = min([model_(f,2) max_amp-1]); Am = model_(f,3:(L+2)); + %Wo = model(f,1); L = min([model(f,2) max_amp-1]); Am = model(f,3:(L+2)); if Wo*L > pi printf("Problem: %d Wo*L > pi\n", f); end @@ -346,5 +348,5 @@ function [model_block_ dct2_sd qn rate_K_surface_block rate_K_surface_block_] = dct2_sd = mean(std(D-E)); rate_K_surface_block_ = idct2([sqrt(dec)*E; zeros(Nt*(dec-1), K)]); - model_block_ = resample_rate_L(model_block, rate_K_surface_block_, rate_K_sample_freqs_kHz, Fs, pad_ends=1); + model_block_ = resample_rate_L(model_block, rate_K_surface_block_, rate_K_sample_freqs_kHz, Fs, 'para'); endfunction diff --git a/codec2-dev/octave/c2wideband_fbf.m b/codec2-dev/octave/c2wideband_fbf.m index 4d687048..23a22f28 100644 --- a/codec2-dev/octave/c2wideband_fbf.m +++ b/codec2-dev/octave/c2wideband_fbf.m @@ -46,17 +46,17 @@ function c2wideband_fbf(samname, f=70, varargin) Wo = model(f,1); L = model(f,2); Am = model(f,3:(L+2)); AmdB = 20*log10(Am); Am_freqs_kHz = (1:L)*Wo*Fs2/(1000*pi); - [rate_K_vec rate_K_sample_freqs_kHz] = resample_const_rate_f_mel(model(f,:), K, Fs); + [rate_K_vec rate_K_sample_freqs_kHz] = resample_const_rate_f_mel(model(f,:), K, Fs, 'para'); % plots ---------------------------------- figure(2); clf; - plot((1:L)*Wo*Fs2/pi, AmdB,";AmdB;g+-"); + plot((1:L)*Wo*Fs2/pi, AmdB,";rate L;g+-"); axis([1 Fs2 -20 80]); hold on; - stem(rate_K_sample_freqs_kHz*1000, rate_K_vec, ";rate K;b+-"); + stem(rate_K_sample_freqs_kHz*1000, rate_K_vec, "b"); - [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec, rate_K_sample_freqs_kHz, Fs); + [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec, rate_K_sample_freqs_kHz, Fs, 'para'); AmdB_ = AmdB_(1:L); plot((1:L)*Wo*Fs2/pi, AmdB_,";AmdB;r+-"); diff --git a/codec2-dev/octave/newamp.m b/codec2-dev/octave/newamp.m index 3623d739..83e3fad4 100644 --- a/codec2-dev/octave/newamp.m +++ b/codec2-dev/octave/newamp.m @@ -486,8 +486,8 @@ function [phase Gdbfk s Aw] = determine_phase(model, f, Nfft=512, ak) Am = model(f,3:(L+2)); AmdB = 20*log10(Am); rate_L_sample_freqs_kHz = (1:L)*Wo*4/pi; - Gdbfk = interp_para(rate_L_sample_freqs_kHz, AmdB, Fs/(2*1000), sample_freqs_kHz); - + Gdbfk = interp_lanczos(rate_L_sample_freqs_kHz, AmdB, Fs/(2*1000), sample_freqs_kHz); + % Gdbfk = resample_mask(model, f, mask_sample_freqs_kHz); % optional input of aks for testing @@ -585,11 +585,11 @@ function [rate_K_vec_corrected orig_error error nasty_error_log nasty_error_m_lo % the formant. As long as we define a formant in that general % frequency area it will sound OK. - Am_freqs_kHz = (1:L)*Wo*4/pi; + Am_freqs_kHz = (1:L)*Wo*Fs/(2000*pi); % Lets see where we have made an error - error = orig_error = AmdB - AmdB_; + error = orig_error = AmdB(1:L) - AmdB_(1:L); Ncorrections = 3; % maximum number of rate K samples to correct error_thresh = 3; % only worry about errors larger than thresh @@ -633,7 +633,7 @@ endfunction % 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, pad_end=0) +function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_freqs_kHz, Fs=8000, interp_alg='lanc') max_amp = 160; K = columns(rate_K_surface); [frames col] = size(model); @@ -647,10 +647,14 @@ function [model_ AmdB_] = resample_rate_L(model, rate_K_surface, rate_K_sample_f % back down to rate L % dealing with end effects is an ongoing issue.....need a better solution - - %AmdB_(f,1:L) = interp_para(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz); - AmdB_(f,1:L) = interp_lanczos(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz); - + + if strcmp(interp_alg, 'para') + AmdB_(f,1:L) = interp_para(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz); + end + if strcmp(interp_alg, 'lanc') + AmdB_(f,1:L) = interp_lanczos(rate_K_sample_freqs_kHz, rate_K_surface(f,:), Fs/(2*1000), rate_L_sample_freqs_kHz); + end + #{ if pad_end AmdB_(f,1:L) = interp1([0 rate_K_sample_freqs_kHz Fs/2000], -- 2.25.1