experimental support for 27bit/frame hybrid scalar/LSP VQ
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 19 Nov 2010 22:28:35 +0000 (22:28 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Fri, 19 Nov 2010 22:28:35 +0000 (22:28 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@251 01035d8c-6547-0410-b346-abe4f91aad63

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

index 1aec25caa966adbcc424efccdd5a8c97e1ff5db5..01911e876478460d7e56b29669ec4280cc0ccf6a 100644 (file)
@@ -33,10 +33,21 @@ CODEBOOKSD= \
   $D/dlsp9.txt \
   $D/dlsp10.txt
 
+# lspd VQ quantisers
+
+CODEBOOKSDVQ= \
+  $D/dlsp1.txt \
+  $D/dlsp2.txt \
+  $D/dlsp3.txt \
+  $D/dlsp4.txt \
+  $D/dlsp5.txt \
+  ../unittest/lspd678910.txt
+
 noinst_PROGRAMS = generate_codebook
 
 codebook.$(OBJEXT): codebook.c
 codebookd.$(OBJEXT): codebookd.c
+codebookdvq.$(OBJEXT): codebookdvq.c
 
 codebook.lo: codebook.c
 
@@ -46,8 +57,11 @@ codebook.c: generate_codebook $(CODEBOOKS)
 codebookd.c: generate_codebook $(CODEBOOKSD)
        ./generate_codebook  lsp_cbd $(CODEBOOKSD) > codebookd.c
 
+codebookdvq.c: generate_codebook $(CODEBOOKSDVQ)
+       ./generate_codebook  lsp_cbdvq $(CODEBOOKSDVQ) > codebookdvq.c
+
 clean-local:
-       -rm -f codebook.c codebookd.c
+       -rm -f codebook.c codebookd.c codebookdvq.c
 
 lib_LTLIBRARIES        = libcodec2.la
 libcodec2_la_SOURCES = dump.c \
@@ -63,7 +77,8 @@ phase.c \
 quantise.c \
 pack.c \
 codebook.c \
-codebookd.c
+codebookd.c \
+codebookdvq.c
 
 libcodec2_la_CFLAGS = $(AM_CFLAGS)
 libcodec2_la_LDFLAGS = $(LIBS)
index 1efebb03f22a9b491647a715fa5265733535dd40..7b6bee6a976726385e370bab49aef63b48508fab 100644 (file)
@@ -67,7 +67,8 @@ am_libcodec2_la_OBJECTS = libcodec2_la-dump.lo libcodec2_la-lpc.lo \
        libcodec2_la-four1.lo libcodec2_la-interp.lo \
        libcodec2_la-lsp.lo libcodec2_la-phase.lo \
        libcodec2_la-quantise.lo libcodec2_la-pack.lo \
-       libcodec2_la-codebook.lo libcodec2_la-codebookd.lo
+       libcodec2_la-codebook.lo libcodec2_la-codebookd.lo \
+       libcodec2_la-codebookdvq.lo
 libcodec2_la_OBJECTS = $(am_libcodec2_la_OBJECTS)
 binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
 PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
@@ -245,6 +246,16 @@ CODEBOOKSD = \
   $D/dlsp9.txt \
   $D/dlsp10.txt
 
+
+# lspd VQ quantisers
+CODEBOOKSDVQ = \
+  $D/dlsp1.txt \
+  $D/dlsp2.txt \
+  $D/dlsp3.txt \
+  $D/dlsp4.txt \
+  $D/dlsp5.txt \
+  ../unittest/lspd678910.txt
+
 lib_LTLIBRARIES = libcodec2.la
 libcodec2_la_SOURCES = dump.c \
 lpc.c \
@@ -259,7 +270,8 @@ phase.c \
 quantise.c \
 pack.c \
 codebook.c \
-codebookd.c
+codebookd.c \
+codebookdvq.c
 
 libcodec2_la_CFLAGS = $(AM_CFLAGS)
 libcodec2_la_LDFLAGS = $(LIBS)
@@ -416,6 +428,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_codebook.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebook.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookdvq.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-four1.Plo@am__quote@
@@ -548,6 +561,13 @@ libcodec2_la-codebookd.lo: codebookd.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-codebookd.lo `test -f 'codebookd.c' || echo '$(srcdir)/'`codebookd.c
 
+libcodec2_la-codebookdvq.lo: codebookdvq.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-codebookdvq.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebookdvq.Tpo" -c -o libcodec2_la-codebookdvq.lo `test -f 'codebookdvq.c' || echo '$(srcdir)/'`codebookdvq.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/libcodec2_la-codebookdvq.Tpo" "$(DEPDIR)/libcodec2_la-codebookdvq.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebookdvq.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='codebookdvq.c' object='libcodec2_la-codebookdvq.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-codebookdvq.lo `test -f 'codebookdvq.c' || echo '$(srcdir)/'`codebookdvq.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -753,6 +773,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
 
 codebook.$(OBJEXT): codebook.c
 codebookd.$(OBJEXT): codebookd.c
+codebookdvq.$(OBJEXT): codebookdvq.c
 
 codebook.lo: codebook.c
 
@@ -762,8 +783,11 @@ codebook.c: generate_codebook $(CODEBOOKS)
 codebookd.c: generate_codebook $(CODEBOOKSD)
        ./generate_codebook  lsp_cbd $(CODEBOOKSD) > codebookd.c
 
+codebookdvq.c: generate_codebook $(CODEBOOKSDVQ)
+       ./generate_codebook  lsp_cbdvq $(CODEBOOKSDVQ) > codebookdvq.c
+
 clean-local:
-       -rm -f codebook.c codebookd.c
+       -rm -f codebook.c codebookd.c codebookdvq.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 5b64489dca2341d7478eb44c2b6b39fde6fabe17..8c2657d32f95bdc099627a91804b1fe9309d8f31 100644 (file)
@@ -100,7 +100,7 @@ int main(int argc, char *argv[])
   float sum_snr;
 
   int lpc_model, order = LPC_ORD;
-  int lsp, dlsp, lsp_quantiser;
+  int lsp, lspd, lspdvq, lsp_quantiser;
   float ak[LPC_MAX];
   COMP  Sw_[FFT_ENC];
   COMP  Ew[FFT_ENC]; 
@@ -156,7 +156,8 @@ int main(int argc, char *argv[])
      "usage: %s InputFile [-o OutputFile]\n"
      "\t[--lpc Order]\n"
      "\t[--lsp]\n"
-     "\t[--dlsp]\n"
+     "\t[--lspd]\n"
+     "\t[--lspdvq]\n"
      "\t[--phase0]\n"
      "\t[--postfilter]\n"
      "\t[--hand_voicing]\n"
@@ -209,8 +210,12 @@ int main(int argc, char *argv[])
   if (lsp)
       assert(order == LPC_ORD);
 
-  dlsp = switch_present("--dlsp",argc,argv);
-  if (dlsp)
+  lspd = switch_present("--lspd",argc,argv);
+  if (lspd)
+      assert(order == LPC_ORD);
+
+  lspdvq = switch_present("--lspdvq",argc,argv);
+  if (lspdvq)
       assert(order == LPC_ORD);
 
   phase0 = switch_present("--phase0",argc,argv);
@@ -318,13 +323,20 @@ int main(int argc, char *argv[])
            lsp_to_lpc(lsps, ak, LPC_ORD);
        }
 
-       if (dlsp) {
+       if (lspd) {
            float lsps_[LPC_ORD];
 
            lspd_quantise(lsps, lsps_, LPC_ORD);
            lsp_to_lpc(lsps_, ak, LPC_ORD);
        }
 
+       if (lspdvq) {
+           float lsps_[LPC_ORD];
+
+           lspdvq_quantise(lsps, lsps_, LPC_ORD);
+           lsp_to_lpc(lsps_, ak, LPC_ORD);
+       }
+
        e = decode_energy(encode_energy(e));
        model.Wo = decode_Wo(encode_Wo(model.Wo));
 
index 21bedd5c8e0e5b86a16dbc541a2bd888512ef3e8..2dcd527d3767d4dcb61dc2f329ab284c306b4973 100644 (file)
@@ -83,5 +83,6 @@ struct lsp_codebook {
 };
 extern const struct lsp_codebook lsp_cb[];
 extern const struct lsp_codebook lsp_cbd[];
+extern const struct lsp_codebook lsp_cbdvq[];
 
 #endif
index 222f6d7e6f44a72256bb1aecb2cd31979fc84711..0bea80d854f360d60a76727b548888ee50754634 100644 (file)
@@ -63,7 +63,10 @@ dump_array(const struct codebook * b, int index)
     printf("  %g", b->cb[i]);
     if ( i < limit - 1 )
       printf(",");
-    printf("\n");
+
+    /* organise VQs by rows, looks prettier */
+    if ( ((i+1) % b->k) == 0 )
+       printf("\n");
   }
   printf("};\n");
 }
