From: drowe67 Date: Wed, 29 Feb 2012 22:56:58 +0000 (+0000) Subject: cleaned up c2sim, added support for Jean-Marcs joint pitch-energy quantiser X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=ab588c8c123482b1d1f6679971b6a849c222605e;p=freetel-svn-tracking.git cleaned up c2sim, added support for Jean-Marcs joint pitch-energy quantiser git-svn-id: https://svn.code.sf.net/p/freetel/code@332 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/src/Makefile.am b/codec2-dev/src/Makefile.am index 7974b910..b09cc6a2 100644 --- a/codec2-dev/src/Makefile.am +++ b/codec2-dev/src/Makefile.am @@ -45,15 +45,16 @@ CODEBOOKSJND= \ $(top_srcdir)/unittest/lspjnd5-10.txt CODEBOOKSDT= \ - $D/lspdt1-4.txt \ - $D/lspdt5-10.txt \ - $D/lspdt1-10.txt + $D/lspdt.txt CODEBOOKSJVM= \ $D/lspjvm1.txt \ $D/lspjvm2.txt \ $D/lspjvm3.txt +CODEBOOKSGE= \ + $D/gecb.txt + noinst_PROGRAMS = generate_codebook genlspdtcb codebook.$(OBJEXT): codebook.c @@ -61,6 +62,7 @@ codebookd.$(OBJEXT): codebookd.c codebookvq.$(OBJEXT): codebookvq.c codebookjnd.$(OBJEXT): codebookjnd.c codebookjvm.$(OBJEXT): codebookjvm.c +codebookge.$(OBJEXT): codebookge.c $(CODEBOOKSDT): genlspdtcb ./genlspdtcb @@ -85,8 +87,11 @@ codebookdt.c: generate_codebook $(CODEBOOKSDT) codebookjvm.c: generate_codebook $(CODEBOOKSJVM) ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.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 + -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c lib_LTLIBRARIES = libcodec2.la libcodec2_la_SOURCES = dump.c \ @@ -107,7 +112,9 @@ codebookd.c \ codebookvq.c \ codebookjnd.c \ codebookjvm.c \ -codebookdt.c +codebookdt.c \ +codebookge.c + libcodec2_la_CFLAGS = $(AM_CFLAGS) libcodec2_la_LDFLAGS = $(LIBS) diff --git a/codec2-dev/src/Makefile.in b/codec2-dev/src/Makefile.in index 8cfd3c90..9d4660fe 100644 --- a/codec2-dev/src/Makefile.in +++ b/codec2-dev/src/Makefile.in @@ -70,7 +70,7 @@ am_libcodec2_la_OBJECTS = libcodec2_la-dump.lo libcodec2_la-lpc.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-codebookdt.lo + libcodec2_la-codebookdt.lo libcodec2_la-codebookge.lo libcodec2_la_OBJECTS = $(am_libcodec2_la_OBJECTS) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) @@ -264,15 +264,16 @@ CODEBOOKSJND = \ $(top_srcdir)/unittest/lspjnd5-10.txt CODEBOOKSDT = \ - $D/lspdt1-4.txt \ - $D/lspdt5-10.txt \ - $D/lspdt1-10.txt + $D/lspdt.txt CODEBOOKSJVM = \ $D/lspjvm1.txt \ $D/lspjvm2.txt \ $D/lspjvm3.txt +CODEBOOKSGE = \ + $D/gecb.txt + lib_LTLIBRARIES = libcodec2.la libcodec2_la_SOURCES = dump.c \ lpc.c \ @@ -292,7 +293,8 @@ codebookd.c \ codebookvq.c \ codebookjnd.c \ codebookjvm.c \ -codebookdt.c +codebookdt.c \ +codebookge.c libcodec2_la_CFLAGS = $(AM_CFLAGS) libcodec2_la_LDFLAGS = $(LIBS) @@ -456,6 +458,7 @@ distclean-compile: @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-codebookdt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcodec2_la-codebookge.Plo@am__quote@ @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@ @@ -627,6 +630,13 @@ libcodec2_la-codebookdt.lo: codebookdt.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-codebookdt.lo `test -f 'codebookdt.c' || echo '$(srcdir)/'`codebookdt.c +libcodec2_la-codebookge.lo: codebookge.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-codebookge.lo -MD -MP -MF "$(DEPDIR)/libcodec2_la-codebookge.Tpo" -c -o libcodec2_la-codebookge.lo `test -f 'codebookge.c' || echo '$(srcdir)/'`codebookge.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-codebookge.Tpo" "$(DEPDIR)/libcodec2_la-codebookge.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebookge.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codebookge.c' object='libcodec2_la-codebookge.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-codebookge.lo `test -f 'codebookge.c' || echo '$(srcdir)/'`codebookge.c + mostlyclean-libtool: -rm -f *.lo @@ -835,6 +845,7 @@ codebookd.$(OBJEXT): codebookd.c codebookvq.$(OBJEXT): codebookvq.c codebookjnd.$(OBJEXT): codebookjnd.c codebookjvm.$(OBJEXT): codebookjvm.c +codebookge.$(OBJEXT): codebookge.c $(CODEBOOKSDT): genlspdtcb ./genlspdtcb @@ -859,8 +870,11 @@ codebookdt.c: generate_codebook $(CODEBOOKSDT) codebookjvm.c: generate_codebook $(CODEBOOKSJVM) ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.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 + -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.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-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index 0aa4fd0e..29f66bbe 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -60,8 +60,8 @@ int main(int argc, char *argv[]) { FILE *fout = NULL; /* output speech file */ FILE *fin; /* input speech file */ - short buf[N]; /* input/output buffer */ - float Sn[M]; /* float input speech samples */ + short buf[N]; /* input/output buffer */ + float Sn[M]; /* float input speech samples */ COMP Sw[FFT_ENC]; /* DFT of Sn[] */ float w[M]; /* time domain hamming window */ COMP W[FFT_ENC]; /* DFT of w[] */ @@ -99,17 +99,20 @@ int main(int argc, char *argv[]) MODEL prev_model, interp_model; int decimate = 0; - float lsps[LPC_ORD]; - float prev_lsps[LPC_ORD], prev_lsps_[LPC_ORD]; - float lsps__prev[LPC_ORD]; - float lsps__prev2[LPC_ORD]; + float lsps[LPC_MAX]; + float prev_lsps[LPC_MAX], prev_lsps_[LPC_MAX]; + float lsps__prev[LPC_MAX]; + float lsps__prev2[LPC_MAX]; float e, prev_e; float ak_interp[LPC_MAX]; int lsp_indexes[LPC_MAX]; - float lsps_[LPC_ORD]; + float lsps_[LPC_MAX]; + float Woe[2], Woe_[2]; void *nlp_states; float hpf_states[2]; + int scalar_quant_Wo_e = 0; + int vector_quant_Wo_e = 0; char* opt_string = "ho:"; struct option long_options[] = { @@ -124,14 +127,16 @@ int main(int argc, char *argv[]) { "lspjvm", no_argument, &lspjvm, 1 }, { "phase0", no_argument, &phase0, 1 }, { "phasetest", no_argument, &phasetest, 1 }, - // { "postfilter", no_argument, &postfilter, 1 }, + { "postfilter", no_argument, &postfilt, 1 }, { "hand_voicing", required_argument, &hand_voicing, 1 }, { "dec", no_argument, &decimate, 1 }, { "dt", no_argument, &dt, 1 }, + { "sq_pitch_e", no_argument, &scalar_quant_Wo_e, 1 }, + { "vq_pitch_e", no_argument, &vector_quant_Wo_e, 1 }, { "rate", required_argument, NULL, 0 }, -#ifdef DUMP + #ifdef DUMP { "dump", required_argument, &dump, 1 }, -#endif + #endif { "help", no_argument, NULL, 'h' }, { NULL, no_argument, NULL, 0 } }; @@ -167,9 +172,12 @@ int main(int argc, char *argv[]) print_help(long_options, num_opts, argv); } - /* Interpret command line arguments -------------------------------------*/ + /*----------------------------------------------------------------*\ + + Interpret Command Line Arguments + + \*----------------------------------------------------------------*/ - /* Arguments */ while(1) { int option_index = 0; int opt = getopt_long(argc, argv, opt_string, @@ -184,11 +192,11 @@ int main(int argc, char *argv[]) fprintf(stderr, "Error in LPC order: %s\n", optarg); exit(1); } -#ifdef DUMP + #ifdef DUMP } else if(strcmp(long_options[option_index].name, "dump") == 0) { if (dump) dump_on(optarg); -#endif + #endif } else if(strcmp(long_options[option_index].name, "lsp") == 0 || strcmp(long_options[option_index].name, "lspd") == 0 || strcmp(long_options[option_index].name, "lspvq") == 0) { @@ -213,12 +221,14 @@ int main(int argc, char *argv[]) } else if(strcmp(long_options[option_index].name, "rate") == 0) { if(strcmp(optarg,"2500") == 0) { lpc_model = 1; order = 10; + scalar_quant_Wo_e = 1; lsp = 1; phase0 = 1; postfilt = 1; decimate = 1; - } else if(strcmp(optarg,"1500") == 0) { + } else if(strcmp(optarg,"1500") == 0) { lpc_model = 1; order = 10; + scalar_quant_Wo_e = 1; lsp = 1; lspdt = 1; phase0 = 1; postfilt = 1; @@ -226,6 +236,7 @@ int main(int argc, char *argv[]) dt = 1; } else if(strcmp(optarg,"1200") == 0) { lpc_model = 1; order = 10; + scalar_quant_Wo_e = 1; lspjvm = 1; lspdt = 1; phase0 = 1; postfilt = 1; @@ -267,25 +278,31 @@ int main(int argc, char *argv[]) ex_phase[0] = 0; bg_est = 0.0; + Woe_[0] = Woe_[1] = 1.0; /* printf("lspd: %d lspdt: %d lspdt_mode: %d phase0: %d postfilt: %d " "decimate: %d dt: %d\n",lspd,lspdt,lspdt_mode,phase0,postfilt, decimate,dt); */ + /* Initialise ------------------------------------------------------------*/ make_analysis_window(w,W); make_synthesis_window(Pn); quantise_init(); - /* Main Loop ------------------------------------------------------------*/ + /*----------------------------------------------------------------*\ + + Main Loop + + \*----------------------------------------------------------------*/ frames = 0; sum_snr = 0; while(fread(buf,sizeof(short),N,fin)) { frames++; - //printf("frame: %d\n", frames); + //printf("frame: %d ", frames); /* Read input speech */ @@ -294,31 +311,38 @@ int main(int argc, char *argv[]) for(i=0; i DLSP_LIMIT) - lsps_dt[i] = DLSP_LIMIT; - if (lsps_dt[i] < -DLSP_LIMIT) - lsps_dt[i] = -DLSP_LIMIT; - */ - //lsps_[i] += (PI/4000)*lsps_dt[i]; - } - k = lsp_cbdt[2].k; - m = lsp_cbdt[2].m; - cb = lsp_cbdt[2].cb; + //#define TRY_LSPDT_VQ +#ifdef TRY_LSPDT_VQ + /* this actually improves speech a bit, but 40ms updates works surprsingly well.... */ + k = lsp_cbdt[0].k; + m = lsp_cbdt[0].m; + cb = lsp_cbdt[0].cb; index = quantise(cb, lsps_dt, wt, k, m, &se); - printf("k %d m %d\n", k, m); for(i=0; i.5) /* Lower if not stable */ + { + w[0] *= .5; + } + + /* Lower weight for low energy */ + if (x[1] < xp[1]-10) + { + w[1] *= .5; + } + if (x[1] < xp[1]-20) + { + w[1] *= .5; + } + + //w[0] = 30; + //w[1] = 1; + + /* Square the weights because it's applied on the squared error */ + w[0] *= w[0]; + w[1] *= w[1]; + +} + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: quantize_ge() + AUTHOR......: Jean-Marc Valin & David Rowe + DATE CREATED: 29 Feb 2012 + + Experimental joint Wo and LPC energy vector quantiser developed my + Jean-Marc Valin. + +\*---------------------------------------------------------------------------*/ + +void ge_quantise(float *x, float *xq) +{ + int i, n1; + float err[2]; + float w[2]; + const float *codebook1 = ge_cb[0].cb; + int nb_entries = ge_cb[0].m; + int ndim = ge_cb[0].k; + + //printf("ndim %d nb_entries %d\n", ndim, nb_entries); + compute_weights2(x, xq, w, ndim); + //exit(0); + for (i=0;i