updated sd.m to better visualise 700 bit/s mel quantiser issues, played with quantise...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Jun 2015 08:44:15 +0000 (08:44 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 9 Jun 2015 08:44:15 +0000 (08:44 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2177 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/sd.m
codec2-dev/octave/tcohpsk.m
codec2-dev/src/c2sim.c

index 8065de7978512deaf5a72e544d63aca550b4351c..7995a9c2ce8974b2ec847aa1b98446885f45e8a0 100644 (file)
@@ -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");
 
index 51e1e7a5e540a0f1a609658a6142510f33b47855..e6fb60fa899de0b6b8bb48935d6bd58dbf5f6ddd 100644 (file)
@@ -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');
index f5ade77646e8a93da27931a5b175299f8eed5580..29d056d4ba50a5c37eb5fdabad9d8510ce4be221 100644 (file)
@@ -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 */