From 8ea30fea07365016e05bbba8ed7acef3286569bd Mon Sep 17 00:00:00 2001 From: drowe67 Date: Fri, 19 Nov 2010 22:28:35 +0000 Subject: [PATCH] experimental support for 27bit/frame hybrid scalar/LSP VQ git-svn-id: https://svn.code.sf.net/p/freetel/code@251 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2/src/Makefile.am | 19 ++++++- codec2/src/Makefile.in | 30 +++++++++-- codec2/src/c2sim.c | 22 ++++++-- codec2/src/defines.h | 1 + codec2/src/generate_codebook.c | 5 +- codec2/src/quantise.c | 99 +++++++++++++++++++++++++++++++++- codec2/src/quantise.h | 1 + 7 files changed, 165 insertions(+), 12 deletions(-) diff --git a/codec2/src/Makefile.am b/codec2/src/Makefile.am index 1aec25ca..01911e87 100644 --- a/codec2/src/Makefile.am +++ b/codec2/src/Makefile.am @@ -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) diff --git a/codec2/src/Makefile.in b/codec2/src/Makefile.in index 1efebb03..7b6bee6a 100644 --- a/codec2/src/Makefile.in +++ b/codec2/src/Makefile.in @@ -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: diff --git a/codec2/src/c2sim.c b/codec2/src/c2sim.c index 5b64489d..8c2657d3 100644 --- a/codec2/src/c2sim.c +++ b/codec2/src/c2sim.c @@ -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)); diff --git a/codec2/src/defines.h b/codec2/src/defines.h index 21bedd5c..2dcd527d 100644 --- a/codec2/src/defines.h +++ b/codec2/src/defines.h @@ -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 diff --git a/codec2/src/generate_codebook.c b/codec2/src/generate_codebook.c index 222f6d7e..0bea80d8 100644 --- a/codec2/src/generate_codebook.c +++ b/codec2/src/generate_codebook.c @@ -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"); } diff --git a/codec2/src/quantise.c b/codec2/src/quantise.c index 1c8e65a2..0441d206 100644 --- a/codec2/src/quantise.c +++ b/codec2/src/quantise.c @@ -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