void main(int argc, char *argv[]) { float *fftData,max; float *outData; float *freqList; float *freqMask; float *resData; float *fftPhases; FILE *input, *output, *resoutput; int filtering = 0, numFreqs = 0, itemp; int notDone,synth=0,verbose = 1, res = 0; long *peaks; float *magns; float temp,temp2,pitch,time,gain=1.0; double PI, phase = 0,delta; long length,maxloc,winWidth,numPeaks,before_peak,after_peak,temp3; long i,j,peak,newHop,total=0; short data; struct ffthdr fhdr = {".fft",256,256,256,0,44100}; // changed from 22050 struct ffthdr rfhdr; struct soundhdr hdr; fillheader(&hdr,44100); // changed from 22050 if (argc < 3) { printf("useage: peaksfft NUMPEAKS filein.fft [OPTIONS]\n"); printf(" OPTIONS: [-s synthfile.wav] [-q(uiet mode)]\n"); printf(" [-g gainMult] [-p pitchMult] [-t timeMult]\n"); printf(" [-k# killList or -f# filtList]\n"); printf(" killList is list of frequencies to disallow\n"); printf(" filtList is list of frequencies to only allow\n"); exit(0); } else { input = fopen(argv[2], "rb"); numPeaks = atoi(argv[1]); peaks = (long *) calloc(4,numPeaks+1); magns = (float *) calloc(4,numPeaks+1); pitch = 1.0; time = 1.0; i = 3; while (i < argc) { if (argv[i][1] == 's') { output = opensoundout(argv[i+1],&hdr); synth = 1; } if (argv[i][1] == 'p') { pitch = (float) atof(argv[i+1]); } if (argv[i][1] == 'r') { resoutput = fopen(argv[i+1], "wb"); // writing fft res = 1; } if (argv[i][1] == 't') { time = (float) atof(argv[i+1]); } if (argv[i][1] == 'q') { verbose = 0; } if (argv[i][1] == 'g') { gain = atof(argv[i+1]); } if (argv[i][1] == 'k') { filtering = -1; numFreqs = atoi(&argv[i][2]); freqList = (float *) malloc(4*numFreqs); for (j=0;j<numFreqs;j++) { freqList[j] = atof(argv[i+1]); i += 1; } } if (argv[i][1] == 'f') { filtering = 1; numFreqs = atoi(&argv[i][2]); freqList = (float *) malloc(4*numFreqs); for (j=0;j<numFreqs;j++) { freqList[j] = atof(argv[i+1]); i += 1; } } i += 1; } } if (input) { fread(&fhdr,4,6,input); length = fhdr.fftsize; fftData = (float *) malloc(4*length); fftPhases = (float *) malloc(4*length); winWidth = 2 * (fhdr.fftsize / fhdr.windowsize); //window main lobe width if (synth) { hdr.dlength = (long) (time * (float) fhdr.dlength * 2.0f); #ifdef LITTLENDIAN hdr.flength = hdr.dlength + 4; hdr.bytes_per_sec = fhdr.srate*2; #endif hdr.srate = fhdr.srate; PI = 4.*atan(1.0); delta = pitch * 2 * PI / (double) fhdr.fftsize; outData = (float *) calloc(4,(long) (time * (float) length)); } if (res) { resData = (float *) calloc(2, 4*fhdr.fftsize); srand(0); fwrite(&fhdr, 4, 6, resoutput); } if (filtering != 0) { length = fhdr.fftsize; freqMask = (float *) malloc(length/2 * 4); if (filtering == -1) { for (i=0;i<length/2;i++) freqMask[i] = 1.0; for (j=0;j<numFreqs;j++) { itemp = freqList[j]*length/fhdr.srate; for (i=itemp-winWidth;i<itemp+winWidth;i++) freqMask[i] = 0.0; } } else if (filtering == 1) { for (i=0;i<length/2;i++) freqMask[i] = 0.0; for (j=0;j<numFreqs;j++) { itemp = freqList[j]*length/fhdr.srate; i = itemp; // for (i=itemp-winWidth;i<itemp+winWidth;i++) freqMask[i] = 1.0; } } } while (fread(fftData,fhdr.fftsize,4,input)) { length = fhdr.fftsize; for (i=0;i<length/2;i++) { temp = fftData[i*2]; temp2 = fftData[i*2+1]; fftPhases[i] = (float) atan2(temp2, temp); // (Don't throw away phase) temp2 *= temp2; temp *= temp; fftData[i] = (float) sqrt(temp + temp2); // Throw away phase } length = length / 2; // and only look at magnitude if (filtering != 0) { for (i=0;i<length;i++) fftData[i] *= freqMask[i]; } for (i=0;i<winWidth;i++) { fftData[i] = 0; // null out low frequency terms } peak = 0; while (peak < numPeaks) { max = 0.0; maxloc = 0; for (i=0;i<length;i++) { if (fabs(fftData[i] > max)) { max = (float) fabs(fftData[i]); // why fabs? isn't it already +ve due to sqrt? maxloc = i; } } peaks[peak] = maxloc; magns[peak] = max; // find endpoints or something (figure it out yourself (each time)) for( temp3 = maxloc, temp2 = max; temp3 > 0 && fftData[temp3 - 1] <= temp2; temp2 = fftData[temp3--] ); before_peak = temp3; for( temp3 = maxloc, temp2 = max; temp3 < length-1 && fftData[temp3 + 1] <= temp2; temp2 = fftData[temp3++] ); after_peak = temp3; // line interpolation temp = (float) (fftData[after_peak] - fftData[before_peak]) / (after_peak - before_peak + 1); for (i = before_peak; i <= after_peak; i++) { fftData[i] = (float) fftData[before_peak] + temp * (i - before_peak); } /*if (maxloc >= winWidth) { before_peak = (float) fftData[maxloc-winWidth]; after_peak = (float) fftData[maxloc+winWidth]; temp = (after_peak - before_peak) / (2*winWidth); // slope /*for (i=maxloc-winWidth;i<maxloc+winWidth;i++) { fftData[i] = before_peak + temp*(i-maxloc+winWidth); //fftPhases[i] = 2 * PI * rand() / (RAND_MAX + 1.0); }*/ /* for (i=maxloc-winWidth;i<maxloc+winWidth;i++) { fftData[i] = 0; //fftPhases[i] = 2 * PI * rand() / (RAND_MAX + 1.0); } }*/ peak += 1; } if (numPeaks > 1) { notDone = 1; while (notDone) { notDone = 0; for (j=0;j<numPeaks-1;j++) { if (peaks[j] > peaks[j+1]) { if (peaks[j+1] > 0) { // sorting in increasing order of LOCATION (index) max = magns[j]; maxloc = peaks[j]; peaks[j] = peaks[j+1]; magns[j] = magns[j+1]; peaks[j+1] = maxloc; magns[j+1] = max; notDone = 1; } } } } } if (verbose) { for (i=0;i<numPeaks;i++) { printf("%li,%f ;",fhdr.srate * peaks[i] / fhdr.fftsize,magns[i]); } printf("\n\n"); } else printf("."); if (synth) { newHop = (long) (time * (float) fhdr.hopsize); for (i=0;i<newHop;i++) { outData[i] = outData[i+newHop]; } for (i=newHop;i<newHop*2;i++) { outData[i] = 0; } for (i=0;i<newHop*2;i++) { temp = 0.0; for (peak = 0;peak<numPeaks;peak++) { // what's going on temp += (float) (magns[peak] * cos(peaks[peak]*phase)); // here ??? } // :-( temp *= (1.0 - cos(PI * i / newHop)); // hanning window? outData[i] += temp; // (overlap) add data = (short) (gain * outData[i]); // the resynthesis? if (i < newHop) { // but how? fwrite(&data,2,1,output); // oh...i think i get it total += 1; // :-) } phase += delta; // temp /= fhdr.fftsize; } phase -= (delta * newHop); } if (res) { for (i = 0; i < length; i++) { // go ahead and write (if you can) temp = 2 * PI * rand() / (RAND_MAX + 1.0); //temp = fftPhases[i]; resData[2*i] = fftData[i] * cos(temp); resData[2*i + 1] = fftData[i] * sin(temp); //data = (short)resData[2*i]; //fwrite(&data, 2, 1, resoutput); //data = (short)resData[2*i + 1]; //fwrite(&data, 2, 1, resoutput); } fwrite(resData, 4, fhdr.fftsize, resoutput); } } printf("\n"); fclose(input); free(fftData); if (synth) { free(outData); closesoundout(output,total); } if (res) { free(resData); fclose(resoutput); } free(peaks); free(magns); if (filtering != 0) { free(freqList); free(freqMask); } } else { printf("Can't open input (or output) file!!\n"); } }
int main (int argc, char * argv[]) { fillheader(); getentirecommandline(argc, argv); args_init(argc, argv); srand((unsigned int)opt_seed); if (!opt_quiet) show_header(); if (opt_help) { cmd_help(); } else if (opt_lca_left) { cmd_lca_left(); } else if (opt_identical) { cmd_identical(); } else if (opt_root) { cmd_root(); } else if (opt_extract_ltips) { cmd_extract_ltips(); } else if (opt_extract_rtips) { cmd_extract_rtips(); } else if (opt_extract_tips) { cmd_extract_tips(); } else if (opt_prune_tips || opt_prune_random) { cmd_prune_tips(); } else if (opt_svg) { cmd_svg(); } else if (opt_extract_lsubtree) { cmd_extract_subtree(0); } else if (opt_extract_rsubtree) { cmd_extract_subtree(1); } else if (opt_treeshow) { cmd_tree_show(); } else if (opt_induce_subtree) { cmd_induce_tree(); } else if (opt_subtree_short >= 0) { cmd_subtree_short(); } else if (opt_info) { cmd_info(); } else if (opt_make_binary) { cmd_make_binary(); } else if (opt_alltree_filename) { cmd_utree_bf(); } else if (opt_randomtree_binary) { cmd_randomtree_binary(); } else if (opt_simulate_bd) { cmd_simulate_bd(); } else if (opt_attach_filename) { cmd_attach_tree(); } else if (opt_scalebranch) { cmd_scalebranch(); } free(cmdline); return (0); }