mbest VQ working for 700b, sounds the same as Octave
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sun, 9 Aug 2015 05:51:54 +0000 (05:51 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sun, 9 Aug 2015 05:51:54 +0000 (05:51 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2265 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/melvq.m
codec2-dev/src/c2sim.c
codec2-dev/src/quantise.c
codec2-dev/src/quantise.h

index 1de92b78609a5021123dd76f51c3968075b812cd..4dbc8e033cb5fab0cec2796764f78bd4b720c0e5 100644 (file)
@@ -152,7 +152,7 @@ function ind = test_run(samplename)
   fclose(fmel_);
 end
 
-ind = test_run("cq_ref");
+ind = test_run("vk5qi");
 
 %load "../build_linux/src/all_mel.txt"
 %vq = trainvq(all_mel, 64, 3);
index 15e37fc679b9cb70ea35832dd35b8d915a05399e..1dc5af2c65251a7ef373539a6988e339035fa82c 100644 (file)
@@ -140,14 +140,15 @@ int main(int argc, char *argv[])
     int   bpf_en = 0;
     int   bpfb_en = 0;
     float bpf_buf[BPF_N+N];
-
+    float lspmelvq_mse = 0.0;
+    
     char* opt_string = "ho:";
     struct option long_options[] = {
         { "lpc", required_argument, &lpc_model, 1 },
         { "lspjnd", no_argument, &lspjnd, 1 },
         { "lspmel", no_argument, &lspmel, 1 },
         { "lspmelread", required_argument, &lspmelread, 1 },
-        { "lspmelvq", required_argument, &lspmelvq, 1 },
+        { "lspmelvq", no_argument, &lspmelvq, 1 },
         { "lsp", no_argument, &lsp, 1 },
         { "lspd", no_argument, &lspd, 1 },
         { "lspvq", no_argument, &lspvq, 1 },
@@ -649,11 +650,11 @@ int main(int argc, char *argv[])
                    f = (4000.0/PI)*lsps[i];
                    mel[i] = floor(2595.0*log10(1.0 + f/700.0) + 0.5);
                }
-
+                
                 #ifdef DUMP
                 dump_mel(mel, order);
                 #endif
-
+                
                encode_mels_scalar(mel_indexes, mel, 6);
                 #ifdef DUMP
                 dump_mel_indexes(mel_indexes, 6);
@@ -661,18 +662,24 @@ int main(int argc, char *argv[])
                //decode_mels_scalar(mel, mel_indexes, 6);
                 
                 /* read in VQed lsp-mels from octave/melvq.m */
-
+           
                 if (lspmelread) {
-                    int ret = fread(mel, sizeof(float), order, flspmel);
+                    float mel_[order];
+                    int ret = fread(mel_, sizeof(float), order, flspmel);
                     assert(ret == order);
+                    for(i=0; i<order; i++) {
+                        lspmelvq_mse += pow(mel[i] - mel_[i], 2.0);
+                        mel[i] = mel_[i];
+                    }
                 }
-                                
+                
                 if (lspmelvq) {
-                    lspmelvq_quantise(mel, mel, 6);
+                    //lspmelvq_mse += lspmelvq_quantise(mel, mel, order);
+                    lspmelvq_mse += lspmelvq_mbest_quantise(mel, mel, order, 5);
                 }
-
+        
                 /* ensure no unstable filters after quantisation */
-
+        
                 #define MEL_ROUND 10
                for(i=1; i<order; i++) {
                    if (mel[i] <= mel[i-1]+MEL_ROUND) {
@@ -681,22 +688,23 @@ int main(int argc, char *argv[])
                         i = 1;
                     }
                }
-                
+        
                for(i=0; i<order; i++) {
                    f_ = 700.0*( pow(10.0, mel[i]/2595.0) - 1.0);
                    lsps_[i] = f_*(PI/4000.0);
                }
+                
                lsp_to_lpc(lsps_, ak, order);
+                
            }
-       
+                
            if (scalar_quant_Wo_e) {
 
                e = decode_energy(encode_energy(e, E_BITS), E_BITS);
                 model.Wo = decode_Wo(encode_Wo(model.Wo, WO_BITS), WO_BITS);
                model.L  = PI/model.Wo; /* if we quantise Wo re-compute L */
            }
-
+                
            if (vector_quant_Wo_e) {
 
                /* JVM's experimental joint Wo & LPC energy quantiser */
@@ -725,7 +733,7 @@ int main(int argc, char *argv[])
         for(i=0; i<decimate-1; i++)
             model_dec[i] = model_dec[i+1];
         model_dec[decimate-1] = model;
-
+                
         if ((frames % decimate) == 0) {
             for(i=0; i<order; i++)
                 lsps_dec[decimate-1][i] = lsps_[i];
@@ -765,13 +773,7 @@ int main(int argc, char *argv[])
                 synth_one_frame(fft_inv_cfg, buf, &model_dec[i], Sn_, Pn, prede, &de_mem, gain);
                 if (fout != NULL) fwrite(buf,sizeof(short),N,fout);
             }
-                    /*
-            for(i=0; i<decimate; i++) {
-                    printf("%d Wo: %f L: %d v: %d\n", frames, model_dec[i].Wo, model_dec[i].L, model_dec[i].voiced);
-            }
-            if (frames == 4*50)
-                exit(0);
-                    */
+
             /* update memories for next frame ----------------------------*/
 
             prev_model_dec = model_dec[decimate-1];
@@ -781,7 +783,7 @@ int main(int argc, char *argv[])
        }
 
     }
