From 55aed432c85e8eb5c93ec0313293f4a615b2971a Mon Sep 17 00:00:00 2001 From: drowe67 Date: Tue, 9 Jun 2015 08:44:15 +0000 Subject: [PATCH] updated sd.m to better visualise 700 bit/s mel quantiser issues, played with quantiser a bit, but no significant improvements so will run with that for now git-svn-id: https://svn.code.sf.net/p/freetel/code@2177 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/octave/sd.m | 79 +++++++++++++++++++++++++++++++------ codec2-dev/octave/tcohpsk.m | 4 +- codec2-dev/src/c2sim.c | 1 + 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/codec2-dev/octave/sd.m b/codec2-dev/octave/sd.m index 8065de79..7995a9c2 100644 --- a/codec2-dev/octave/sd.m +++ b/codec2-dev/octave/sd.m @@ -5,6 +5,10 @@ function sd(raw_filename, dump_file_prefix, f) + graphics_toolkit ("gnuplot"); + + e_filename = sprintf("%s_E.txt", dump_file_prefix); + e = load(e_filename); ak1_filename = sprintf("%s_ak.txt", dump_file_prefix); ak2_filename = sprintf("%s_ak_.txt", dump_file_prefix); ak1 = load(ak1_filename); @@ -13,7 +17,7 @@ function sd(raw_filename, dump_file_prefix, f) [ak1_r, ak1_c] = size(ak1); [ak2_r, ak2_c] = size(ak1); - frames = max([ak1_r ak2_r]); + frames = max([ak1_r ak2_r]); printf("%d frames\n", frames); sd = zeros(1,frames); Ndft = 512; A1 = zeros(frames, Ndft); @@ -21,69 +25,109 @@ function sd(raw_filename, dump_file_prefix, f) % initial helicopter view of all frames + spec_err = zeros(1, Ndft); for i = 1:frames A1(i,:) = -20*log10(abs(fft(ak1(i,:),Ndft))); A2(i,:) = -20*log10(abs(fft(ak2(i,:),Ndft))); sd(i) = sum((A1(i,:) - A2(i,:)).^2)/Ndft; + spec_err += (A1(i,:) - A2(i,:)).^2; end + spec_err /= frames; printf("sd av %3.2f dB*dB\n", sum(sd)/frames); + % work out worst frames with sig energy + + ind = find(e < 0); + sd(ind) = 0; + [largest largest_ind] = sort(sd,"descend"); + printf("largest SD frames....: %3.2f\n", largest(1:5)); + printf("largest SD frames ind: %d\n", largest_ind(1:5)); + figure(1); clf; subplot(211) fs=fopen(raw_filename,"rb"); s = fread(fs,Inf,"short"); plot(s); + axis([1 length(s) -20E3 20E3]) subplot(212) - plot(sd); - axis([1 frames 0 10]) + [a b c] = plotyy(1:frames, sd, 1:frames, e); + axis(a, [1 frames 0 10]) lsp1_filename = sprintf("%s_lsp.txt", dump_file_prefix); lsp2_filename = sprintf("%s_lsp_.txt", dump_file_prefix); lsp1 = load(lsp1_filename); lsp2 = load(lsp2_filename); + mel_filename = sprintf("%s_mel.txt", dump_file_prefix); + mel = load(mel_filename); + weights_filename = sprintf("%s_weights.txt", dump_file_prefix); if file_in_path(".",weights_filename) weights = load(weights_filename); end + figure(4) + plot(e,sd,'+') + axis([0 50 0 10]) + xlabel('LPC energy dB') + ylabel('SD dB*dB'); + + figure(5) + subplot(211) + ind = find(e > 0); + hist(sd(ind)) + subplot(212) + plot((1:Ndft)*8000/Ndft, spec_err) + axis([300 3000 0 max(spec_err)]) + % now enter single step mode so we can analyse each frame k = ' '; + largest_mode = 0; do + if largest_mode + fr = largest_ind(f); + else + fr = f; + endif + figure(2); clf; - plot((4000/pi)*lsp1((f-2:f+2),:)); + plot((4000/pi)*lsp1((fr-2:fr+2),:)); hold on; - plot((4000/pi)*lsp2((f-2:f+2),:),'+-'); + plot((4000/pi)*lsp2((fr-2:fr+2),:),'+-'); hold off; figure(3); clf; - plot((1:Ndft/2)*4000/(Ndft/2), A1(f,1:(Ndft/2)),";A1;r"); + plot((1:Ndft/2)*4000/(Ndft/2), A1(fr,1:(Ndft/2)),";A1;r"); axis([1 4000 -20 40]); hold on; - plot((1:Ndft/2)*4000/(Ndft/2), A2(f,1:(Ndft/2)),";A2;"); + plot((1:Ndft/2)*4000/(Ndft/2), A2(fr,1:(Ndft/2)),";A2;"); if file_in_path(".",weights_filename) - plot(lsp1(f,:)*4000/pi, weights(f,:),";weights;g+"); + plot(lsp1(fr,:)*4000/pi, weights(fr,:),";weights;g+"); end - for l=1:10 - 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'); + printf("\n"); + for l=1:6 + plot([lsp1(fr,l)*4000/pi lsp1(fr,l)*4000/pi], [0 -10], 'r'); + plot([lsp2(fr,l)*4000/pi lsp2(fr,l)*4000/pi], [-10 -20], 'b'); + plot([mel(fr,l) mel(fr,l)], [0 10], 'g'); + printf("%d ", mel(fr,l)); endfor + printf("\n"); plot(0,0,';lsp1;r'); plot(0,0,';lsp2;b'); - sd_str = sprintf(";sd %3.2f dB*dB;", sd(f)); + sd_str = sprintf(";sd %3.2f dB*dB;", sd(fr)); plot(0,0,sd_str); hold off; % interactive menu - printf("\rframe: %d menu: n-next b-back q-quit", f); + printf("\rframe: %d menu: n-next b-back l-largest mode q-quit", fr); fflush(stdout); k = kbhit(); if (k == 'n') @@ -93,6 +137,15 @@ function sd(raw_filename, dump_file_prefix, f) f = f - 1; endif + if (k == 'l') + if largest_mode + largest_mode = 0; + else + largest_mode = 1; + f = 1; + endif + endif + until (k == 'q') printf("\n"); diff --git a/codec2-dev/octave/tcohpsk.m b/codec2-dev/octave/tcohpsk.m index 51e1e7a5..e6fb60fa 100644 --- a/codec2-dev/octave/tcohpsk.m +++ b/codec2-dev/octave/tcohpsk.m @@ -596,9 +596,9 @@ if compare_with_c check(ch_symb_log, ch_symb_log_c, 'ch_symb',0.05); %check(ct_symb_ff_log, ct_symb_ff_log_c, 'ct_symb_ff',0.01); check(rx_amp_log, rx_amp_log_c, 'rx_amp_log',0.01); - check(phi_log_diff, zeros(length(phi_log_diff), Nc*Nd), 'rx_phi_log',0.05); + check(phi_log_diff, zeros(length(phi_log_diff), Nc*Nd), 'rx_phi_log',0.1); check(rx_symb_log, rx_symb_log_c, 'rx_symb',0.01); - check(rx_timing_log, rx_timing_log_c, 'rx_timing',0.001); + check(rx_timing_log, rx_timing_log_c, 'rx_timing',0.005); check(rx_bits_log, rx_bits_log_c, 'rx_bits'); check(f_est_log, f_est_log_c, 'f_est'); check(sig_rms_log, sig_rms_log_c, 'sig_rms'); diff --git a/codec2-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index f5ade776..29d056d4 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -529,6 +529,7 @@ int main(int argc, char *argv[]) #ifdef DUMP dump_ak(ak, order); + dump_E(e); #endif /* tracking down -ve energy values with BW expansion */ -- 2.25.1