initial attempt at getting Anssi's multi-stage VQ integrated
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 14 Sep 2012 05:19:54 +0000 (05:19 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 14 Sep 2012 05:19:54 +0000 (05:19 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@698 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/Makefile.am
codec2-dev/src/Makefile.in
codec2-dev/src/c2sim.c
codec2-dev/src/defines.h
codec2-dev/src/quantise.c
codec2-dev/src/quantise.h

index d983de95a9023ab6de88d26c4e284cf7c12a23d6..097f4ccec4a9670b947ca0b4082093e8b4fd74ee 100644 (file)
@@ -66,10 +66,10 @@ CODEBOOKSJVM= \
   $D/lspjvm2.txt \
   $D/lspjvm3.txt
 
-CODEBOOKSVQEXP= \
-  $D/lspvqexp1.txt \
-  $D/lspvqexp2.txt \
-  $D/lspvqexp3.txt
+CODEBOOKSVQANSSI= \
+  $D/lspvqanssi1.txt \
+  $D/lspvqanssi2.txt \
+  $D/lspvqanssi3.txt
 
 CODEBOOKSGE= \
   $D/gecb.txt 
@@ -82,7 +82,7 @@ codebookdt.$(OBJEXT): codebookdt.c
 codebookvq.$(OBJEXT): codebookvq.c
 codebookjnd.$(OBJEXT): codebookjnd.c
 codebookjvm.$(OBJEXT): codebookjvm.c
-codebookvqexp.$(OBJEXT): codebookvqexp.c
+codebookvqanssi.$(OBJEXT): codebookvqanssi.c
 codebookge.$(OBJEXT): codebookge.c
 
 codebook.lo: codebook.c
@@ -105,14 +105,14 @@ codebookjnd.c: generate_codebook $(CODEBOOKSJND)
 codebookjvm.c: generate_codebook $(CODEBOOKSJVM)
        ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.c
 
-codebookvqexp.c: generate_codebook $(CODEBOOKSVQEXP)
-       ./generate_codebook lsp_cbvqexp $(CODEBOOKSVQEXP) > codebookvqexp.c
+codebookvqanssi.c: generate_codebook $(CODEBOOKSVQEXP)
+       ./generate_codebook lsp_cbvqanssi $(CODEBOOKSVQANSSI) > codebookvqanssi.c
 
 codebookge.c: generate_codebook $(CODEBOOKSGE)
        ./generate_codebook ge_cb $(CODEBOOKSGE) > codebookge.c
 
 clean-local:
-       -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqexp.c
+       -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqanssi.c
 
 lib_LTLIBRARIES        = libcodec2.la
 libcodec2_la_SOURCES = dump.c \
@@ -134,7 +134,7 @@ codebookd.c \
 codebookvq.c \
 codebookjnd.c \
 codebookjvm.c \
-codebookvqexp.c \
+codebookvqanssi.c \
 codebookdt.c \
 codebookge.c 
 
index 1233e42611495f895596fa5b85c926b27a96eec5..f186e93b6746f420016f3c4d282b0ea94070c94c 100644 (file)
@@ -72,7 +72,7 @@ am_libcodec2_la_OBJECTS = libcodec2_la-dump.lo libcodec2_la-lpc.lo \
        libcodec2_la-ampexp.lo libcodec2_la-pack.lo \
        libcodec2_la-codebook.lo libcodec2_la-codebookd.lo \
        libcodec2_la-codebookvq.lo libcodec2_la-codebookjnd.lo \
-       libcodec2_la-codebookjvm.lo libcodec2_la-codebookvqexp.lo \
+       libcodec2_la-codebookjvm.lo libcodec2_la-codebookvqanssi.lo \
        libcodec2_la-codebookdt.lo libcodec2_la-codebookge.lo
 libcodec2_la_OBJECTS = $(am_libcodec2_la_OBJECTS)
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
@@ -312,10 +312,10 @@ CODEBOOKSJVM = \
   $D/lspjvm2.txt \
   $D/lspjvm3.txt
 
-CODEBOOKSVQEXP = \
-  $D/lspvqexp1.txt \
-  $D/lspvqexp2.txt \
-  $D/lspvqexp3.txt
+CODEBOOKSVQANSSI = \
+  $D/lspvqanssi1.txt \
+  $D/lspvqanssi2.txt \
+  $D/lspvqanssi3.txt
 
 CODEBOOKSGE = \
   $D/gecb.txt 
@@ -340,7 +340,7 @@ codebookd.c \
 codebookvq.c \
 codebookjnd.c \
 codebookjvm.c \
-codebookvqexp.c \
+codebookvqanssi.c \
 codebookdt.c \
 codebookge.c 
 
@@ -528,7 +528,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookjnd.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookjvm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookvq.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookvqexp.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookvqanssi.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codec2.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-dump.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-fdmdv.Plo@am__quote@
@@ -698,12 +698,12 @@ libcodec2_la-codebookjvm.lo: codebookjvm.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-codebookjvm.lo `test -f 'codebookjvm.c' || echo '$(srcdir)/'`codebookjvm.c
 
-libcodec2_la-codebookvqexp.lo: codebookvqexp.c
-@am__fastdepCC_TRUE@   if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-codebookvqexp.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebookvqexp.Tpo" -c -o libcodec2_la-codebookvqexp.lo `test -f 'codebookvqexp.c' || echo '$(srcdir)/'`codebookvqexp.c; \
-@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/libcodec2_la-codebookvqexp.Tpo" "$(DEPDIR)/libcodec2_la-codebookvqexp.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebookvqexp.Tpo"; exit 1; fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='codebookvqexp.c' object='libcodec2_la-codebookvqexp.lo' libtool=yes @AMDEPBACKSLASH@
+libcodec2_la-codebookvqanssi.lo: codebookvqanssi.c
+@am__fastdepCC_TRUE@   if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-codebookvqanssi.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebookvqanssi.Tpo" -c -o libcodec2_la-codebookvqanssi.lo `test -f 'codebookvqanssi.c' || echo '$(srcdir)/'`codebookvqanssi.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/libcodec2_la-codebookvqanssi.Tpo" "$(DEPDIR)/libcodec2_la-codebookvqanssi.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebookvqanssi.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='codebookvqanssi.c' object='libcodec2_la-codebookvqanssi.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-codebookvqexp.lo `test -f 'codebookvqexp.c' || echo '$(srcdir)/'`codebookvqexp.c
+@am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -c -o libcodec2_la-codebookvqanssi.lo `test -f 'codebookvqanssi.c' || echo '$(srcdir)/'`codebookvqanssi.c
 
 libcodec2_la-codebookdt.lo: codebookdt.c
 @am__fastdepCC_TRUE@   if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcodec2_la_CFLAGS) $(CFLAGS) -MT libcodec2_la-codebookdt.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebookdt.Tpo" -c -o libcodec2_la-codebookdt.lo `test -f 'codebookdt.c' || echo '$(srcdir)/'`codebookdt.c; \
@@ -928,7 +928,7 @@ codebookdt.$(OBJEXT): codebookdt.c
 codebookvq.$(OBJEXT): codebookvq.c
 codebookjnd.$(OBJEXT): codebookjnd.c
 codebookjvm.$(OBJEXT): codebookjvm.c
-codebookvqexp.$(OBJEXT): codebookvqexp.c
+codebookvqanssi.$(OBJEXT): codebookvqanssi.c
 codebookge.$(OBJEXT): codebookge.c
 
 codebook.lo: codebook.c
@@ -951,14 +951,14 @@ codebookjnd.c: generate_codebook $(CODEBOOKSJND)
 codebookjvm.c: generate_codebook $(CODEBOOKSJVM)
        ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.c
 
-codebookvqexp.c: generate_codebook $(CODEBOOKSVQEXP)
-       ./generate_codebook lsp_cbvqexp $(CODEBOOKSVQEXP) > codebookvqexp.c
+codebookvqanssi.c: generate_codebook $(CODEBOOKSVQEXP)
+       ./generate_codebook lsp_cbvqanssi $(CODEBOOKSVQANSSI) > codebookvqanssi.c
 
 codebookge.c: generate_codebook $(CODEBOOKSGE)
        ./generate_codebook ge_cb $(CODEBOOKSGE) > codebookge.c
 
 clean-local:
-       -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqexp.c
+       -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqanssi.c
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
index 3e5d8c9706bc6992122ce77ed254e0c041ea85c7..721631da535f691431938e03b997ffaf8c8d557e 100644 (file)
@@ -87,7 +87,7 @@ int main(int argc, char *argv[])
     int lsp = 0, lspd = 0, lspvq = 0;
     int lspres = 0;
     int lspdt = 0, lspdt_mode = LSPDT_ALL;
-    int dt = 0, lspjvm = 0, lspjnd = 0, lspmel = 0;
+    int dt = 0, lspjvm = 0, lspanssi = 0, lspjnd = 0, lspmel = 0;
     float ak[LPC_MAX];
     COMP  Sw_[FFT_ENC];
     COMP  Ew[FFT_ENC]; 
@@ -138,6 +138,7 @@ int main(int argc, char *argv[])
         { "lspdt", no_argument, &lspdt, 1 },
         { "lspdt_mode", required_argument, NULL, 0 },
         { "lspjvm", no_argument, &lspjvm, 1 },
+        { "lspanssi", no_argument, &lspanssi, 1 },
         { "phase0", no_argument, &phase0, 1 },
         { "phaseexp", required_argument, &phaseexp, 1 },
         { "ampexp", required_argument, &ampexp, 1 },
@@ -505,7 +506,7 @@ int main(int argc, char *argv[])
            }
 
            if (lspjvm) {
-               /* Jean-Marc's multi-stage VQ */
+               /* Jean-Marc's multi-stage, split VQ */
                lspjvm_quantise(lsps, lsps_, LPC_ORD);
                { 
                    float lsps_bw[LPC_ORD];
@@ -515,6 +516,13 @@ int main(int argc, char *argv[])
                }
            }
 