-
+                
     /*----------------------------------------------------------------*\
 
                             End Main Loop
@@ -789,12 +791,15 @@ int main(int argc, char *argv[])
     \*----------------------------------------------------------------*/
 
     fclose(fin);
-
+                
     if (fout != NULL)
        fclose(fout);
 
-    if (lpc_model)
+    if (lpc_model) {
        fprintf(stderr, "SNR av = %5.2f dB\n", sum_snr/frames);
+        if (lspmelvq || lspmelread)
+            fprintf(stderr, "lspmelvq std = %3.1f Hz\n", sqrt(lspmelvq_mse/frames));
+    }
 
     if (phaseexp)
        phase_experiment_destroy(pexp);
index 261a1ccc93320b41ab127f7cfbe8bdbc32702df1..345a763e9127700ac8b2767984f0c0223d08f052 100644 (file)
@@ -535,22 +535,22 @@ void lspjvm_quantise(float *x, float *xq, int order)
 }
 
 
-/* simple (non mbest) 6th order LSP MEL VQ quantiser */
+/* simple (non mbest) 6th order LSP MEL VQ quantiser.  Returns MSE of result */
 
-void lspmelvq_quantise(float *x, float *xq, int order)
+float lspmelvq_quantise(float *x, float *xq, int order)
 {
   int i, n1, n2, n3;
-  float err[order], err2[order], err3[order];
-  float w[order], w2[order], w3[order];
+  float err[order];
   const float *codebook1 = lspmelvq_cb[0].cb;
   const float *codebook2 = lspmelvq_cb[1].cb;
   const float *codebook3 = lspmelvq_cb[2].cb;
   float tmp[order];
+  float mse;
 
   assert(order == lspmelvq_cb[0].k);
 
   n1 = find_nearest(codebook1, lspmelvq_cb[0].m, x, order);
-  
+
   for (i=0; i<order; i++) {
     tmp[i] = codebook1[order*n1+i];
     err[i] = x[i] - tmp[i];
@@ -565,17 +565,20 @@ void lspmelvq_quantise(float *x, float *xq, int order)
 
   n3 = find_nearest(codebook3, lspmelvq_cb[2].m, err, order);
 
+  mse = 0.0;
   for (i=0; i<order; i++) {
     tmp[i] += codebook3[order*n3+i];
+    err[i] = x[i] - tmp[i];
+    mse += err[i]*err[i];
   }
   
   for (i=0; i<order; i++) {
       xq[i] = tmp[i];
   }
+  return mse;
 }
 
-#ifdef __EXPERIMENTAL__
-
 #define MBEST_STAGES 4
 
 struct MBEST_LIST {
@@ -649,11 +652,11 @@ static void mbest_insert(struct MBEST *mbest, int index[], float error) {
 static void mbest_print(char title[], struct MBEST *mbest) {
     int i,j;
     
-    printf("%s\n", title);
+    fprintf(stderr, "%s\n", title);
     for(i=0; i<mbest->entries; i++) {
        for(j=0; j<MBEST_STAGES; j++)
-           printf("  %4d ", mbest->list[i].index[j]);
-       printf(" %f\n", mbest->list[i].error);
+           fprintf(stderr, "  %4d ", mbest->list[i].index[j]);
+       fprintf(stderr, " %f\n", mbest->list[i].error);
     }
 }
 
@@ -693,37 +696,32 @@ static void mbest_search(
 }
 
 
-/* 3 stage VQ LSP quantiser.  Design and guidance kindly submitted by Anssi, OH3GDD */
+/* 3 stage VQ LSP quantiser useing mbest search.  Design and guidance kindly submitted by Anssi, OH3GDD */
 
-void lspanssi_quantise(float *x, float *xq, int ndim, int mbest_entries)
+float lspmelvq_mbest_quantise(float *x, float *xq, int ndim, int mbest_entries)
 {
-  int i, j, n1, n2, n3, n4;
-  float w[LPC_ORD];
-  const float *codebook1 = lsp_cbvqanssi[0].cb;
-  const float *codebook2 = lsp_cbvqanssi[1].cb;
-  const float *codebook3 = lsp_cbvqanssi[2].cb;
-  const float *codebook4 = lsp_cbvqanssi[3].cb;
-  struct MBEST *mbest_stage1, *mbest_stage2, *mbest_stage3, *mbest_stage4;
-  float target[LPC_ORD];
+  int i, j, n1, n2, n3;
+  const float *codebook1 = lspmelvq_cb[0].cb;
+  const float *codebook2 = lspmelvq_cb[1].cb;
+  const float *codebook3 = lspmelvq_cb[2].cb;
+  struct MBEST *mbest_stage1, *mbest_stage2, *mbest_stage3;
+  float target[ndim];
+  float w[ndim];
   int   index[MBEST_STAGES];
+  float mse, tmp;
 
+  for(i=0; i<ndim; i++)
+      w[i] = 1.0;
   mbest_stage1 = mbest_create(mbest_entries);
   mbest_stage2 = mbest_create(mbest_entries);
   mbest_stage3 = mbest_create(mbest_entries);
-  mbest_stage4 = mbest_create(mbest_entries);
   for(i=0; i<MBEST_STAGES; i++)
       index[i] = 0;
   
-  compute_weights_anssi_mode2(x, w, ndim);
-
-  #ifdef DUMP
-  dump_weights(w, ndim);
-  #endif
-
   /* Stage 1 */
 
-  mbest_search(codebook1, x, w, ndim, lsp_cbvqanssi[0].m, mbest_stage1, index);
-  mbest_print("Stage 1:", mbest_stage1);
+  mbest_search(codebook1, x, w, ndim, lspmelvq_cb[0].m, mbest_stage1, index);
+  //mbest_print("Stage 1:", mbest_stage1);
 
   /* Stage 2 */
 
@@ -731,9 +729,9 @@ void lspanssi_quantise(float *x, float *xq, int ndim, int mbest_entries)
       index[1] = n1 = mbest_stage1->list[j].index[0];
       for(i=0; i<ndim; i++)
          target[i] = x[i] - codebook1[ndim*n1+i];
-      mbest_search(codebook2, target, w, ndim, lsp_cbvqanssi[1].m, mbest_stage2, index);      
+      mbest_search(codebook2, target, w, ndim, lspmelvq_cb[1].m, mbest_stage2, index);      
   }
-  mbest_print("Stage 2:", mbest_stage2);
+  //mbest_print("Stage 2:", mbest_stage2);
 
   /* Stage 3 */
 
@@ -742,35 +740,27 @@ void lspanssi_quantise(float *x, float *xq, int ndim, int mbest_entries)
       index[1] = n2 = mbest_stage2->list[j].index[0];
       for(i=0; i<ndim; i++)
          target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i];
-      mbest_search(codebook3, target, w, ndim, lsp_cbvqanssi[2].m, mbest_stage3, index);      
+      mbest_search(codebook3, target, w, ndim, lspmelvq_cb[2].m, mbest_stage3, index);      
   }
-  mbest_print("Stage 3:", mbest_stage3);
-
-  /* Stage 4 */
-
-  for (j=0; j<mbest_entries; j++) {
-      index[3] = n1 = mbest_stage3->list[j].index[2];
-      index[2] = n2 = mbest_stage3->list[j].index[1];
-      index[1] = n3 = mbest_stage3->list[j].index[0];
-      for(i=0; i<ndim; i++)
-         target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i] - codebook3[ndim*n3+i];
-      mbest_search(codebook4, target, w, ndim, lsp_cbvqanssi[3].m, mbest_stage4, index);      
+  //mbest_print("Stage 3:", mbest_stage3);
+
+  n1 = mbest_stage3->list[0].index[2];
+  n2 = mbest_stage3->list[0].index[1];
+  n3 = mbest_stage3->list[0].index[0];
+  mse = 0.0;
+  for (i=0;i<ndim;i++) {
+      tmp = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i];
+      mse += (x[i]-tmp)*(x[i]-tmp);
+      xq[i] = tmp;
   }
