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){
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;
}
/* 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;
}
}
}
}
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++)
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);