index 1c8e65a27a6852d173f163a35aa7dc3684191977..0441d2062d886ce6bf181559bc895381e0275353 100644 (file)
@@ -149,7 +149,7 @@ long quantise(const float * cb, float vec[], float w[], int k, int m, float *se)
                                                                              
   lspd_quantise
 
-  Differential lsp quantiser
+  Scalar lsp difference quantiser.
 
 \*---------------------------------------------------------------------------*/
 
@@ -208,6 +208,103 @@ void lspd_quantise(
        lsp_[i] = (PI/4000.0)*lsp__hz[i];
 }
 
+/*---------------------------------------------------------------------------*\
+                                                                             
+  lspd_vq_quantise
+
+  Vector lsp difference quantiser.
+
+\*---------------------------------------------------------------------------*/
+
+void lspdvq_quantise(
+  float lsp[], 
+  float lsp_[],
+  int   order
+) 
+{
+    int   i,k,m,ncb, nlsp;
+    float dlsp[LPC_MAX];
+    float dlsp_[LPC_MAX];
+    float  wt[LPC_ORD];
+    const float *cb;
+    float se;
+    int   index;
+
+    dlsp[0] = lsp[0];
+    for(i=1; i<order; i++)
+       dlsp[i] = lsp[i] - lsp[i-1];
+
+    for(i=0; i<order; i++)
+       dlsp_[i] = dlsp[i];
+
+    for(i=0; i<order; i++)
+       wt[i] = 1.0;
+
+    /* scalar quantise dLSPs 1,2,3,4,5 */
+
+    for(i=0; i<5; i++) {
+       if (i) 
+           dlsp[i] = (lsp[i] - lsp_[i-1])*4000.0/PI;       
+       else
+           dlsp[0] = lsp[0]*4000.0/PI;
+
+       k = lsp_cbdvq[i].k;
+       m = lsp_cbdvq[i].m;
+       cb = lsp_cbdvq[i].cb;
+       index = quantise(cb, &dlsp[i], wt, k, m, &se);
+       dlsp_[i] = cb[index*k]*PI/4000.0;
+       
+       if (i) 
+           lsp_[i] = lsp_[i-1] + dlsp_[i];
+       else
+           lsp_[0] = dlsp_[0];
+    }
+    dlsp[i] = lsp[i] - lsp_[i-1];
+    dlsp_[i] = dlsp[i];
+
+    //printf("lsp[0] %f lsp_[0] %f\n", lsp[0], lsp_[0]);
+    //printf("lsp[1] %f lsp_[1] %f\n", lsp[1], lsp_[1]);
+
+#ifdef TT
+    /* VQ dLSPs 3,4,5 */
+
+    ncb = 2;
+    nlsp = 2;
+    k = lsp_cbdvq[ncb].k;
+    m = lsp_cbdvq[ncb].m;
+    cb = lsp_cbdvq[ncb].cb;
+    index = quantise(cb, &dlsp[nlsp], wt, k, m, &se);
+    dlsp_[nlsp] = cb[index*k];
+    dlsp_[nlsp+1] = cb[index*k+1];
+    dlsp_[nlsp+2] = cb[index*k+2];
+
+    lsp_[0] = dlsp_[0];
+    for(i=1; i<5; i++)
+       lsp_[i] = lsp_[i-1] + dlsp_[i];
+    dlsp[i] = lsp[i] - lsp_[i-1];
+    dlsp_[i] = dlsp[i];
+#endif
+    /* VQ dLSPs 6,7,8,9,10 */
+
+    ncb = 5;
+    nlsp = 5;
+    k = lsp_cbdvq[ncb].k;
+    m = lsp_cbdvq[ncb].m;
+    cb = lsp_cbdvq[ncb].cb;
+    index = quantise(cb, &dlsp[nlsp], wt, k, m, &se);
+    dlsp_[nlsp] = cb[index*k];
+    dlsp_[nlsp+1] = cb[index*k+1];
+    dlsp_[nlsp+2] = cb[index*k+2];
+    dlsp_[nlsp+3] = cb[index*k+3];
+    dlsp_[nlsp+4] = cb[index*k+4];
+
+    /* rebuild LSPs for dLSPs */
+
+    lsp_[0] = dlsp_[0];
+    for(i=1; i<order; i++)
+       lsp_[i] = lsp_[i-1] + dlsp_[i];
+}
+
 void check_lsp_order(float lsp[], int lpc_order)
 {
     int   i;
index ba2349529d7c1f2fc5baec974fe22e53733d9a28..90a3661ffd2856410faabf0f9835d7644a3b171f 100644 (file)
@@ -45,6 +45,7 @@ float decode_Wo(int index);
 void encode_lsps(int indexes[], float lsp[], int order);
 void decode_lsps(float lsp[], int indexes[], int order);
 void lspd_quantise(float lsp[], float lsp_[], int order);
+void lspdvq_quantise(float lsp[], float lsp_[], int order); 
 
 int encode_energy(float e);
 float decode_energy(int index);