1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-2000 *
9 * by Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: function calls to collect codebook metrics
15 last mod: $Id: metrics.c,v 1.2 2000/01/07 12:11:31 xiphmont Exp $
17 ********************************************************************/
27 double meanamplitude_acc=0.;
28 double meanamplitudesq_acc=0.;
29 double meanerror_acc=0.;
30 double meanerrorsq_acc=0.;
31 double meandev_acc=0.;
33 double *histogram=NULL;
34 double *histogram_error=NULL;
35 double *histogram_errorsq=NULL;
36 double *histogram_distance=NULL;
37 double *histogram_hi=NULL;
38 double *histogram_lo=NULL;
46 int histerrsort(const void *a, const void *b){
47 double av=histogram_distance[*((long *)a)];
48 double bv=histogram_distance[*((long *)b)];
53 void process_preprocess(codebook **bs,char *basename){
55 codebook *b=bs[books];
58 work=malloc(sizeof(double)*dim);
61 fprintf(stderr,"Each codebook in a cascade must have the same dimensional order\n");
69 codebook *b=bs[books-1];
70 histogram=calloc(b->entries,sizeof(double));
71 histogram_distance=calloc(b->entries,sizeof(double));
72 histogram_errorsq=calloc(b->entries*dim,sizeof(double));
73 histogram_error=calloc(b->entries*dim,sizeof(double));
74 histogram_hi=calloc(b->entries*dim,sizeof(double));
75 histogram_lo=calloc(b->entries*dim,sizeof(double));
77 fprintf(stderr,"Specify at least one codebook\n");
82 void process_postprocess(codebook **b,char *basename){
84 char *buffer=alloca(strlen(basename)+80);
85 codebook *bb=b[books-1];
87 fprintf(stderr,"Done. Processed %ld data points for %ld entries:\n",
88 (long)count,bb->entries);
89 fprintf(stderr,"\tglobal mean amplitude: %g\n",
90 meanamplitude_acc/(count*dim));
91 fprintf(stderr,"\tglobal mean squared amplitude: %g\n",
92 sqrt(meanamplitudesq_acc/(count*dim)));
94 fprintf(stderr,"\tglobal mean error: %g\n",
95 meanerror_acc/(count*dim));
96 fprintf(stderr,"\tglobal mean squared error: %g\n",
97 sqrt(meanerrorsq_acc/(count*dim)));
98 fprintf(stderr,"\tglobal mean deviation: %g\n",
99 meandev_acc/(count*dim));
103 sprintf(buffer,"%s-mse.m",basename);
104 out=fopen(buffer,"w");
106 fprintf(stderr,"Could not open file %s for writing\n",buffer);
110 for(i=0;i<bb->entries;i++){
111 for(k=0;k<bb->dim;k++){
112 fprintf(out,"%ld, %g, %g\n",
113 i*bb->dim+k,(bb->valuelist+i*bb->dim)[k],
114 sqrt((histogram_errorsq+i*bb->dim)[k]/histogram[i]));
119 sprintf(buffer,"%s-me.m",basename);
120 out=fopen(buffer,"w");
122 fprintf(stderr,"Could not open file %s for writing\n",buffer);
126 for(i=0;i<bb->entries;i++){
127 for(k=0;k<bb->dim;k++){
128 fprintf(out,"%ld, %g, %g\n",
129 i*bb->dim+k,(bb->valuelist+i*bb->dim)[k],
130 sqrt((histogram_error+i*bb->dim)[k]/histogram[i]));
135 sprintf(buffer,"%s-worst.m",basename);
136 out=fopen(buffer,"w");
138 fprintf(stderr,"Could not open file %s for writing\n",buffer);
142 for(i=0;i<bb->entries;i++){
143 for(k=0;k<bb->dim;k++){
144 fprintf(out,"%ld, %g, %g, %g\n",
145 i*bb->dim+k,(bb->valuelist+i*bb->dim)[k],
146 (bb->valuelist+i*bb->dim)[k]+(histogram_lo+i*bb->dim)[k],
147 (bb->valuelist+i*bb->dim)[k]+(histogram_hi+i*bb->dim)[k]);
155 long *index=alloca(sizeof(long)*bb->entries);
156 sprintf(buffer,"%s-distance.m",basename);
157 out=fopen(buffer,"w");
159 fprintf(stderr,"Could not open file %s for writing\n",buffer);
162 for(j=0;j<bb->entries;j++){
163 if(histogram[j])histogram_distance[j]/=histogram[j];
167 qsort(index,bb->entries,sizeof(long),histerrsort);
169 for(j=0;j<bb->entries;j++)
170 for(k=0;k<histogram[index[j]];k++)
171 fprintf(out,"%g,\n",histogram_distance[index[j]]);
178 void process_vector(codebook **bs,double *a){
186 memcpy(work,a,sizeof(double)*dim);
188 for(bi=0;bi<books;bi++){
190 entry=codebook_entry(b,work);
191 e=b->valuelist+b->dim*entry;
192 for(i=0;i<b->dim;i++)work[i]-=e[i];
196 double error=work[i];
197 if(bs[0]->q_sequencep){
203 meanamplitude_acc+=fabs(amplitude);
204 meanamplitudesq_acc+=amplitude*amplitude;
205 meanerror_acc+=fabs(error);
206 meanerrorsq_acc+=error*error;
209 meandev_acc+=fabs(error/amplitude);
211 meandev_acc+=fabs(error); /* yeah, yeah */
213 histogram_errorsq[entry*dim+i]+=error*error;
214 histogram_error[entry*dim+i]+=fabs(error);
215 if(histogram[entry]==0 || histogram_hi[entry*dim+i]<error)
216 histogram_hi[entry*dim+i]=error;
217 if(histogram[entry]==0 || histogram_lo[entry*dim+i]>error)
218 histogram_lo[entry*dim+i]=error;
219 distance+=error*error;
223 histogram_distance[entry]+=sqrt(distance);
225 if((long)(count++)%100)spinnit("working.... lines: ",count);
228 void process_usage(void){
230 "usage: vqmetrics <codebook>.vqh datafile.vqd [datafile.vqd]...\n\n"
231 " data can be taken on stdin. Output goes to output files:\n"
232 " basename-me.m: gnuplot: mean error by entry value\n"
233 " basename-mse.m: gnuplot: mean square error by entry value\n"
234 " basename-worst.m: gnuplot: worst error by entry value\n"
235 " basename-distance.m: gnuplot file showing distance probability\n"