From 89ba7eb6dea930a4ec684d201b0d6db0027f8a23 Mon Sep 17 00:00:00 2001 From: Monty Date: Tue, 28 Dec 1999 03:41:58 +0000 Subject: [PATCH] Incremental update, seperated weighting from the metric (optimization), added auxiliary point data to the training sets. Monty svn path=/trunk/vorbis/; revision=211 --- vq/Makefile.in | 4 +++- vq/build.c | 8 +++---- vq/lspdata.c | 70 ++++++++++++++++++++++++++++++++++++---------------------- vq/train.c | 21 +++++++++--------- vq/vqext.h | 6 +++-- vq/vqgen.c | 28 +++++++++++++++++------ vq/vqgen.h | 20 +++++++++++------ 7 files changed, 99 insertions(+), 58 deletions(-) diff --git a/vq/Makefile.in b/vq/Makefile.in index 137f8cd..5833cbf 100644 --- a/vq/Makefile.in +++ b/vq/Makefile.in @@ -1,4 +1,4 @@ -# $Id: Makefile.in,v 1.2 1999/12/17 13:19:30 xiphmont Exp $ +# $Id: Makefile.in,v 1.3 1999/12/28 03:41:52 xiphmont Exp $ ############################################################################### # # @@ -52,6 +52,8 @@ $(ALLOFILES): $(HFILES) .c.o: $(CC) $(CFLAGS) -c $< +$(OFILES): $(HFILES) + clean: -rm -f *.o *.a test* *~ *.out *.m config.* \ lspvqtrain diff --git a/vq/build.c b/vq/build.c index 33530ea..3269923 100644 --- a/vq/build.c +++ b/vq/build.c @@ -78,7 +78,7 @@ int main(int argc,char *argv[]){ quant_meta q; int *quantlist=NULL; - int entries=-1,dim=-1; + int entries=-1,dim=-1,dummy; FILE *out=NULL; FILE *in=NULL; char *line,*name; @@ -122,13 +122,13 @@ int main(int argc,char *argv[]){ line=rline(in,out,1); line=rline(in,out,1); - if(sscanf(line,"%d %d",&entries,&dim)!=2){ + if(sscanf(line,"%d %d %d",&entries,&dim,&dummy)!=2){ fprintf(stderr,"Syntax error reading book file\n"); exit(1); } /* just use it to allocate mem */ - vqgen_init(&v,dim,entries,NULL); + vqgen_init(&v,dim,0,entries,NULL,NULL); /* quant */ line=rline(in,out,1); @@ -170,7 +170,7 @@ int main(int argc,char *argv[]){ sscanf(line,"%lf",b+k); } if(feof(in))break; - vqgen_addpoint(&v,b); + vqgen_addpoint(&v,b,NULL); } v.entries=entries; } diff --git a/vq/lspdata.c b/vq/lspdata.c index 14275cb..0914b05 100644 --- a/vq/lspdata.c +++ b/vq/lspdata.c @@ -18,6 +18,7 @@ ********************************************************************/ +#include #include #include #include "vqgen.h" @@ -25,6 +26,7 @@ char *vqext_booktype="LSPdata"; quant_meta q={0,0,0,1}; /* set sequence data */ +int vqext_aux=1; /* LSP training metric. We weight error proportional to distance *between* LSP vector values. The idea of this metric is not to set @@ -33,41 +35,54 @@ quant_meta q={0,0,0,1}; /* set sequence data */ features. */ double global_maxdel=M_PI; -#define FUDGE ((global_maxdel*2.0)-testdist) +#define FUDGE ((global_maxdel*2.0)-weight[i]) +double *weight=NULL; + +double *vqext_weight(vqgen *v,double *p){ + int i; + int el=v->elements; + double lastp=0.; + for(i=0;ielements; double acc=0.; - /*double lasta=0.;*/ - double lastb=0.; for(i=0;i0){ - int i; - double base=b[start-1]; - for(i=start;i0)base=b[start-1]; + for(i=0;icols) /* +aux */ + a[i]=M_PI-base; + else + a[i]=b[i+start]-base; + + vqgen_addpoint(v,a,a+dim); } /* we just need to calc the global_maxdel from the training set */ @@ -75,12 +90,15 @@ void vqext_preprocess(vqgen *v){ long j,k; global_maxdel=0.; - for(j=0;jentries;j++){ + for(j=0;jpoints;j++){ double last=0.; - for(k=0;kelements;k++){ - double now=_now(v,j)[k]; - if(now-last>global_maxdel)global_maxdel=now-last; - last=now; + for(k=0;kelements+v->aux;k++){ + double p=_point(v,j)[k]; + if(p-last>global_maxdel)global_maxdel=p-last; + last=p; } } + + weight=malloc(sizeof(double)*v->elements); } + diff --git a/vq/train.c b/vq/train.c index 8f982b4..c67e4e7 100644 --- a/vq/train.c +++ b/vq/train.c @@ -156,12 +156,12 @@ int main(int argc,char *argv[]){ } line=rline(in,out,1); - if(sscanf(line,"%d %d",&entries,&dim)!=2){ + if(sscanf(line,"%d %d %d",&entries,&dim,&vqext_aux)!=3){ fprintf(stderr,"Syntax error reading book file\n"); exit(1); } - vqgen_init(&v,dim,entries,vqext_metric); + vqgen_init(&v,dim,vqext_aux,entries,vqext_metric,vqext_weight); init=1; /* quant setup */ @@ -196,13 +196,13 @@ int main(int argc,char *argv[]){ i=0; v.entries=0; /* hack to avoid reseeding */ while(1){ - for(k=0;k modifications by: Monty - last modification date: Dec 10 1999 + last modification date: Dec 27 1999 ********************************************************************/ @@ -69,9 +69,15 @@ double _dist_sq(vqgen *v,double *a, double *b){ return acc; } +double *_weight_null(vqgen *v,double *a){ + return a; +} + /* *must* be beefed up. */ void _vqgen_seed(vqgen *v){ - memcpy(v->entrylist,v->pointlist,sizeof(double)*v->entries*v->elements); + long i; + for(i=0;ientries;i++) + memcpy(_now(v,i),_point(v,i),sizeof(double)*v->elements); } /* External calls *******************************************************/ @@ -187,13 +193,14 @@ void vqgen_unquantize(vqgen *v,quant_meta *q){ } } -void vqgen_init(vqgen *v,int elements,int entries, - double (*metric)(vqgen *,double *, double *)){ +void vqgen_init(vqgen *v,int elements,int aux,int entries, + double (*metric)(vqgen *,double *, double *), + double *(*weight)(vqgen *,double *)){ memset(v,0,sizeof(vqgen)); v->elements=elements; v->allocated=32768; - v->pointlist=malloc(v->allocated*v->elements*sizeof(double)); + v->pointlist=malloc(v->allocated*(v->elements+v->aux)*sizeof(double)); v->entries=entries; v->entrylist=malloc(v->entries*v->elements*sizeof(double)); @@ -203,15 +210,22 @@ void vqgen_init(vqgen *v,int elements,int entries, v->metric_func=metric; else v->metric_func=_dist_sq; + if(weight) + v->weight_func=weight; + else + v->weight_func=_weight_null; + } -void vqgen_addpoint(vqgen *v, double *p){ +void vqgen_addpoint(vqgen *v, double *p,double *a){ if(v->points>=v->allocated){ v->allocated*=2; - v->pointlist=realloc(v->pointlist,v->allocated*v->elements*sizeof(double)); + v->pointlist=realloc(v->pointlist,v->allocated*(v->elements+v->aux)* + sizeof(double)); } memcpy(_point(v,v->points),p,sizeof(double)*v->elements); + if(v->aux)memcpy(_point(v,v->points)+v->elements,p,sizeof(double)*v->aux); v->points++; if(v->points==v->entries)_vqgen_seed(v); } diff --git a/vq/vqgen.h b/vq/vqgen.h index fafaf5f..a305659 100644 --- a/vq/vqgen.h +++ b/vq/vqgen.h @@ -17,6 +17,7 @@ typedef struct vqgen{ int it; int elements; + int aux; /* point cache */ double *pointlist; @@ -29,7 +30,8 @@ typedef struct vqgen{ double *bias; long entries; - double (*metric_func) (struct vqgen *v,double *a,double *b); + double (*metric_func) (struct vqgen *v,double *entry,double *point); + double *(*weight_func) (struct vqgen *v,double *point); } vqgen; typedef struct vqbook{ @@ -67,19 +69,23 @@ typedef struct { } quant_meta; static inline double *_point(vqgen *v,long ptr){ - return v->pointlist+(v->elements*ptr); + return v->pointlist+((v->elements+v->aux)*ptr); +} + +static inline double *_aux(vqgen *v,long ptr){ + return _point(v,ptr)+v->aux; } static inline double *_now(vqgen *v,long ptr){ return v->entrylist+(v->elements*ptr); } -extern void vqgen_init(vqgen *v,int elements,int entries, - double (*metric)(vqgen *,double *, double *)); -extern void vqgen_addpoint(vqgen *v, double *p); -extern double *vqgen_midpoint(vqgen *v); -extern double vqgen_iterate(vqgen *v); +extern void vqgen_init(vqgen *v,int elements,int aux,int entries, + double (*metric)(vqgen *,double *, double *), + double *(*weight)(vqgen *,double *)); +extern void vqgen_addpoint(vqgen *v, double *p,double *aux); +extern double vqgen_iterate(vqgen *v); extern void vqgen_unquantize(vqgen *v,quant_meta *q); extern void vqgen_quantize(vqgen *v,quant_meta *q); -- 2.7.4