+           if (lspanssi) {
+               /*  multi-stage VQ from Anssi Ramo OH3GDD */
+
+               lspanssi_quantise(lsps, lsps_, LPC_ORD);
+               lsp_to_lpc(lsps_, ak, LPC_ORD);
+           }
+
            /* experimenting with non-linear LSP spacing to see if
               it's just noticable */
 
@@ -565,7 +573,7 @@ int main(int argc, char *argv[])
               analysis.  Re-design some time.
            */
 
-           if (!lsp && !lspd && !lspvq && !lspres && !lspjvm && !lspjnd && !lspmel)
+           if (!lsp && !lspd && !lspvq && !lspres && !lspjvm && !lspanssi && !lspjnd && !lspmel)
                for(i=0; i<LPC_ORD; i++)
                    lsps_[i] = lsps[i];
 
index e4cd33443774eba9516747ed29a71f18d558dccc..ed6b435d32ef912c108502f43806cda7f906a271 100644 (file)
@@ -88,7 +88,7 @@ extern const struct lsp_codebook lsp_cbvq[];
 extern const struct lsp_codebook lsp_cbjnd[];
 extern const struct lsp_codebook lsp_cbdt[];
 extern const struct lsp_codebook lsp_cbjvm[];
-extern const struct lsp_codebook lsp_cbvqexp[];
+extern const struct lsp_codebook lsp_cbvqanssi[];
 extern const struct lsp_codebook ge_cb[];
 
 #endif
