rlm@23: #include rlm@23: #include rlm@23: #include rlm@23: #include rlm@23: #include rlm@23: rlm@23: // foreward declaration. This is defined in DFT.cpp rlm@23: int DFT(int dir,int m,double *x1,double *y1); rlm@23: const int Points = 32; rlm@23: const int Window = 32; rlm@23: rlm@23: void BubbleSort(double* arr, int* idxs) rlm@23: { rlm@23: int i, j, flag = 1; rlm@23: double temp; rlm@23: int tmp1; rlm@23: for(i = 1; (i <= Points) && flag; i++) rlm@23: { rlm@23: flag = 0; rlm@23: for (j=0; j < (Points -1); j++) rlm@23: { rlm@23: if (arr[j+1] > arr[j]) rlm@23: { rlm@23: temp = arr[j]; rlm@23: tmp1 = idxs[j]; rlm@23: arr[j] = arr[j+1]; rlm@23: idxs[j] = idxs[j+1]; rlm@23: arr[j+1] = temp; rlm@23: idxs[j+1] = tmp1; rlm@23: flag = 1; rlm@23: } rlm@23: } rlm@23: } rlm@23: } rlm@23: rlm@23: int rlm@23: do_check (int drop, int argc, char * argv []) rlm@23: { rlm@23: int margin_of_error; rlm@23: SNDFILE* goldenWavFile; rlm@23: SNDFILE* outputWavFile; rlm@23: SF_INFO goldenInfo ; rlm@23: SF_INFO outputInfo ; rlm@23: short int buffA[Points]; rlm@23: short int buffB[Points]; rlm@23: double drA[Window][Points]; rlm@23: double drB[Window][Points]; rlm@23: double diA[Points]; rlm@23: double diB[Points]; rlm@23: rlm@23: memset (&goldenInfo, 0, sizeof (goldenInfo)) ; rlm@23: memset (&outputInfo, 0, sizeof (outputInfo)) ; rlm@23: rlm@23: margin_of_error = atoi(argv[1]); rlm@23: rlm@23: printf("Checking for Margin of Error %d\n", margin_of_error); rlm@23: rlm@23: goldenWavFile = sf_open(argv[2], SFM_READ, &goldenInfo); rlm@23: if (goldenWavFile == NULL){ rlm@23: printf ("\nERROR : failed Not able to open wav file named '%s' : %s/\n", argv[2], sf_strerror (NULL)) ; rlm@23: exit (1) ; rlm@23: } rlm@23: rlm@23: outputWavFile = sf_open(argv[3], SFM_READ, &outputInfo); rlm@23: if (outputWavFile == NULL){ rlm@23: printf ("\nERROR : failed Not able to open wav file named '%s' : %s/\n", argv[3], sf_strerror (NULL)) ; rlm@23: exit (1) ; rlm@23: } rlm@23: rlm@23: int max_diff = 0; rlm@23: rlm@23: // it is possible that the modified pipeline might introduce a few rlm@23: // dummy tokens at the beginning of the stream, we'll just drop them rlm@23: for(int i = 0; i < drop; i++){ rlm@23: sf_read_short(outputWavFile, buffB, 1); rlm@23: } rlm@23: rlm@23: int count=0; rlm@23: rlm@23: while(sf_read_short(goldenWavFile, buffA, Points)==Points){ rlm@23: rlm@23: if(sf_read_short(outputWavFile, buffB, Points) != Points){ rlm@23: // the streams are of different length rlm@23: printf("failed (length)\n"); rlm@23: exit(0); rlm@23: } rlm@23: rlm@23: int wptr = count%Window; rlm@23: rlm@23: for(int i = 0; i < Points; i++){ rlm@23: diA[i] = 0.0; rlm@23: diB[i] = 0.0; rlm@23: drA[wptr][i] = (double)buffA[i]; rlm@23: drB[wptr][i] = (double)buffB[i]; rlm@23: } rlm@23: rlm@23: DFT(1,Points,drA[wptr],diA); rlm@23: DFT(1,Points,drB[wptr],diB); rlm@23: rlm@23: //for(int i = 0; i < Points; i++) rlm@23: // printf("%10d %10d\n", (int)drA[wptr][i], (int)drB[wptr][i]); rlm@23: //printf("\n"); rlm@23: rlm@23: if (count >= Window){ rlm@23: double avgA[Points]; rlm@23: double avgB[Points]; rlm@23: rlm@23: // reset averages to zero rlm@23: for(int i = 0; i < Points; i++){ rlm@23: avgA[i] = 0.0; rlm@23: avgB[i] = 0.0; rlm@23: } rlm@23: rlm@23: // compute the averages in each bin rlm@23: for(int i = 0; i < Window; i++){ rlm@23: for(int j = 0; j < Points; j++){ rlm@23: avgA[j] += drA[i][j]; rlm@23: avgB[j] += drB[i][j]; rlm@23: } rlm@23: } rlm@23: rlm@23: for(int i = 0; i < Points; i++){ rlm@23: avgA[i] /= Window; rlm@23: avgB[i] /= Window; rlm@23: } rlm@23: rlm@23: rlm@23: // this sucks, as we really should be averaging, but i'm lazy rlm@23: rlm@23: //int idxsA[Points]; rlm@23: //int idxsB[Points]; rlm@23: rlm@23: //for(int i = 0; i < Points; i++){ rlm@23: //idxsA[i] = i; rlm@23: //idxsB[i] = i; rlm@23: //} rlm@23: rlm@23: //BubbleSort(avgA, idxsA); rlm@23: //BubbleSort(avgB, idxsB); rlm@23: rlm@23: //for(int i = 0; i < 2; i++){ rlm@23: //int td = (idxsA[i] > idxsB[i]) ? (idxsA[i] - idxsB[i]) : (idxsB[i] - idxsA[i]); rlm@23: //max_diff = (td > max_diff) ? td : max_diff; rlm@23: //} rlm@23: rlm@23: rlm@23: int scoreA = 0; rlm@23: int scoreB = 0; rlm@23: int threshold = 100; rlm@23: rlm@23: // this is brittle, but it works **for now** rlm@23: for(int i = 0; i < Points; i++){ rlm@23: if(abs((int)avgA[i]) > threshold) rlm@23: scoreA++; rlm@23: if(abs((int)avgB[i]) > threshold) rlm@23: scoreB++; rlm@23: } rlm@23: rlm@23: printf("scoreA %d scoreB %d\n", scoreA, scoreB); rlm@23: rlm@23: int td = (scoreA > scoreB) ? (scoreA - scoreB) : (scoreB - scoreA); rlm@23: max_diff = (td > max_diff) ? td : max_diff; rlm@23: rlm@23: if(max_diff > margin_of_error){ rlm@23: printf("max_diff %x on drop %d (count %d)\n", max_diff, drop,count); rlm@23: return 1; rlm@23: } rlm@23: rlm@23: } rlm@23: rlm@23: count++; rlm@23: } rlm@23: rlm@23: printf("max_diff %d on drop %d\n", max_diff, drop); rlm@23: rlm@23: if(((int)max_diff) > margin_of_error) rlm@23: return 1; rlm@23: else rlm@23: return 0; rlm@23: } rlm@23: rlm@23: int rlm@23: main(int argc, char* argv[]) rlm@23: { rlm@23: for(int drop = 0; drop < 10; drop++){ rlm@23: if(do_check(drop, argc, argv)==0){ rlm@23: printf("passed on drop %d\n", drop); rlm@23: exit(0); rlm@23: } rlm@23: } rlm@23: printf("failed\n"); rlm@23: exit(1); rlm@23: }