From 6d8b8cbd1568dc622e1d5a8a9cfa0e8edb112f30 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 12 Sep 2012 06:15:33 +0000 Subject: [PATCH] first pass at 4800 and 3600 modes git-svn-id: https://svn.code.sf.net/p/freetel/code@679 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/Makefile.am | 37 +- codec2-dev/src/Makefile.in | 49 +- codec2-dev/src/c2dec.c | 10 +- codec2-dev/src/c2enc.c | 16 +- codec2-dev/src/c2sim.c | 97 +- codec2-dev/src/codebook/dlsp1.txt | 10 +- codec2-dev/src/codebook/dlsp10.txt | 9 +- codec2-dev/src/codebook/dlsp2.txt | 17 +- codec2-dev/src/codebook/dlsp3.txt | 7 +- codec2-dev/src/codebook/dlsp4.txt | 28 +- codec2-dev/src/codebook/dlsp5.txt | 17 +- codec2-dev/src/codebook/dlsp6.txt | 19 +- codec2-dev/src/codebook/dlsp7.txt | 19 +- codec2-dev/src/codebook/dlsp8.txt | 8 +- codec2-dev/src/codebook/dlsp9.txt | 8 +- codec2-dev/src/codebook/lspdt1.txt | 9 + codec2-dev/src/codebook/lspdt10.txt | 3 + codec2-dev/src/codebook/lspdt2.txt | 9 + codec2-dev/src/codebook/lspdt3.txt | 5 + codec2-dev/src/codebook/lspdt4.txt | 5 + codec2-dev/src/codebook/lspdt5.txt | 5 + codec2-dev/src/codebook/lspdt6.txt | 5 + codec2-dev/src/codebook/lspdt7.txt | 3 + codec2-dev/src/codebook/lspdt8.txt | 3 + codec2-dev/src/codebook/lspdt9.txt | 3 + codec2-dev/src/codebookd.c | 4300 ++------------------------- codec2-dev/src/codebookdt.c | 1164 +------- codec2-dev/src/codec2.c | 272 +- codec2-dev/src/codec2.h | 8 +- codec2-dev/src/defines.h | 1 + codec2-dev/src/dump.c | 104 +- codec2-dev/src/dump.h | 5 + codec2-dev/src/listensim.sh | 2 +- codec2-dev/src/phase.c | 27 +- codec2-dev/src/postfilter.c | 9 +- codec2-dev/src/quantise.c | 236 +- codec2-dev/src/quantise.h | 19 +- 37 files changed, 1213 insertions(+), 5335 deletions(-) create mode 100644 codec2-dev/src/codebook/lspdt1.txt create mode 100644 codec2-dev/src/codebook/lspdt10.txt create mode 100644 codec2-dev/src/codebook/lspdt2.txt create mode 100644 codec2-dev/src/codebook/lspdt3.txt create mode 100644 codec2-dev/src/codebook/lspdt4.txt create mode 100644 codec2-dev/src/codebook/lspdt5.txt create mode 100644 codec2-dev/src/codebook/lspdt6.txt create mode 100644 codec2-dev/src/codebook/lspdt7.txt create mode 100644 codec2-dev/src/codebook/lspdt8.txt create mode 100644 codec2-dev/src/codebook/lspdt9.txt diff --git a/codec2-dev/src/Makefile.am b/codec2-dev/src/Makefile.am index 2ed09d1f..c73a54a1 100644 --- a/codec2-dev/src/Makefile.am +++ b/codec2-dev/src/Makefile.am @@ -26,7 +26,12 @@ CODEBOOKSD= \ $D/dlsp2.txt \ $D/dlsp3.txt \ $D/dlsp4.txt \ - $(top_srcdir)/unittest/lsp45678910.txt + $D/dlsp5.txt \ + $D/dlsp6.txt \ + $D/dlsp7.txt \ + $D/dlsp8.txt \ + $D/dlsp9.txt \ + $D/dlsp10.txt # lspd VQ quantisers @@ -45,13 +50,27 @@ CODEBOOKSJND= \ $(top_srcdir)/unittest/lspjnd5-10.txt CODEBOOKSDT= \ - $D/lspdt.txt + $D/lspdt1.txt \ + $D/lspdt2.txt \ + $D/lspdt3.txt \ + $D/lspdt4.txt \ + $D/lspdt5.txt \ + $D/lspdt6.txt \ + $D/lspdt7.txt \ + $D/lspdt8.txt \ + $D/lspdt9.txt \ + $D/lspdt10.txt CODEBOOKSJVM= \ $D/lspjvm1.txt \ $D/lspjvm2.txt \ $D/lspjvm3.txt +CODEBOOKSVQEXP= \ + $D/lspvqexp1.txt \ + $D/lspvqexp2.txt \ + $D/lspvqexp3.txt + CODEBOOKSGE= \ $D/gecb.txt @@ -59,14 +78,13 @@ noinst_PROGRAMS = generate_codebook genlspdtcb codebook.$(OBJEXT): codebook.c codebookd.$(OBJEXT): codebookd.c +codebookdt.$(OBJEXT): codebookdt.c codebookvq.$(OBJEXT): codebookvq.c codebookjnd.$(OBJEXT): codebookjnd.c codebookjvm.$(OBJEXT): codebookjvm.c +codebookvqexp.$(OBJEXT): codebookvqexp.c codebookge.$(OBJEXT): codebookge.c -$(CODEBOOKSDT): genlspdtcb - ./genlspdtcb - codebook.lo: codebook.c codebook.c: generate_codebook $(CODEBOOKS) @@ -75,6 +93,9 @@ codebook.c: generate_codebook $(CODEBOOKS) codebookd.c: generate_codebook $(CODEBOOKSD) ./generate_codebook lsp_cbd $(CODEBOOKSD) > codebookd.c +codebookdt.c: generate_codebook $(CODEBOOKSDT) + ./generate_codebook lsp_cbdt $(CODEBOOKSDT) > codebookdt.c + codebookvq.c: generate_codebook $(CODEBOOKSVQ) ./generate_codebook lsp_cbvq $(CODEBOOKSVQ) > codebookvq.c @@ -87,11 +108,14 @@ codebookdt.c: generate_codebook $(CODEBOOKSDT) codebookjvm.c: generate_codebook $(CODEBOOKSJVM) ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.c +codebookvqexp.c: generate_codebook $(CODEBOOKSVQEXP) + ./generate_codebook lsp_cbvqexp $(CODEBOOKSVQEXP) > codebookvqexp.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 + -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqexp.c lib_LTLIBRARIES = libcodec2.la libcodec2_la_SOURCES = dump.c \ @@ -113,6 +137,7 @@ codebookd.c \ codebookvq.c \ codebookjnd.c \ codebookjvm.c \ +codebookvqexp.c \ codebookdt.c \ codebookge.c diff --git a/codec2-dev/src/Makefile.in b/codec2-dev/src/Makefile.in index 5462bd3b..a015bc35 100644 --- a/codec2-dev/src/Makefile.in +++ b/codec2-dev/src/Makefile.in @@ -72,8 +72,8 @@ 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-codebookdt.lo \ - libcodec2_la-codebookge.lo + libcodec2_la-codebookjvm.lo libcodec2_la-codebookvqexp.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) @@ -272,7 +272,12 @@ CODEBOOKSD = \ $D/dlsp2.txt \ $D/dlsp3.txt \ $D/dlsp4.txt \ - $(top_srcdir)/unittest/lsp45678910.txt + $D/dlsp5.txt \ + $D/dlsp6.txt \ + $D/dlsp7.txt \ + $D/dlsp8.txt \ + $D/dlsp9.txt \ + $D/dlsp10.txt # lspd VQ quantisers @@ -291,13 +296,27 @@ CODEBOOKSJND = \ $(top_srcdir)/unittest/lspjnd5-10.txt CODEBOOKSDT = \ - $D/lspdt.txt + $D/lspdt1.txt \ + $D/lspdt2.txt \ + $D/lspdt3.txt \ + $D/lspdt4.txt \ + $D/lspdt5.txt \ + $D/lspdt6.txt \ + $D/lspdt7.txt \ + $D/lspdt8.txt \ + $D/lspdt9.txt \ + $D/lspdt10.txt CODEBOOKSJVM = \ $D/lspjvm1.txt \ $D/lspjvm2.txt \ $D/lspjvm3.txt +CODEBOOKSVQEXP = \ + $D/lspvqexp1.txt \ + $D/lspvqexp2.txt \ + $D/lspvqexp3.txt + CODEBOOKSGE = \ $D/gecb.txt @@ -321,6 +340,7 @@ codebookd.c \ codebookvq.c \ codebookjnd.c \ codebookjvm.c \ +codebookvqexp.c \ codebookdt.c \ codebookge.c @@ -508,6 +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-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@ @@ -677,6 +698,13 @@ 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@ +@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 + 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; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libcodec2_la-codebookdt.Tpo" "$(DEPDIR)/libcodec2_la-codebookdt.Plo"; else rm -f "$(DEPDIR)/libcodec2_la-codebookdt.Tpo"; exit 1; fi @@ -896,14 +924,13 @@ uninstall-am: uninstall-binPROGRAMS uninstall-info-am \ codebook.$(OBJEXT): codebook.c codebookd.$(OBJEXT): codebookd.c +codebookdt.$(OBJEXT): codebookdt.c codebookvq.$(OBJEXT): codebookvq.c codebookjnd.$(OBJEXT): codebookjnd.c codebookjvm.$(OBJEXT): codebookjvm.c +codebookvqexp.$(OBJEXT): codebookvqexp.c codebookge.$(OBJEXT): codebookge.c -$(CODEBOOKSDT): genlspdtcb - ./genlspdtcb - codebook.lo: codebook.c codebook.c: generate_codebook $(CODEBOOKS) @@ -912,6 +939,9 @@ codebook.c: generate_codebook $(CODEBOOKS) codebookd.c: generate_codebook $(CODEBOOKSD) ./generate_codebook lsp_cbd $(CODEBOOKSD) > codebookd.c +codebookdt.c: generate_codebook $(CODEBOOKSDT) + ./generate_codebook lsp_cbdt $(CODEBOOKSDT) > codebookdt.c + codebookvq.c: generate_codebook $(CODEBOOKSVQ) ./generate_codebook lsp_cbvq $(CODEBOOKSVQ) > codebookvq.c @@ -924,11 +954,14 @@ codebookdt.c: generate_codebook $(CODEBOOKSDT) codebookjvm.c: generate_codebook $(CODEBOOKSJVM) ./generate_codebook lsp_cbjvm $(CODEBOOKSJVM) > codebookjvm.c +codebookvqexp.c: generate_codebook $(CODEBOOKSVQEXP) + ./generate_codebook lsp_cbvqexp $(CODEBOOKSVQEXP) > codebookvqexp.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 + -rm -f codebook.c codebookd.c codebookdvq.c codebookjnd.c codebookdt.c codebookjvm.c codebookge.c codebookvqexp.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/c2dec.c b/codec2-dev/src/c2dec.c index 6ea20e23..a72e91b9 100644 --- a/codec2-dev/src/c2dec.c +++ b/codec2-dev/src/c2dec.c @@ -44,19 +44,23 @@ int main(int argc, char *argv[]) float ber, r; if (argc < 4) { - printf("usage: c2dec 2400|1400|1200 InputBitFile OutputRawSpeechFile\n"); + printf("usage: c2dec 4800|3600|2400|1400|1200 InputBitFile OutputRawSpeechFile\n"); printf("e.g c2dec 1400 hts1a.c2 hts1a_1400.raw\n"); exit(1); } - if (strcmp(argv[1],"2400") == 0) + if (strcmp(argv[1],"4800") == 0) + mode = CODEC2_MODE_4800; + else if (strcmp(argv[1],"3600") == 0) + mode = CODEC2_MODE_3600; + else if (strcmp(argv[1],"2400") == 0) mode = CODEC2_MODE_2400; else if (strcmp(argv[1],"1400") == 0) mode = CODEC2_MODE_1400; else if (strcmp(argv[1],"1200") == 0) mode = CODEC2_MODE_1200; else { - fprintf(stderr, "Error in mode: %s. Must be 2400, 1400 or 1200\n", argv[1]); + fprintf(stderr, "Error in mode: %s. Must be 4800, 3600, 2400, 1400 or 1200\n", argv[1]); exit(1); } diff --git a/codec2-dev/src/c2enc.c b/codec2-dev/src/c2enc.c index bc6880d5..d4a22dc7 100644 --- a/codec2-dev/src/c2enc.c +++ b/codec2-dev/src/c2enc.c @@ -44,19 +44,23 @@ int main(int argc, char *argv[]) int nsam, nbit, nbyte; if (argc != 4) { - printf("usage: c2enc 2400|1400|1200 InputRawspeechFile OutputBitFile\n"); + printf("usage: c2enc 4800|3600|2400|1400|1200 InputRawspeechFile OutputBitFile\n"); printf("e.g c2enc 1400 ../raw/hts1a.raw hts1a.c2\n"); exit(1); } - if (strcmp(argv[1],"2400") == 0) + if (strcmp(argv[1],"4800") == 0) + mode = CODEC2_MODE_4800; + else if (strcmp(argv[1],"3600") == 0) + mode = CODEC2_MODE_3600; + else if (strcmp(argv[1],"2400") == 0) mode = CODEC2_MODE_2400; - else if (strcmp(argv[1],"1400") == 0) + else if (strcmp(argv[1],"1400") == 0) mode = CODEC2_MODE_1400; else if (strcmp(argv[1],"1200") == 0) mode = CODEC2_MODE_1200; else { - fprintf(stderr, "Error in mode: %s. Must be 2400, 1400 or 1200\n", argv[1]); + fprintf(stderr, "Error in mode: %s. Must be 4800, 3600, 2400, 1400 or 1200\n", argv[1]); exit(1); } @@ -85,8 +89,8 @@ int main(int argc, char *argv[]) while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) { codec2_encode(codec2, bits, buf); fwrite(bits, sizeof(char), nbyte, fout); - //if this is in a pipeline, we probably don't want the usual - //buffering to occur + // if this is in a pipeline, we probably don't want the usual + // buffering to occur if (fout == stdout) fflush(stdout); if (fin == stdin) fflush(stdin); } diff --git a/codec2-dev/src/c2sim.c b/codec2-dev/src/c2sim.c index 6b326483..287efbd6 100644 --- a/codec2-dev/src/c2sim.c +++ b/codec2-dev/src/c2sim.c @@ -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; + int dt = 0, lspjvm = 0, lspjnd = 0, lspmel = 0; float ak[LPC_MAX]; COMP Sw_[FFT_ENC]; COMP Ew[FFT_ENC]; @@ -130,6 +130,7 @@ int main(int argc, char *argv[]) struct option long_options[] = { { "lpc", required_argument, &lpc_model, 1 }, { "lspjnd", no_argument, &lspjnd, 1 }, + { "lspmel", no_argument, &lspmel, 1 }, { "lsp", no_argument, &lsp, 1 }, { "lspd", no_argument, &lspd, 1 }, { "lspvq", no_argument, &lspvq, 1 }, @@ -246,21 +247,22 @@ int main(int argc, char *argv[]) } else if(strcmp(long_options[option_index].name, "ampexp") == 0) { strcpy(ampexp_arg, optarg); } else if(strcmp(long_options[option_index].name, "rate") == 0) { - if(strcmp(optarg,"2400") == 0) { + if(strcmp(optarg,"4800") == 0) { lpc_model = 1; order = 10; - scalar_quant_Wo_e = 1; + vector_quant_Wo_e = 1; lsp = 1; phase0 = 1; postfilt = 1; - decimate = 1; - } else if(strcmp(optarg,"1500") == 0) { + decimate = 0; + lpcpf = 1; + } else if(strcmp(optarg,"2400") == 0) { lpc_model = 1; order = 10; scalar_quant_Wo_e = 1; - lsp = 1; lspdt = 1; + lsp = 1; phase0 = 1; postfilt = 1; decimate = 1; - dt = 1; + lpcpf = 1; } else if(strcmp(optarg,"1400") == 0) { lpc_model = 1; order = 10; vector_quant_Wo_e = 1; @@ -269,6 +271,7 @@ int main(int argc, char *argv[]) postfilt = 1; decimate = 1; dt = 1; + lpcpf = 1; } else if(strcmp(optarg,"1200") == 0) { lpc_model = 1; order = 10; scalar_quant_Wo_e = 1; @@ -277,6 +280,7 @@ int main(int argc, char *argv[]) postfilt = 1; decimate = 1; dt = 1; + lpcpf = 1; } else { fprintf(stderr, "Error: invalid output rate %s\n", optarg); exit(1); @@ -383,7 +387,7 @@ int main(int argc, char *argv[]) dump_phase_(&model.phi[0], model.L); #endif } - + if (hi) { int m; for(m=1; mmode == CODEC2_MODE_4800) + return 48; + if (c2->mode == CODEC2_MODE_3600) + return 72; if (c2->mode == CODEC2_MODE_2400) return 48; if (c2->mode == CODEC2_MODE_1400) @@ -185,6 +195,10 @@ int CODEC2_WIN32SUPPORT codec2_bits_per_frame(struct CODEC2 *c2) { \*---------------------------------------------------------------------------*/ int CODEC2_WIN32SUPPORT codec2_samples_per_frame(struct CODEC2 *c2) { + if (c2->mode == CODEC2_MODE_4800) + return 80; + if (c2->mode == CODEC2_MODE_3600) + return 160; if (c2->mode == CODEC2_MODE_2400) return 160; if (c2->mode == CODEC2_MODE_1400) @@ -199,11 +213,17 @@ void CODEC2_WIN32SUPPORT codec2_encode(struct CODEC2 *c2, unsigned char *bits, s { assert(c2 != NULL); assert( + (c2->mode == CODEC2_MODE_4800) || + (c2->mode == CODEC2_MODE_3600) || (c2->mode == CODEC2_MODE_2400) || (c2->mode == CODEC2_MODE_1400) || (c2->mode == CODEC2_MODE_1200) ); + if (c2->mode == CODEC2_MODE_4800) + codec2_encode_4800(c2, bits, speech); + if (c2->mode == CODEC2_MODE_3600) + codec2_encode_3600(c2, bits, speech); if (c2->mode == CODEC2_MODE_2400) codec2_encode_2400(c2, bits, speech); if (c2->mode == CODEC2_MODE_1400) @@ -216,11 +236,17 @@ void CODEC2_WIN32SUPPORT codec2_decode(struct CODEC2 *c2, short speech[], const { assert(c2 != NULL); assert( + (c2->mode == CODEC2_MODE_4800) || + (c2->mode == CODEC2_MODE_3600) || (c2->mode == CODEC2_MODE_2400) || (c2->mode == CODEC2_MODE_1400) || (c2->mode == CODEC2_MODE_1200) ); + if (c2->mode == CODEC2_MODE_4800) + codec2_decode_4800(c2, speech, bits); + if (c2->mode == CODEC2_MODE_3600) + codec2_decode_3600(c2, speech, bits); if (c2->mode == CODEC2_MODE_2400) codec2_decode_2400(c2, speech, bits); if (c2->mode == CODEC2_MODE_1400) @@ -229,6 +255,246 @@ void CODEC2_WIN32SUPPORT codec2_decode(struct CODEC2 *c2, short speech[], const codec2_decode_1200(c2, speech, bits); } +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_4800 + AUTHOR......: David Rowe + DATE CREATED: Sep 12 2012 + + Encodes 80 speech samples (10ms of speech) into 48 bits. + + The bit allocation is: + + Parameter bits/frame + -------------------------------------- + Harmonic magnitudes (LSPs) 36 + Joint VQ of Energy and Wo 8 + Voicing 1 + Spare 3 + TOTAL 48 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_4800(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps[LPC_ORD]; + float e; + int WoE_index; + int lsp_indexes[LPC_ORD]; + int i; + int spare = 0; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + + e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); + for(i=0; ixq_dec, WoE_index); + + for(i=0; ifft_fwd_cfg, ak, LPC_ORD, &model, e, &snr, 0, 0, 1); + apply_lpc_correction(&model); + + synthesise_one_frame(c2, speech, &model, ak); +} + + +/*---------------------------------------------------------------------------*\ + + FUNCTION....: codec2_encode_3600 + AUTHOR......: David Rowe + DATE CREATED: 12 Sep 2012 + + Encodes 160 speech samples (20ms of speech) into 72 bits. + + The codec2 algorithm actually operates internally on 10ms (80 + sample) frames, so we run the encoding algorithm twice. On the + first frame we just send the full LSPs, on the 2nd frame the LSP + differences from frame 1. + + The bit allocation is: + + Parameter frame 1 frame 2 Total + ------------------------------------------------------ + Harmonic magnitudes (LSPs) 36 18 54 + Joint VQ of Energy and Wo 8 8 16 + Voicing 1 1 2 + TOTAL 45 27 72 + +\*---------------------------------------------------------------------------*/ + +void codec2_encode_3600(struct CODEC2 *c2, unsigned char * bits, short speech[]) +{ + MODEL model; + float ak[LPC_ORD+1]; + float lsps1[LPC_ORD]; + float lsps2[LPC_ORD]; + float e; + int WoE_index; + int lsp_indexes[LPC_ORD]; + int i; + unsigned int nbit = 0; + + assert(c2 != NULL); + + memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); + + /* first 10ms analysis frame - full LSP */ + + analyse_one_frame(c2, &model, speech); + pack(bits, &nbit, model.voiced, 1); + e = speech_to_uq_lsps(lsps1, ak, c2->Sn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_scalar(lsp_indexes, lsps1, LPC_ORD); + decode_lsps_scalar(lsps1, lsp_indexes, LPC_ORD); + for(i=0; iSn, c2->w, LPC_ORD); + WoE_index = encode_WoE(&model, e, c2->xq_enc); + pack(bits, &nbit, WoE_index, WO_E_BITS); + + encode_lsps_diff_time(lsp_indexes, lsps2, lsps1, LPC_ORD); + for(i=0; ixq_dec, WoE_index); + + for(i=0; ifft_fwd_cfg, ak, LPC_ORD, &model, e, &snr, 0, 0, 1); + apply_lpc_correction(&model); + synthesise_one_frame(c2, speech, &model, ak); + + /* frame 2 - delta LSPs --------------------------------------*/ + + model.voiced = unpack(bits, &nbit, 1); + WoE_index = unpack(bits, &nbit, WO_E_BITS); + decode_WoE(&model, &e, c2->xq_dec, WoE_index); + + for(i=0; ifft_fwd_cfg, ak, LPC_ORD, &model, e, &snr, 0, 0, 1); + apply_lpc_correction(&model); + synthesise_one_frame(c2, &speech[N], &model, ak); +} + + /*---------------------------------------------------------------------------*\ FUNCTION....: codec2_encode_2400 @@ -356,7 +622,7 @@ void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5); for(i=0; i<2; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 1, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); apply_lpc_correction(&model[i]); } @@ -528,7 +794,7 @@ void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * } for(i=0; i<4; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 1, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); apply_lpc_correction(&model[i]); } @@ -705,7 +971,7 @@ void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * } for(i=0; i<4; i++) { lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 1, 0, 1); + aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, 1); apply_lpc_correction(&model[i]); } diff --git a/codec2-dev/src/codec2.h b/codec2-dev/src/codec2.h index d4f31c6a..d4d0159f 100644 --- a/codec2-dev/src/codec2.h +++ b/codec2-dev/src/codec2.h @@ -46,9 +46,11 @@ #define CODEC2_WIN32SUPPORT #endif -#define CODEC2_MODE_2400 0 -#define CODEC2_MODE_1400 1 -#define CODEC2_MODE_1200 2 +#define CODEC2_MODE_4800 0 +#define CODEC2_MODE_3600 1 +#define CODEC2_MODE_2400 2 +#define CODEC2_MODE_1400 3 +#define CODEC2_MODE_1200 4 struct CODEC2; diff --git a/codec2-dev/src/defines.h b/codec2-dev/src/defines.h index ba363620..e4cd3344 100644 --- a/codec2-dev/src/defines.h +++ b/codec2-dev/src/defines.h @@ -88,6 +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 ge_cb[]; #endif diff --git a/codec2-dev/src/dump.c b/codec2-dev/src/dump.c index aca0b29c..b414c794 100644 --- a/codec2-dev/src/dump.c +++ b/codec2-dev/src/dump.c @@ -41,8 +41,12 @@ static FILE *few = NULL; static FILE *fsw_ = NULL; static FILE *fmodel = NULL; static FILE *fqmodel = NULL; +static FILE *fpwb = NULL; static FILE *fpw = NULL; +static FILE *frw = NULL; static FILE *flsp = NULL; +static FILE *fweights = NULL; +static FILE *flsp_ = NULL; static FILE *fphase = NULL; static FILE *fphase_ = NULL; static FILE *ffw = NULL; @@ -52,6 +56,7 @@ static FILE *fdec = NULL; static FILE *fsnr = NULL; static FILE *flpcsnr = NULL; static FILE *fak = NULL; +static FILE *fak_ = NULL; static FILE *fbg = NULL; static FILE *fE = NULL; static FILE *frk = NULL; @@ -77,10 +82,18 @@ void dump_off(){ fclose(fmodel); if (fqmodel != NULL) fclose(fqmodel); + if (fpwb != NULL) + fclose(fpwb); if (fpw != NULL) fclose(fpw); + if (frw != NULL) + fclose(frw); if (flsp != NULL) fclose(flsp); + if (fweights != NULL) + fclose(fweights); + if (flsp_ != NULL) + fclose(flsp_); if (fphase != NULL) fclose(fphase); if (fphase_ != NULL) @@ -99,6 +112,8 @@ void dump_off(){ fclose(flpcsnr); if (fak != NULL) fclose(fak); + if (fak_ != NULL) + fclose(fak_); if (fbg != NULL) fclose(fbg); if (fE != NULL) @@ -312,6 +327,25 @@ void dump_lpc_snr(float snr) { fprintf(flpcsnr,"%f\n",snr); } +/* Pw "before" post filter so we can plot before and after */ + +void dump_Pwb(COMP Pwb[]) { + int i; + char s[MAX_STR]; + + if (!dumpon) return; + + if (fpwb == NULL) { + sprintf(s,"%s_pwb.txt", prefix); + fpwb = fopen(s, "wt"); + assert(fpwb != NULL); + } + + for(i=0; ivoiced) { - float offs; + //float rnd; + b = floor(m*model->Wo/r + 0.5); if (b > ((GLOTTAL_FFT_SIZE/2)-1)) { b = (GLOTTAL_FFT_SIZE/2)-1; @@ -239,10 +240,12 @@ void phase_synth_zero_order( males like hts1a. This moves the onset of each harmonic over +/- 0.25 of a sample. */ - jitter = 0.25*(1.0 - 2.0*rand()/RAND_MAX); + //jitter = 0.25*(1.0 - 2.0*rand()/RAND_MAX); + jitter = 0; - Ex[m].real = cos(ex_phase[0]*m - jitter*model->Wo*m + glottal[b]); - Ex[m].imag = sin(ex_phase[0]*m - jitter*model->Wo*m + glottal[b]); + //rnd = (PI/8)*(1.0 - 2.0*rand()/RAND_MAX); + Ex[m].real = cos(ex_phase[0]*m/* - jitter*model->Wo*m + glottal[b]*/); + Ex[m].imag = sin(ex_phase[0]*m/* - jitter*model->Wo*m + glottal[b]*/); } else { @@ -1674,6 +1677,22 @@ void phase_experiment(struct PEXP *pexp, MODEL *model, char *arg) { update_snr_calc(pexp, model, before); } + if (strcmp(arg,"addnoise") == 0) { + int m; + float max; + + max = 0; + for(m=1; m<=model->L; m++) + if (model->A[m] > max) + max = model->A[m]; + max = 20.0*log10(max); + for(m=1; m<=model->L; m++) + if (20.0*log10(model->A[m]) < (max-20)) { + model->phi[m] += (PI/4)*(1.0 -2.0*rand()/RAND_MAX); + //printf("m %d\n", m); + } + } + /* normalise phases */ for(m=1; m<=model->L; m++) diff --git a/codec2-dev/src/postfilter.c b/codec2-dev/src/postfilter.c index 6e17eeb8..077a3d27 100644 --- a/codec2-dev/src/postfilter.c +++ b/codec2-dev/src/postfilter.c @@ -44,6 +44,11 @@ #define BG_THRESH 40.0 /* only consider low levels signals for bg_est */ #define BG_BETA 0.1 /* averaging filter constant */ +#define BG_MARGIN 6.0 /* harmonics this far above BG noise are + randomised. Helped make bg noise less + spikey (impulsive) for mmt1, but speech was + perhaps a little rougher. + */ /*---------------------------------------------------------------------------*\ @@ -61,7 +66,7 @@ (5-12) are required to transmit the frequency selective voicing information. Mixed excitation also requires accurate voicing estimation (parameter estimators always break occasionally under - exceptional condition). + exceptional conditions). In our case we use a post filter approach which requires no additional bits to be transmitted. The decoder measures the average @@ -121,7 +126,7 @@ void postfilter( uv = 0; if (model->voiced) for(m=1; m<=model->L; m++) - if (20.0*log10(model->A[m]) < *bg_est) { + if (20.0*log10(model->A[m]) < (*bg_est + BG_MARGIN)) { model->phi[m] = TWO_PI*(float)rand()/RAND_MAX; uv++; } diff --git a/codec2-dev/src/quantise.c b/codec2-dev/src/quantise.c index 91bc3027..a1a88d14 100644 --- a/codec2-dev/src/quantise.c +++ b/codec2-dev/src/quantise.c @@ -63,6 +63,10 @@ int lspd_bits(int i) { return lsp_cbd[i].log2m; } +int lspdt_bits(int i) { + return lsp_cbdt[i].log2m; +} + int lsp_pred_vq_bits(int i) { return lsp_cbjvm[i].log2m; } @@ -148,7 +152,9 @@ void lspd_quantise( float se; int indexes[LPC_MAX]; - for(i=0; i max_Rw) + max_Rw = Rw[i]; + if (Rw[i] < min_Rw) + min_Rw = Rw[i]; + } - + #ifdef DUMP + if (dump) + dump_Rw(Rw); + #endif + /* create post filter mag spectrum and apply ------------------*/ /* measure energy before post filtering */ @@ -743,6 +761,11 @@ void lpc_post_filter(kiss_fft_cfg fft_fwd_cfg, COMP Pw[], float ak[], int order) /* apply post filter and measure energy */ + #ifdef DUMP + if (dump) + dump_Pwb(Pw); + #endif + e_after = 0.0; for(i=0; iL; m++) { + /* determine freq of harmonic */ + w = model->Wo*m; + bin = floor(w*r + 0.5); + printf("bin %d %4.2f ", bin, 20.0*log10(Rw[bin])); + if (20.0*log10(Rw[bin]) < thresh) { + model->phi[m] += (PI/4)*(1.0 - 2.0*rand()/RAND_MAX); + printf("m %d %4.2f ", m, 20.0*log10(Rw[bin])); + } + } + printf("\n"); +#endif } @@ -809,18 +864,18 @@ void aks_to_M2( for(i=0; i