index 274c524e6df61e2003c5ac049cc97aa4f41825d0..bc9545a1c335f7e9f11f053e210c06031d61ec2e 100644 (file)
@@ -142,7 +142,7 @@ void encode_lspds_scalar(
                 int   order
 ) 
 {
-    int   i,k,m,index;
+    int   i,k,m;
     float lsp_hz[LPC_MAX];
     float lsp__hz[LPC_MAX];
     float dlsp[LPC_MAX];
@@ -195,11 +195,10 @@ void decode_lspds_scalar(
                 int   order
 ) 
 {
-    int   i,k,index;
+    int   i,k;
     float lsp__hz[LPC_MAX];
     float dlsp_[LPC_MAX];
     const float *cb;
-    float se;
 
     assert(order == LPC_ORD);
 
@@ -407,6 +406,38 @@ void compute_weights(const float *x, float *w, int ndim)
   //w[1]*=2;
 }
 
+/* LSP weight calculation function kindly submitted by Anssi, OH3GDD */
+
+void compute_weights_anssi(const float *x, float *w, int ndim)
+{
+  int i;
+  float d[LPC_ORD];
+
+  assert(ndim == LPC_ORD);
+
+  for(i=0; i<LPC_ORD; i++)
+      d[i] = 1.0;
+
+  d[0] = x[1];
+  for (i=1; i<LPC_ORD-1; i++)
+      d[i] = x[i+1] - x[i-1];
+  d[LPC_ORD-1] = PI - x[8];
+  for (i=0; i<LPC_ORD; i++) {
+        if (x[i]<((400.0/4000.0)*PI))
+            w[i]=5.0/(0.01+d[i]);
+        else if (x[i]<((700.0/4000.0)*PI))
+            w[i]=4.0/(0.01+d[i]);
+        else if (x[i]<((1200.0/4000.0)*PI))
+            w[i]=3.0/(0.01+d[i]);
+        else if (x[i]<((2000.0/4000.0)*PI))
+            w[i]=2.0/(0.01+d[i]);
+        else
+            w[i]=1.0/(0.01+d[i]);
+        
+        w[i]=sqrt(w[i]+0.3);
+  }
+}
+
 int find_nearest(const float *codebook, int nb_entries, float *x, int ndim)
 {
   int i, j;
@@ -487,47 +518,54 @@ void lspjvm_quantise(float *x, float *xq, int ndim)
   }
 }
 
