From: drowe67 Date: Tue, 27 Jun 2017 05:45:35 +0000 (+0000) Subject: better weighting function, fbf on hts1a, hts2a, vk5qi looks gd X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=e61420d6513a5a4525ae1512f363ee6a85edc345;p=freetel-svn-tracking.git better weighting function, fbf on hts1a, hts2a, vk5qi looks gd git-svn-id: https://svn.code.sf.net/p/freetel/code@3260 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/newamp1_fbf.m b/codec2-dev/octave/newamp1_fbf.m index a72580c8..d9d6a128 100644 --- a/codec2-dev/octave/newamp1_fbf.m +++ b/codec2-dev/octave/newamp1_fbf.m @@ -83,45 +83,64 @@ function newamp1_fbf(samname, f=10, varargin) axis([1 4000 -20 80]); hold on; plot(rate_K_sample_freqs_kHz*1000, rate_K_vec, ";rate K;b+-"); - if quant_en != 2 - plot(rate_K_sample_freqs_kHz*1000, maskdB, ";mask;c+-"); - end + %if quant_en != 2 + % plot(rate_K_sample_freqs_kHz*1000, maskdB, ";mask;c+-"); + %end if quant_en == 2 plot(rate_K_sample_freqs_kHz*1000, maskdB-rate_K_vec, ";maskdB - rate K;m+-"); end + #{ masked_indx = find(maskdB >= rate_K_vec); unmasked_indx = find(maskdB < rate_K_vec); + masked_indx = (vq_en-5:vq_en); + unmasked_indx = (vq_st:vq_en-6); stem(rate_K_sample_freqs_kHz(unmasked_indx)*1000, 10*ones(1,length(unmasked_indx)), ";unmasked_index;ko-"); + #} if quant_en error = g = zeros(1, vq_rows); % find mse for each vector - target = rate_K_vec(vq_st:vq_en); - masked_indx = find(maskdB(vq_st:vq_en) >= rate_K_vec(vq_st:vq_en)); - diff = diff_mask = zeros(vq_rows, vq_cols); + target = rate_K_vec_no_mean(vq_st:vq_en); + weight_gain = 0.1; + %masked_indx = find(maskdB(vq_en-5:vq_en) >= rate_K_vec(vq_en-5:vq_en)); + %masked_indx = find(masked_indx > (vq_cols-5)) + diff = weights = diff_weighted = zeros(vq_rows, vq_cols); for i=1:vq_rows + + % work out gain for best match + g(i) = sum(target - vq(i,:))/vq_cols; + + % Find weighted difference. This allocated more importance + % (error) to samples with higher energy, and stops really low + % level harmonics from having any impact. Note addition in dB + % is multiplication in linear + diff(i,:) = target - vq(i,:) - g(i); - diff_mask(i,:) = diff(i,:); - %masked_indx - diff_mask(i,masked_indx) = 0; - error(i) = sum(abs(diff_mask(i,:))); + weights(i,:) = max(0.1,weight_gain .* (target + 20)); + + diff_weighted(i,:) = diff(i,:) .* weights(i,:); + + error(i) = sum(abs(diff_weighted(i,:))); end [mn mn_ind] = min(error); - rate_K_vec_ = rate_K_vec; - rate_K_vec_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind); + rate_K_vec_no_mean_ = rate_K_vec_no_mean; + rate_K_vec_no_mean_(vq_st:vq_en) = vq(mn_ind,:) + g(mn_ind); + rate_K_vec_ = rate_K_vec_no_mean_ + mean(rate_K_vec); [model_ AmdB_] = resample_rate_L(model(f,:), rate_K_vec_, rate_K_sample_freqs_kHz, Fs); AmdB_ = AmdB_(1:L); if quant_en == 2 - plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff(mn_ind,:), ";diff;k+-"); + plot(rate_K_sample_freqs_kHz(vq_st:vq_en)*1000, diff_weighted(mn_ind,:), ";diff;k+-"); end 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(mn_ind,:), ";weights;k+-"); + % sort and plot top m matches figure(3); clf; @@ -133,16 +152,17 @@ function newamp1_fbf(samname, f=10, varargin) for i=1:m subplot(sqrt(m),sqrt(m),i); indx = index_list(i); - plot(target,'b+-'); + plot(target + mean(rate_K_vec),'b+-'); hold on; if index_list(i) == mn_ind - plot(vq(indx,:) + g(indx),'r+-'); + plot(vq(indx,:) + g(indx) + mean(rate_K_vec),'r+-'); else - plot(vq(indx,:) + g(indx),'g+-'); + plot(vq(indx,:) + g(indx) + mean(rate_K_vec),'g+-'); end plot(diff(indx,:), ";diff;k+-"); - plot(diff_mask(indx,:), ";diff;ko-"); + plot(diff_weighted(indx,:), ";weighted diff;ko-"); hold off; + legend("location", "southwest"); end end