Mercurial > pygar
view tools/audio_processor_test/compare_wavs_freq/compare_wavs_freq.cpp @ 55:d0db18cdeacc pygar svn.56
[svn r56] added submodule
author | punk |
---|---|
date | Sun, 09 May 2010 17:47:21 -0400 |
parents | 90197e3375e2 |
children |
line wrap: on
line source
1 #include <stdio.h>2 #include <assert.h>3 #include <string.h>4 #include <sndfile.h>5 #include <stdlib.h>7 // foreward declaration. This is defined in DFT.cpp8 int DFT(int dir,int m,double *x1,double *y1);9 const int Points = 32;10 const int Window = 32;12 void BubbleSort(double* arr, int* idxs)13 {14 int i, j, flag = 1;15 double temp;16 int tmp1;17 for(i = 1; (i <= Points) && flag; i++)18 {19 flag = 0;20 for (j=0; j < (Points -1); j++)21 {22 if (arr[j+1] > arr[j])23 {24 temp = arr[j];25 tmp1 = idxs[j];26 arr[j] = arr[j+1];27 idxs[j] = idxs[j+1];28 arr[j+1] = temp;29 idxs[j+1] = tmp1;30 flag = 1;31 }32 }33 }34 }36 int37 do_check (int drop, int argc, char * argv [])38 {39 int margin_of_error;40 SNDFILE* goldenWavFile;41 SNDFILE* outputWavFile;42 SF_INFO goldenInfo ;43 SF_INFO outputInfo ;44 short int buffA[Points];45 short int buffB[Points];46 double drA[Window][Points];47 double drB[Window][Points];48 double diA[Points];49 double diB[Points];51 memset (&goldenInfo, 0, sizeof (goldenInfo)) ;52 memset (&outputInfo, 0, sizeof (outputInfo)) ;54 margin_of_error = atoi(argv[1]);56 printf("Checking for Margin of Error %d\n", margin_of_error);58 goldenWavFile = sf_open(argv[2], SFM_READ, &goldenInfo);59 if (goldenWavFile == NULL){60 printf ("\nERROR : failed Not able to open wav file named '%s' : %s/\n", argv[2], sf_strerror (NULL)) ;61 exit (1) ;62 }64 outputWavFile = sf_open(argv[3], SFM_READ, &outputInfo);65 if (outputWavFile == NULL){66 printf ("\nERROR : failed Not able to open wav file named '%s' : %s/\n", argv[3], sf_strerror (NULL)) ;67 exit (1) ;68 }70 int max_diff = 0;72 // it is possible that the modified pipeline might introduce a few73 // dummy tokens at the beginning of the stream, we'll just drop them74 for(int i = 0; i < drop; i++){75 sf_read_short(outputWavFile, buffB, 1);76 }78 int count=0;80 while(sf_read_short(goldenWavFile, buffA, Points)==Points){82 if(sf_read_short(outputWavFile, buffB, Points) != Points){83 // the streams are of different length84 printf("failed (length)\n");85 exit(0);86 }88 int wptr = count%Window;90 for(int i = 0; i < Points; i++){91 diA[i] = 0.0;92 diB[i] = 0.0;93 drA[wptr][i] = (double)buffA[i];94 drB[wptr][i] = (double)buffB[i];95 }97 DFT(1,Points,drA[wptr],diA);98 DFT(1,Points,drB[wptr],diB);100 //for(int i = 0; i < Points; i++)101 // printf("%10d %10d\n", (int)drA[wptr][i], (int)drB[wptr][i]);102 //printf("\n");104 if (count >= Window){105 double avgA[Points];106 double avgB[Points];108 // reset averages to zero109 for(int i = 0; i < Points; i++){110 avgA[i] = 0.0;111 avgB[i] = 0.0;112 }114 // compute the averages in each bin115 for(int i = 0; i < Window; i++){116 for(int j = 0; j < Points; j++){117 avgA[j] += drA[i][j];118 avgB[j] += drB[i][j];119 }120 }122 for(int i = 0; i < Points; i++){123 avgA[i] /= Window;124 avgB[i] /= Window;125 }128 // this sucks, as we really should be averaging, but i'm lazy130 //int idxsA[Points];131 //int idxsB[Points];133 //for(int i = 0; i < Points; i++){134 //idxsA[i] = i;135 //idxsB[i] = i;136 //}138 //BubbleSort(avgA, idxsA);139 //BubbleSort(avgB, idxsB);141 //for(int i = 0; i < 2; i++){142 //int td = (idxsA[i] > idxsB[i]) ? (idxsA[i] - idxsB[i]) : (idxsB[i] - idxsA[i]);143 //max_diff = (td > max_diff) ? td : max_diff;144 //}147 int scoreA = 0;148 int scoreB = 0;149 int threshold = 100;151 // this is brittle, but it works **for now**152 for(int i = 0; i < Points; i++){153 if(abs((int)avgA[i]) > threshold)154 scoreA++;155 if(abs((int)avgB[i]) > threshold)156 scoreB++;157 }159 printf("scoreA %d scoreB %d\n", scoreA, scoreB);161 int td = (scoreA > scoreB) ? (scoreA - scoreB) : (scoreB - scoreA);162 max_diff = (td > max_diff) ? td : max_diff;164 if(max_diff > margin_of_error){165 printf("max_diff %x on drop %d (count %d)\n", max_diff, drop,count);166 return 1;167 }169 }171 count++;172 }174 printf("max_diff %d on drop %d\n", max_diff, drop);176 if(((int)max_diff) > margin_of_error)177 return 1;178 else179 return 0;180 }182 int183 main(int argc, char* argv[])184 {185 for(int drop = 0; drop < 10; drop++){186 if(do_check(drop, argc, argv)==0){187 printf("passed on drop %d\n", drop);188 exit(0);189 }190 }191 printf("failed\n");192 exit(1);193 }