-void lspvqexp_quantise(float *x, float *xq, int ndim)
+/* 3 stage VQ LSP quantsier kindly submitted by Anssi, OH3GDD */
+
+void lspanssi_quantise(float *x, float *xq, int ndim)
 {
   int i, n1, n2, n3;
-  float err[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD];
-  float w[LPC_ORD], w2[LPC_ORD], w3[LPC_ORD];
-  const float *codebook1 = lsp_cbvqexp[0].cb;
-  const float *codebook2 = lsp_cbvqexp[1].cb;
-  const float *codebook3 = lsp_cbvqexp[2].cb;
+  float e, err1[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD];
+  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;
 
-  w[0] = MIN(x[0], x[1]-x[0]);
-  for (i=1;i<ndim-1;i++)
-    w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]);
-  w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]);
-  
-  compute_weights(x, w, ndim);
+  compute_weights_anssi(x, w, ndim);
   #ifdef DUMP
   dump_weights(w, ndim);
   #endif
 
-  n1 = find_nearest(codebook1, lsp_cbvqexp[0].m, x, ndim);
+  n1 = find_nearest_weighted(codebook1, lsp_cbvqanssi[0].m, x, w, ndim);
   
+  e = 0.0;
   for (i=0;i<ndim;i++)
   {
-    xq[i] = codebook1[ndim*n1+i];
-    err[i] = x[i] - xq[i];
+      xq[i] = codebook1[ndim*n1+i];
+      err1[i] = x[i] - xq[i];
+      e += err1[i]*err1[i];
   }
-  for (i=0;i<ndim/2;i++)
+  //printf("error1: %f\n", e);
+
+  n2 = find_nearest_weighted(codebook2, lsp_cbvqanssi[1].m, err1, w, ndim);
+
+  e = 0.0;
+  for (i=0;i<ndim;i++)
   {
-    err2[i] = err[2*i];  
-    err3[i] = err[2*i+1];
-    w2[i] = w[2*i];  
-    w3[i] = w[2*i+1];
+      xq[i] += codebook2[ndim*n2+i];
+      err2[i] = x[i] - xq[i];
+      e += err2[i]*err2[i];
   }
-  n2 = find_nearest_weighted(codebook2, lsp_cbvqexp[1].m, err2, w2, ndim/2);
-  n3 = find_nearest_weighted(codebook3, lsp_cbvqexp[2].m, err3, w3, ndim/2);
+  //printf("error2: %f\n", e);
+
+  n3 = find_nearest_weighted(codebook3, lsp_cbvqanssi[2].m, err2, w, ndim);
   
-  for (i=0;i<ndim/2;i++)
+  e = 0.0;
+  for (i=0;i<ndim;i++)
   {
-      xq[2*i] += codebook2[ndim*n2/2+i];
-      xq[2*i+1] += codebook3[ndim*n3/2+i];
+      xq[i] += codebook3[ndim*n3+i];
+      err3[i] = x[i] - xq[i];
+      e += err3[i]*err3[i];
   }
+  //printf("error3: %f\n", e);
 }
 
 int check_lsp_order(float lsp[], int lpc_order)
index 278f0c392aaffbfd2f5990045269d9c32afa7be3..4594a121d06399974c33eb245fc7850b01afcb06 100644 (file)
@@ -82,7 +82,7 @@ void lspvq_quantise(float lsp[], float lsp_[], int order);
 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 lspvqexp_quantise(float lsps[], float lsps_[], int order);
+void lspanssi_quantise(float lsps[], float lsps_[], int order);
 
 void quantise_WoE(MODEL *model, float *e, float xq[]);
 int  encode_WoE(MODEL *model, float e, float xq[]);