From: drowe67 Date: Tue, 7 Aug 2012 21:53:46 +0000 (+0000) Subject: first pass at sparse amplitude VQ quantiser and genampdata test program X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=231daa21fff9af30c2f3d33c2de37ca84f82e6df;p=freetel-svn-tracking.git first pass at sparse amplitude VQ quantiser and genampdata test program git-svn-id: https://svn.code.sf.net/p/freetel/code@605 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/unittest/Makefile.am b/codec2-dev/unittest/Makefile.am index 120d04d2..892813d1 100644 --- a/codec2-dev/unittest/Makefile.am +++ b/codec2-dev/unittest/Makefile.am @@ -3,7 +3,7 @@ AUTOMAKE_OPTS = gnu NAME = libcodec2 AM_CPPFLAGS = $(AM_CFLAGS) -noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens vqtrainph genphdata polar2rect +noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens vqtrainph genphdata genampdata polar2rect vqtrainsp genres_SOURCES = genres.c ../src/lpc.c genres_LDADD = $(lib_LTLIBRARIES) @@ -29,10 +29,18 @@ vqtrainph_SOURCES = vqtrainph.c vqtrainph_LDADD = $(lib_LTLIBRARIES) vqtrainph_LDFLAGS = $(LIBS) +vqtrainsp_SOURCES = vqtrainsp.c +vqtrainsp_LDADD = $(lib_LTLIBRARIES) +vqtrainsp_LDFLAGS = $(LIBS) + genphdata_SOURCES = genphdata.c genphdata_LDADD = $(lib_LTLIBRARIES) genphdata_LDFLAGS = $(LIBS) +genampdata_SOURCES = genampdata.c +genampdata_LDADD = $(lib_LTLIBRARIES) +genampdata_LDFLAGS = $(LIBS) + polar2rect_SOURCES = polar2rect.c polar2rect_LDADD = $(lib_LTLIBRARIES) polar2rect_LDFLAGS = $(LIBS) diff --git a/codec2-dev/unittest/Makefile.in b/codec2-dev/unittest/Makefile.in index 90d103f2..f2a68350 100644 --- a/codec2-dev/unittest/Makefile.in +++ b/codec2-dev/unittest/Makefile.in @@ -41,7 +41,8 @@ noinst_PROGRAMS = genres$(EXEEXT) genlsp$(EXEEXT) extract$(EXEEXT) \ tinterp$(EXEEXT) tquant$(EXEEXT) vq_train_jvm$(EXEEXT) \ scalarlsptest$(EXEEXT) tfdmdv$(EXEEXT) t48_8$(EXEEXT) \ lspsync$(EXEEXT) create_interleaver$(EXEEXT) tlspsens$(EXEEXT) \ - vqtrainph$(EXEEXT) genphdata$(EXEEXT) polar2rect$(EXEEXT) + tphinterp$(EXEEXT) vqtrainph$(EXEEXT) genphdata$(EXEEXT) \ + genampdata$(EXEEXT) polar2rect$(EXEEXT) vqtrainsp$(EXEEXT) subdir = unittest DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -57,6 +58,9 @@ create_interleaver_DEPENDENCIES = am_extract_OBJECTS = extract.$(OBJEXT) extract_OBJECTS = $(am_extract_OBJECTS) extract_DEPENDENCIES = +am_genampdata_OBJECTS = genampdata.$(OBJEXT) +genampdata_OBJECTS = $(am_genampdata_OBJECTS) +genampdata_DEPENDENCIES = am_genlsp_OBJECTS = genlsp.$(OBJEXT) lpc.$(OBJEXT) lsp.$(OBJEXT) genlsp_OBJECTS = $(am_genlsp_OBJECTS) genlsp_DEPENDENCIES = @@ -126,6 +130,9 @@ vqtrainjnd_DEPENDENCIES = am_vqtrainph_OBJECTS = vqtrainph.$(OBJEXT) vqtrainph_OBJECTS = $(am_vqtrainph_OBJECTS) vqtrainph_DEPENDENCIES = +am_vqtrainsp_OBJECTS = vqtrainsp.$(OBJEXT) +vqtrainsp_OBJECTS = $(am_vqtrainsp_OBJECTS) +vqtrainsp_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -138,19 +145,21 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \ - $(genlsp_SOURCES) $(genphdata_SOURCES) $(genres_SOURCES) \ - $(lspsync_SOURCES) $(polar2rect_SOURCES) \ + $(genampdata_SOURCES) $(genlsp_SOURCES) $(genphdata_SOURCES) \ + $(genres_SOURCES) $(lspsync_SOURCES) $(polar2rect_SOURCES) \ $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tfdmdv_SOURCES) \ $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \ - $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ - $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) + $(tphinterp_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \ + $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \ + $(vqtrainsp_SOURCES) DIST_SOURCES = $(create_interleaver_SOURCES) $(extract_SOURCES) \ - $(genlsp_SOURCES) $(genphdata_SOURCES) $(genres_SOURCES) \ - $(lspsync_SOURCES) $(polar2rect_SOURCES) \ + $(genampdata_SOURCES) $(genlsp_SOURCES) $(genphdata_SOURCES) \ + $(genres_SOURCES) $(lspsync_SOURCES) $(polar2rect_SOURCES) \ $(scalarlsptest_SOURCES) $(t48_8_SOURCES) $(tfdmdv_SOURCES) \ $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \ - $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \ - $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) + $(tphinterp_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \ + $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \ + $(vqtrainsp_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -280,9 +289,15 @@ vqtrainjnd_LDFLAGS = $(LIBS) vqtrainph_SOURCES = vqtrainph.c vqtrainph_LDADD = $(lib_LTLIBRARIES) vqtrainph_LDFLAGS = $(LIBS) +vqtrainsp_SOURCES = vqtrainsp.c +vqtrainsp_LDADD = $(lib_LTLIBRARIES) +vqtrainsp_LDFLAGS = $(LIBS) genphdata_SOURCES = genphdata.c genphdata_LDADD = $(lib_LTLIBRARIES) genphdata_LDFLAGS = $(LIBS) +genampdata_SOURCES = genampdata.c +genampdata_LDADD = $(lib_LTLIBRARIES) +genampdata_LDFLAGS = $(LIBS) polar2rect_SOURCES = polar2rect.c polar2rect_LDADD = $(lib_LTLIBRARIES) polar2rect_LDFLAGS = $(LIBS) @@ -365,6 +380,9 @@ create_interleaver$(EXEEXT): $(create_interleaver_OBJECTS) $(create_interleaver_ extract$(EXEEXT): $(extract_OBJECTS) $(extract_DEPENDENCIES) @rm -f extract$(EXEEXT) $(LINK) $(extract_LDFLAGS) $(extract_OBJECTS) $(extract_LDADD) $(LIBS) +genampdata$(EXEEXT): $(genampdata_OBJECTS) $(genampdata_DEPENDENCIES) + @rm -f genampdata$(EXEEXT) + $(LINK) $(genampdata_LDFLAGS) $(genampdata_OBJECTS) $(genampdata_LDADD) $(LIBS) genlsp$(EXEEXT): $(genlsp_OBJECTS) $(genlsp_DEPENDENCIES) @rm -f genlsp$(EXEEXT) $(LINK) $(genlsp_LDFLAGS) $(genlsp_OBJECTS) $(genlsp_LDADD) $(LIBS) @@ -413,6 +431,9 @@ vqtrainjnd$(EXEEXT): $(vqtrainjnd_OBJECTS) $(vqtrainjnd_DEPENDENCIES) vqtrainph$(EXEEXT): $(vqtrainph_OBJECTS) $(vqtrainph_DEPENDENCIES) @rm -f vqtrainph$(EXEEXT) $(LINK) $(vqtrainph_LDFLAGS) $(vqtrainph_OBJECTS) $(vqtrainph_LDADD) $(LIBS) +vqtrainsp$(EXEEXT): $(vqtrainsp_OBJECTS) $(vqtrainsp_DEPENDENCIES) + @rm -f vqtrainsp$(EXEEXT) + $(LINK) $(vqtrainsp_LDFLAGS) $(vqtrainsp_OBJECTS) $(vqtrainsp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -432,6 +453,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genampdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genphdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genres.Po@am__quote@ @@ -459,6 +481,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainjnd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainph.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vqtrainsp.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ diff --git a/codec2-dev/unittest/README b/codec2-dev/unittest/README index f6134094..0e8776b7 100644 --- a/codec2-dev/unittest/README +++ b/codec2-dev/unittest/README @@ -32,3 +32,12 @@ Training (experimental) sparse phase VQs: $ ./vqtrainph train_phtrainr.flt 20 1024 vq.txt Ouput is vq.txt + +Tests +----- + ++ build up insmallest possible stesp ++ impl errors v alg errors ++ use actual phase data as codebook ++ test vq with rand phases first or known data + diff --git a/codec2-dev/unittest/genampdata.c b/codec2-dev/unittest/genampdata.c new file mode 100644 index 00000000..d7347fc2 --- /dev/null +++ b/codec2-dev/unittest/genampdata.c @@ -0,0 +1,104 @@ +/* + genampdata.c + + Generates test sparse amplitude data for vqtrainsp testing. +*/ + +#include +#include +#include +#include +#include +#include +#include "../src/defines.h" + +typedef struct { + float real; + float imag; +} COMP; + +#define NVEC 200000 +#define D 2 +#define E 8 + +int main(void) { + FILE *f=fopen("testamp.flt", "wb"); + int i, j, m, L, index; + float amp, noisey_amp, pitch, Wo; + float sparse_pe[MAX_AMP]; + + #ifdef TEST1 + /* D fixed amplitude vectors of E elements long, + with D=2, E=8: + + $ ./vqtrainsp testamp.flt 2 8 test.txt + + test.txt should be same as training data. + */ + for(i=0; i diff --git a/codec2-dev/unittest/vqtrainph.c b/codec2-dev/unittest/vqtrainph.c index 2bac5525..f8e016da 100644 --- a/codec2-dev/unittest/vqtrainph.c +++ b/codec2-dev/unittest/vqtrainph.c @@ -180,7 +180,7 @@ int main(int argc, char *argv[]) { for(i=0; i. +*/ + +/*-----------------------------------------------------------------------*\ + + INCLUDES + +\*-----------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include + +typedef struct { + float real; + float imag; +} COMP; + +/*-----------------------------------------------------------------------* \ + + DEFINES + +\*-----------------------------------------------------------------------*/ + +#define DELTAQ 0.01 /* quiting distortion */ +#define MAX_STR 80 /* maximum string length */ + +/*-----------------------------------------------------------------------*\ + + FUNCTION PROTOTYPES + +\*-----------------------------------------------------------------------*/ + +void zero(float v[], int d); +void acc(float v1[], float v2[], int d); +void norm(float v[], int k, int n[]); +int quantise(float cb[], float vec[], int d, int e, float *se); +void print_vec(float cb[], int d, int e); + +/*-----------------------------------------------------------------------* \ + + MAIN + +\*-----------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) { + int d,e; /* dimension and codebook size */ + float *vec; /* current vector */ + float *cb; /* vector codebook */ + float *cent; /* centroids for each codebook entry */ + int *n; /* number of vectors in this interval */ + int J; /* number of vectors in training set */ + int ind; /* index of current vector */ + float se; /* total squared error for this iteration */ + float var; /* variance */ + float var_1; /* previous variance */ + float delta; /* improvement in distortion */ + FILE *ftrain; /* file containing training set */ + FILE *fvq; /* file containing vector quantiser */ + int ret; + int i,j, finished, iterations; + float sd; + int var_n; + + /* Interpret command line arguments */ + + if (argc != 5) { + printf("usage: %s TrainFile D(dimension) E(number of entries) VQFile\n", argv[0]); + exit(1); + } + + /* Open training file */ + + ftrain = fopen(argv[1],"rb"); + if (ftrain == NULL) { + printf("Error opening training database file: %s\n",argv[1]); + exit(1); + } + + /* determine k and m, and allocate arrays */ + + d = atoi(argv[2]); + e = atoi(argv[3]); + printf("\n"); + printf("dimension D=%d number of entries E=%d\n", d, e); + vec = (float*)malloc(sizeof(float)*d); + cb = (float*)malloc(sizeof(float)*d*e); + cent = (float*)malloc(sizeof(float)*d*e); + n = (int*)malloc(sizeof(int)*d*e); + if (cb == NULL || cb == NULL || cent == NULL || vec == NULL) { + printf("Error in malloc.\n"); + exit(1); + } + + /* determine size of training set */ + + J = 0; + var_n = 0; + while(fread(vec, sizeof(float), d, ftrain) == (size_t)d) { + for(j=0; j 1) { + if (var > 0.0) { + delta = (var_1 - var)/var; + } + else + delta = 0; + if (delta < DELTAQ) + finished = 1; + } + + /* determine new codebook from centroids */ + + for(i=0; i