refinements. More accurate distance error, better fudge.
authorMonty <xiphmont@xiph.org>
Fri, 17 Dec 1999 02:25:05 +0000 (02:25 +0000)
committerMonty <xiphmont@xiph.org>
Fri, 17 Dec 1999 02:25:05 +0000 (02:25 +0000)
Monty

svn path=/trunk/vorbis/; revision=199

vq/lspdata.c
vq/vqgen.c

index 6c24603..434711f 100644 (file)
 char *vqext_booktype="LSPdata";
 
 /* LSP training metric.  We weight error proportional to distance
-   *between* LSP vector values */
+   *between* LSP vector values.  The idea of this metric is not to set
+   final cells, but get the midpoint spacing into a form conducive to
+   what we want, which is weighting toward preserving narrower
+   features. */
+
+double global_maxdel=M_PI;
+#define FUDGE ((global_maxdel*1.0)-testdist)
 
                             /* candidate,actual */
 double vqext_metric(vqgen *v,double *b, double *a){
@@ -34,17 +40,19 @@ double vqext_metric(vqgen *v,double *b, double *a){
   int el=v->elements;
   double acc=0.;
   double lasta=0.;
-  /*double lastb=0.;*/
+  double lastb=0.;
   for(i=0;i<el;i++){
-    double actualdist=(a[i]-lasta);
-    /*double testdist=(b[i]-lastb);
 
-      double disterr=fabs(testdist-actualdist);*/
-    double poserr=fabs(a[i]-b[i]);
-    acc+=poserr/actualdist;
+    /*    double needdist=(a[i]-lastb);
+         double actualdist=(a[i]-lasta);*/
+    double testdist=(b[i]-lastb);
+
+    double val=(a[i]-b[i])*FUDGE;
+
+    acc+=val*val;
 
-    lasta=a[i];
-    /*lastb=b[i];*/
+    /*lasta=a[i];*/
+    lastb=b[i];
   }
   return acc;
 }
@@ -107,11 +115,14 @@ quant_return vqext_quantize(vqgen *v,int quantbits){
 /* much easier :-) */
 void vqext_unquantize(vqgen *v,quant_return *q){
   long j,k;
+  if(global_maxdel==M_PI)global_maxdel=0.;
   for(j=0;j<v->entries;j++){
     double last=0.;
     for(k=0;k<v->elements;k++){
-      last=(_now(v,j)[k]+q->addtoquant)*q->delt+q->minval+last;
+      double del=(_now(v,j)[k]+q->addtoquant)*q->delt+q->minval;
+      last+=del;
       _now(v,j)[k]=last;
+      if(del>global_maxdel)global_maxdel=del;
     }
   }
 }
index 0c2f39f..e4fc2a2 100644 (file)
@@ -177,7 +177,7 @@ double vqgen_iterate(vqgen *v){
     }
       
     j=firstentry;
-    meterror+=firstmetric-v->bias[firstentry];
+    meterror+=sqrt(_dist_sq(v,_now(v,j),_point(v,i)));
     /* set up midpoints for next iter */
     if(v->assigned[j]++)
       for(k=0;k<v->elements;k++)
@@ -251,7 +251,7 @@ double vqgen_iterate(vqgen *v){
 
   asserror/=(v->entries*fdesired);
   fprintf(stderr,": dist %g(%g) metric error=%g \n",
-         asserror,fdesired,meterror/v->points);
+         asserror,fdesired,meterror/v->points/v->elements);
   v->it++;
   
   free(new);