-  mbest_print("Stage 4:", mbest_stage4);
-
-  n1 = mbest_stage4->list[0].index[3];
-  n2 = mbest_stage4->list[0].index[2];
-  n3 = mbest_stage4->list[0].index[1];
-  n4 = mbest_stage4->list[0].index[0];
-  for (i=0;i<ndim;i++)
-      xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i] + codebook4[ndim*n4+i];
 
   mbest_destroy(mbest_stage1);
   mbest_destroy(mbest_stage2);
   mbest_destroy(mbest_stage3);
-  mbest_destroy(mbest_stage4);
+  
+  return mse;
 }
-#endif
+
 
 int check_lsp_order(float lsp[], int order)
 {
index ea4250fb87323decf1e82f629bd788776609f37f..f4c46e370b71cec6824b34fb1936a00b311de96f 100644 (file)
@@ -90,7 +90,8 @@ void lspjnd_quantise(float lsp[], float lsp_[], int order);
 void lspdt_quantise(float lsps[], float lsps_[], float lsps__prev[], int mode);
 void lspjvm_quantise(float lsps[], float lsps_[], int order);
 void lspanssi_quantise(float lsps[], float lsps_[], int order, int mbest_entries);
-void lspmelvq_quantise(float *x, float *xq, int order);
+float lspmelvq_quantise(float *x, float *xq, int order);
+float lspmelvq_mbest_quantise(float *x, float *xq, int ndim, int mbest_entries);
 
 void encode_mels_scalar(int mel_indexes[], float mels[], int order);
 void decode_mels_scalar(float mels[], int mel_indexes[], int order);