annotate src/libvorbis-1.3.3/vq/distribution.c @ 56:af97cad61ff0

Add updated build of PortAudio for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 03 Jan 2017 15:10:52 +0000
parents 05aa0afa9217
children
rev   line source
Chris@1 1 /********************************************************************
Chris@1 2 * *
Chris@1 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
Chris@1 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
Chris@1 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
Chris@1 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
Chris@1 7 * *
Chris@1 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 *
Chris@1 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
Chris@1 10 * *
Chris@1 11 ********************************************************************
Chris@1 12
Chris@1 13 function: utility for finding the distribution in a data set
Chris@1 14 last mod: $Id: distribution.c 16037 2009-05-26 21:10:58Z xiphmont $
Chris@1 15
Chris@1 16 ********************************************************************/
Chris@1 17
Chris@1 18 #include <stdlib.h>
Chris@1 19 #include <stdio.h>
Chris@1 20 #include <math.h>
Chris@1 21 #include <string.h>
Chris@1 22 #include <errno.h>
Chris@1 23 #include "bookutil.h"
Chris@1 24
Chris@1 25 /* command line:
Chris@1 26 distribution file.vqd
Chris@1 27 */
Chris@1 28
Chris@1 29 int ascend(const void *a,const void *b){
Chris@1 30 return(**((long **)a)-**((long **)b));
Chris@1 31 }
Chris@1 32
Chris@1 33 int main(int argc,char *argv[]){
Chris@1 34 FILE *in;
Chris@1 35 long lines=0;
Chris@1 36 float min;
Chris@1 37 float max;
Chris@1 38 long bins=-1;
Chris@1 39 int flag=0;
Chris@1 40 long *countarray;
Chris@1 41 long total=0;
Chris@1 42 char *line;
Chris@1 43
Chris@1 44 if(argv[1]==NULL){
Chris@1 45 fprintf(stderr,"Usage: distribution {data.vqd [bins]| book.vqh} \n\n");
Chris@1 46 exit(1);
Chris@1 47 }
Chris@1 48 if(argv[2]!=NULL)
Chris@1 49 bins=atoi(argv[2])-1;
Chris@1 50
Chris@1 51 in=fopen(argv[1],"r");
Chris@1 52 if(!in){
Chris@1 53 fprintf(stderr,"Could not open input file %s\n",argv[1]);
Chris@1 54 exit(1);
Chris@1 55 }
Chris@1 56
Chris@1 57 if(strrchr(argv[1],'.') && strcmp(strrchr(argv[1],'.'),".vqh")==0){
Chris@1 58 /* load/decode a book */
Chris@1 59
Chris@1 60 codebook *b=codebook_load(argv[1]);
Chris@1 61 static_codebook *c=(static_codebook *)(b->c);
Chris@1 62 float delta;
Chris@1 63 int i;
Chris@1 64 fclose(in);
Chris@1 65
Chris@1 66 switch(c->maptype){
Chris@1 67 case 0:
Chris@1 68 printf("entropy codebook only; no mappings\n");
Chris@1 69 exit(0);
Chris@1 70 break;
Chris@1 71 case 1:
Chris@1 72 bins=_book_maptype1_quantvals(c);
Chris@1 73 break;
Chris@1 74 case 2:
Chris@1 75 bins=c->entries*c->dim;
Chris@1 76 break;
Chris@1 77 }
Chris@1 78
Chris@1 79 max=min=_float32_unpack(c->q_min);
Chris@1 80 delta=_float32_unpack(c->q_delta);
Chris@1 81
Chris@1 82 for(i=0;i<bins;i++){
Chris@1 83 float val=c->quantlist[i]*delta+min;
Chris@1 84 if(val>max)max=val;
Chris@1 85 }
Chris@1 86
Chris@1 87 printf("Minimum scalar value: %f\n",min);
Chris@1 88 printf("Maximum scalar value: %f\n",max);
Chris@1 89
Chris@1 90 switch(c->maptype){
Chris@1 91 case 1:
Chris@1 92 {
Chris@1 93 /* lattice codebook. dump it. */
Chris@1 94 int j,k;
Chris@1 95 long maxcount=0;
Chris@1 96 long **sort=calloc(bins,sizeof(long *));
Chris@1 97 long base=c->lengthlist[0];
Chris@1 98 countarray=calloc(bins,sizeof(long));
Chris@1 99
Chris@1 100 for(i=0;i<bins;i++)sort[i]=c->quantlist+i;
Chris@1 101 qsort(sort,bins,sizeof(long *),ascend);
Chris@1 102
Chris@1 103 for(i=0;i<b->entries;i++)
Chris@1 104 if(c->lengthlist[i]>base)base=c->lengthlist[i];
Chris@1 105
Chris@1 106 /* dump a full, correlated count */
Chris@1 107 for(j=0;j<b->entries;j++){
Chris@1 108 if(c->lengthlist[j]){
Chris@1 109 int indexdiv=1;
Chris@1 110 printf("%4d: ",j);
Chris@1 111 for(k=0;k<b->dim;k++){
Chris@1 112 int index= (j/indexdiv)%bins;
Chris@1 113 printf("%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+
Chris@1 114 _float32_unpack(c->q_min));
Chris@1 115 indexdiv*=bins;
Chris@1 116 }
Chris@1 117 printf("\t|");
Chris@1 118 for(k=0;k<base-c->lengthlist[j];k++)printf("*");
Chris@1 119 printf("\n");
Chris@1 120 }
Chris@1 121 }
Chris@1 122
Chris@1 123 /* do a rough count */
Chris@1 124 for(j=0;j<b->entries;j++){
Chris@1 125 int indexdiv=1;
Chris@1 126 for(k=0;k<b->dim;k++){
Chris@1 127 if(c->lengthlist[j]){
Chris@1 128 int index= (j/indexdiv)%bins;
Chris@1 129 countarray[index]+=(1<<(base-c->lengthlist[j]));
Chris@1 130 indexdiv*=bins;
Chris@1 131 }
Chris@1 132 }
Chris@1 133 }
Chris@1 134
Chris@1 135 /* dump the count */
Chris@1 136
Chris@1 137 {
Chris@1 138 long maxcount=0,i,j;
Chris@1 139 for(i=0;i<bins;i++)
Chris@1 140 if(countarray[i]>maxcount)maxcount=countarray[i];
Chris@1 141
Chris@1 142 for(i=0;i<bins;i++){
Chris@1 143 int ptr=sort[i]-c->quantlist;
Chris@1 144 int stars=rint(50./maxcount*countarray[ptr]);
Chris@1 145 printf("%+08f (%8ld) |",c->quantlist[ptr]*delta+min,countarray[ptr]);
Chris@1 146 for(j=0;j<stars;j++)printf("*");
Chris@1 147 printf("\n");
Chris@1 148 }
Chris@1 149 }
Chris@1 150 }
Chris@1 151 break;
Chris@1 152 case 2:
Chris@1 153 {
Chris@1 154 /* trained, full mapping codebook. */
Chris@1 155 printf("Can't do probability dump of a trained [type 2] codebook (yet)\n");
Chris@1 156 }
Chris@1 157 break;
Chris@1 158 }
Chris@1 159 }else{
Chris@1 160 /* load/count a data file */
Chris@1 161
Chris@1 162 /* do it the simple way; two pass. */
Chris@1 163 line=setup_line(in);
Chris@1 164 while(line){
Chris@1 165 float code;
Chris@1 166 char buf[80];
Chris@1 167 lines++;
Chris@1 168
Chris@1 169 sprintf(buf,"getting min/max (%.2f::%.2f). lines...",min,max);
Chris@1 170 if(!(lines&0xff))spinnit(buf,lines);
Chris@1 171
Chris@1 172 while(!flag && sscanf(line,"%f",&code)==1){
Chris@1 173 line=strchr(line,',');
Chris@1 174 min=max=code;
Chris@1 175 flag=1;
Chris@1 176 }
Chris@1 177
Chris@1 178 while(line && sscanf(line,"%f",&code)==1){
Chris@1 179 line=strchr(line,',');
Chris@1 180 if(line)line++;
Chris@1 181 if(code<min)min=code;
Chris@1 182 if(code>max)max=code;
Chris@1 183 }
Chris@1 184
Chris@1 185 line=setup_line(in);
Chris@1 186 }
Chris@1 187
Chris@1 188 if(bins<1){
Chris@1 189 if((int)(max-min)==min-max){
Chris@1 190 bins=max-min;
Chris@1 191 }else{
Chris@1 192 bins=25;
Chris@1 193 }
Chris@1 194 }
Chris@1 195
Chris@1 196 printf("\r \r");
Chris@1 197 printf("Minimum scalar value: %f\n",min);
Chris@1 198 printf("Maximum scalar value: %f\n",max);
Chris@1 199
Chris@1 200 if(argv[2]){
Chris@1 201
Chris@1 202 printf("\n counting hits into %ld bins...\n",bins+1);
Chris@1 203 countarray=calloc(bins+1,sizeof(long));
Chris@1 204
Chris@1 205 rewind(in);
Chris@1 206 line=setup_line(in);
Chris@1 207 while(line){
Chris@1 208 float code;
Chris@1 209 lines--;
Chris@1 210 if(!(lines&0xff))spinnit("counting distribution. lines so far...",lines);
Chris@1 211
Chris@1 212 while(line && sscanf(line,"%f",&code)==1){
Chris@1 213 line=strchr(line,',');
Chris@1 214 if(line)line++;
Chris@1 215
Chris@1 216 code-=min;
Chris@1 217 code/=(max-min);
Chris@1 218 code*=bins;
Chris@1 219 countarray[(int)rint(code)]++;
Chris@1 220 total++;
Chris@1 221 }
Chris@1 222
Chris@1 223 line=setup_line(in);
Chris@1 224 }
Chris@1 225
Chris@1 226 /* make a pretty graph */
Chris@1 227 {
Chris@1 228 long maxcount=0,i,j;
Chris@1 229 for(i=0;i<bins+1;i++)
Chris@1 230 if(countarray[i]>maxcount)maxcount=countarray[i];
Chris@1 231
Chris@1 232 printf("\r \r");
Chris@1 233 printf("Total scalars: %ld\n",total);
Chris@1 234 for(i=0;i<bins+1;i++){
Chris@1 235 int stars=rint(50./maxcount*countarray[i]);
Chris@1 236 printf("%08f (%8ld) |",(max-min)/bins*i+min,countarray[i]);
Chris@1 237 for(j=0;j<stars;j++)printf("*");
Chris@1 238 printf("\n");
Chris@1 239 }
Chris@1 240 }
Chris@1 241 }
Chris@1 242
Chris@1 243 fclose(in);
Chris@1 244
Chris@1 245 }
Chris@1 246 printf("\nDone.\n");
Chris@1 247 exit(0);
Chris@1 248 }