From 9e9ba81003aab9e04a951b73969afce21199421e Mon Sep 17 00:00:00 2001 From: drowe67 Date: Sat, 26 Apr 2014 03:24:02 +0000 Subject: [PATCH] added support for variable power of LSPs ... no sig perf improvements git-svn-id: https://svn.code.sf.net/p/freetel/code@1575 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/fuzzy_gray.m | 42 +++++++++++++++++++++++++++++++++- codec2-dev/octave/sd.m | 20 ++++++++-------- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/codec2-dev/octave/fuzzy_gray.m b/codec2-dev/octave/fuzzy_gray.m index 4bcd5cbf..f775cca9 100644 --- a/codec2-dev/octave/fuzzy_gray.m +++ b/codec2-dev/octave/fuzzy_gray.m @@ -520,8 +520,48 @@ function compare_natural_nbit_plot title('Quantiser SNR versus Eb/No') endfunction +function generate_varpower_error_files(EbNo, start_bit, end_bit, amps, error_file_name) + Fs = 25; % number of samples per second + Nsec = 15; % seconds to simulate + Ntrials = Fs*Nsec; + Nbits = end_bit - start_bit + 1; + bits_per_frame = 52; + bits_per_frame_rounded = ceil(bits_per_frame/8)*8; % c2enc uses integer number of bytes/frame + % first energy bit (after 4 voicing, 7 Wo bits) + + % normalise powers and run test + + av_pwr = (amps*amps')/length(amps); + amps_norm = amps/sqrt(av_pwr); + av_pwr2 = (amps_norm*amps_norm')/length(amps_norm) + varpower = test_varpower(EbNo, Nbits, Ntrials, amps_norm, 1); + + % construct error patterns to apply to c2enc bit stream + + varpower_errors = []; + for i=1:Ntrials + error_positions = varpower.error_log(Nbits*(i-1)+1:Nbits*i); + num_errors(i) = sum(error_positions); + varpower_errors = [varpower_errors zeros(1,start_bit-1) error_positions ... + zeros(1, bits_per_frame_rounded - Nbits - (start_bit-1))]; + end + + % save error pattern to file + + fep=fopen(error_file_name,"wb"); fwrite(fep, varpower_errors, "short"); fclose(fep); + + figure(1) + clf + hist(num_errors) +endfunction + more off; -compare_natural_nbit_plot + +generate_varpower_error_files(0, 17, 52, ones(1,36), "lsp_baseline_errors_0dB.bin") +amps = [8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 1 8 4 2 8 4 2 8 4]; +generate_varpower_error_files(0, 17, 52, amps, "lsp_varpower_errors_0dB.bin") + +%compare_natural_nbit_plot %compare_natural_gray_plot %compare_baseline_varpower_plot %compare_baseline_varpower_error_files diff --git a/codec2-dev/octave/sd.m b/codec2-dev/octave/sd.m index 4c3d13c9..efff9061 100644 --- a/codec2-dev/octave/sd.m +++ b/codec2-dev/octave/sd.m @@ -37,11 +37,6 @@ function sd(raw_filename, dump_file_prefix, f) subplot(212) plot(sd); - % now enter single step mode so we can analyse each frame - - sn_name = strcat(dump_file_prefix,"_sn.txt"); - Sn = load(sn_name); - lsp1_filename = sprintf("%s_lsp.txt", dump_file_prefix); lsp2_filename = sprintf("%s_lsp_.txt", dump_file_prefix); lsp1 = load(lsp1_filename); @@ -52,17 +47,19 @@ function sd(raw_filename, dump_file_prefix, f) weights = load(weights_filename); end + % now enter single step mode so we can analyse each frame k = ' '; do figure(2); clf; - subplot(211) - s = [ Sn(2*f-1,:) Sn(2*f,:) ]; - size(s); - plot(s); - axis([1 length(s) -20000 20000]); + plot((4000/pi)*lsp1((f-2:f+2),:)); + hold on; + plot((4000/pi)*lsp2((f-2:f+2),:),'+-'); + hold off; + + figure(3); + clf; - subplot(212); plot((1:Ndft/2)*4000/(Ndft/2), A1(f,1:(Ndft/2)),";A1;r"); axis([1 4000 -20 40]); hold on; @@ -75,6 +72,7 @@ function sd(raw_filename, dump_file_prefix, f) plot([lsp1(f,l)*4000/pi lsp1(f,l)*4000/pi], [0 -10], 'r'); plot([lsp2(f,l)*4000/pi lsp2(f,l)*4000/pi], [-10 -20], 'b'); endfor + plot(0,0,';lsp1;r'); plot(0,0,';lsp2;b'); sd_str = sprintf(";sd %3.2f dB*dB;", sd(f)); -- 2.25.1