$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
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 \
quantise.c \
pack.c \
codebook.c \
-codebookd.c
+codebookd.c \
+codebookdvq.c
libcodec2_la_CFLAGS = $(AM_CFLAGS)
libcodec2_la_LDFLAGS = $(LIBS)
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)
$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 \
quantise.c \
pack.c \
codebook.c \
-codebookd.c
+codebookd.c \
+codebookdvq.c
libcodec2_la_CFLAGS = $(AM_CFLAGS)
libcodec2_la_LDFLAGS = $(LIBS)
@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@
@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
codebook.$(OBJEXT): codebook.c
codebookd.$(OBJEXT): codebookd.c
+codebookdvq.$(OBJEXT): codebookdvq.c
codebook.lo: codebook.c
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:
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];
"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"
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);
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));
};
extern const struct lsp_codebook lsp_cb[];
extern const struct lsp_codebook lsp_cbd[];
+extern const struct lsp_codebook lsp_cbdvq[];
#endif
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");
}
lspd_quantise
- Differential lsp quantiser
+ Scalar lsp difference quantiser.
\*---------------------------------------------------------------------------*/
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;
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);