void _fini() #endif { #ifdef XTRACT_FFT xtract_free_fft(); fftwf_cleanup(); #endif }
void _fini() #endif { xtract_free_fft(); }
map<char, vector<double> > soundFeatures::calcFeatures(string featString, int windowStart, int windowLength){ double mean, dev, zcr, hzcrr, kurtosis, skewness, variance, RMS, sharp, lpcc_order, loud; double s_var ,s_mean, s_dev, s_kur, s_skew, s_centroid; double spectrum[windowLength], autoCorr[windowLength+1], lpc[20], lpcc[15], mfcc[40], barkC[25]; int bark[26]; xtract_mel_filter mfccBank; map <string, bool> calcFeat; for(int k = 0; k < featString.size(); k++){ switch (featString[k]){ case 'a' : case 'b' : if(!calcFeat["zcr"]){ xtract[XTRACT_ZCR](wavData + windowStart, windowLength, NULL, &zcr); calcFeat["zcr"] = true; } if(featString[k]== 'a') result['a'] = vector<double>{zcr}; if(featString[k]== 'b'){ double tempZRC; double tempRes=0; double tempN= windowLength / subWindow; double tempAvg= zcr; for (int i=0; i < windowLength ; i+=subWindow){ xtract[XTRACT_ZCR](wavData+i+windowStart, subWindow, NULL, &tempZRC); if (tempZRC > 1.5 * tempAvg) tempRes++; } hzcrr = tempRes / (2*tempN); result['b'] = vector<double>{hzcrr}; } break; case 'c': case 'd': if(!calcFeat["scalars"]){ xtract[XTRACT_MEAN](wavData + windowStart, windowLength, NULL, &mean); xtract[XTRACT_VARIANCE](wavData + windowStart, windowLength, &mean, &variance); xtract[XTRACT_STANDARD_DEVIATION](wavData + windowStart, windowLength, &variance, &dev); calcFeat["scalars"] = true; } if(featString[k]== 'c'){ double temp_sca[2]={mean, dev}; xtract[XTRACT_KURTOSIS](wavData + windowStart, windowLength, temp_sca , &kurtosis); result['c'] = vector<double>{kurtosis}; } if(featString[k]== 'd'){ double temp_sca[2]={mean, dev}; xtract[XTRACT_SKEWNESS](wavData + windowStart, windowLength, temp_sca, &skewness); result['d'] = vector<double>{skewness}; } break; case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': if (!calcFeat["spectrum"]){ double temp1[4] = {(double)samplerate/windowLength, XTRACT_MAGNITUDE_SPECTRUM, 0.0f, 0.0f}; xtract_init_fft(windowLength, XTRACT_SPECTRUM); xtract[XTRACT_SPECTRUM](wavData + windowStart, windowLength, &temp1[0], &spectrum[0]); xtract_free_fft(); xtract[XTRACT_SPECTRAL_MEAN](spectrum, windowLength, NULL, &s_mean); xtract[XTRACT_SPECTRAL_VARIANCE](spectrum, windowLength, &s_mean, &s_var); xtract[XTRACT_SPECTRAL_STANDARD_DEVIATION](spectrum, windowLength, &s_var, &s_dev); calcFeat["spectrum"] = true; } if(featString[k]== 'e') result['e'] = vector<double>{s_mean}; if(featString[k]== 'f') result['f'] = vector<double>{s_var}; if(featString[k]== 'g') result['g'] = vector<double>{s_dev}; {//radi odvajanja deklaracije temp unutar samo ovog bloka double temp[2] = {s_mean, s_dev}; if(featString[k]== 'h'){ xtract[XTRACT_SPECTRAL_CENTROID](spectrum, windowLength, NULL, &s_centroid); result['h'] = vector<double>{s_centroid}; } if(featString[k]== 'i'){ xtract[XTRACT_SPECTRAL_KURTOSIS](spectrum, windowLength, temp, &s_kur); result['i'] = vector<double>{s_kur}; } if(featString[k]== 'j'){ xtract[XTRACT_SPECTRAL_SKEWNESS](spectrum, windowLength, temp, &s_skew);; result['j'] = vector<double>{s_skew}; } if(featString[k]== 'k'){ xtract[XTRACT_SHARPNESS](spectrum, windowLength/2, NULL, &sharp); result['k'] = vector<double>{sharp}; } } break; case 'l': if (!calcFeat["spectrum"]){ double temp1[4] = {(double)samplerate/windowLength, XTRACT_MAGNITUDE_SPECTRUM, 0.0f, 0.0f}; xtract_init_fft(windowLength, XTRACT_SPECTRUM); xtract[XTRACT_SPECTRUM](wavData + windowStart, windowLength, &temp1[0], &spectrum[0]); xtract_free_fft(); calcFeat["spectrum"] = true; } xtract_init_bark(windowLength/2, samplerate, bark); xtract[XTRACT_BARK_COEFFICIENTS](spectrum, windowLength/2, bark, barkC); calcFeat["bark"] = true; xtract[XTRACT_LOUDNESS](barkC, 10, NULL, &loud); result['l'] = vector<double>{loud}; break; case 'm': xtract[XTRACT_RMS_AMPLITUDE](wavData + windowStart, windowLength, NULL, &RMS); result['m'] = vector<double>{RMS}; break; case 'n': xtract[XTRACT_AUTOCORRELATION](wavData + windowStart, windowLength, NULL, autoCorr); xtract[XTRACT_LPC](autoCorr, 20, NULL, lpc); //lpcc_order = 15; //xtract[XTRACT_LPCC](lpc + 10, 10, &lpcc_order, lpcc); //result['n'] = vector<double>(lpcc, lpcc + (int)lpcc_order); result['n'] = vector<double>(lpc+20, lpc + 40); break; case 'o': if (!calcFeat["spectrum"]){ double temp1[4] = {(double)samplerate/windowLength, XTRACT_MAGNITUDE_SPECTRUM, 0.0f, 0.0f}; xtract_init_fft(windowLength, XTRACT_SPECTRUM); xtract[XTRACT_SPECTRUM](wavData + windowStart, windowLength, &temp1[0], &spectrum[0]); xtract_free_fft(); calcFeat["spectrum"] = true; } mfccBank.n_filters = 40; mfccBank.filters = (double **)malloc(40 * sizeof(double *)); for(int i = 0; i < 40; i++) mfccBank.filters[i] = (double *)malloc(windowLength * sizeof(double)); xtract_init_mfcc(windowLength/2, samplerate/2, XTRACT_EQUAL_GAIN, 20, samplerate/2, mfccBank.n_filters, mfccBank.filters); xtract[XTRACT_MFCC](spectrum, windowLength/2, &mfccBank, mfcc); for(int i = 0; i < 40; ++i) free(mfccBank.filters[i]); free(mfccBank.filters); result['o'] = vector<double>(mfcc, mfcc + 40); break; case 'p': if (!calcFeat["bark"]){ if (!calcFeat["spectrum"]){ double temp1[4] = {(double)samplerate/windowLength, XTRACT_MAGNITUDE_SPECTRUM, 0.0f, 0.0f}; xtract_init_fft(windowLength, XTRACT_SPECTRUM); xtract[XTRACT_SPECTRUM](wavData + windowStart, windowLength, &temp1[0], &spectrum[0]); xtract_free_fft(); calcFeat["spectrum"] = true; } xtract_init_bark(windowLength/2, samplerate, bark); xtract[XTRACT_BARK_COEFFICIENTS](spectrum, windowLength/2, bark, barkC); calcFeat["bark"] = true; } result['p'] = vector<double>(barkC, barkC + 24); break; } } return result; }
double* extractall(double* wavetable, long numFrames, double samplerate){ long size = 38+5*BLOCKSIZE+MFCC_FREQ_BANDS; double *FVec = (double*) malloc(size*sizeof(double)); long count=0; long i,n,j,k; int rv = XTRACT_SUCCESS; xtract_mel_filter mel_filters; /* get the F0 */ xtract[XTRACT_WAVELET_F0](wavetable, BLOCKSIZE, &samplerate, &f0); FVec[count++] = f0; //* get the F0 as a MIDI note xtract[XTRACT_MIDICENT](NULL, 0, &f0, &midicents); FVec[count++] = midicents; //* get the mean of the input xtract[XTRACT_MEAN](wavetable, BLOCKSIZE, NULL, &mean); FVec[count++] = mean; //MY-VARIANCE xtract[XTRACT_VARIANCE](wavetable, BLOCKSIZE, &mean, &variance); FVec[count++] = variance; //MY-STANDARD DEVIATION xtract[XTRACT_STANDARD_DEVIATION](wavetable, BLOCKSIZE, &variance, &stdDeviation); FVec[count++] = stdDeviation; //MY-AVERAGE DEVIATION xtract[XTRACT_AVERAGE_DEVIATION](wavetable, BLOCKSIZE, &mean, &avgDeviation); FVec[count++] = avgDeviation; //MY-SKEWNESS argd[0] = mean; argd[1] = stdDeviation; xtract[XTRACT_SKEWNESS](wavetable, BLOCKSIZE, argd, &skewness); FVec[count++] = skewness; //MY-KURTOSIS xtract[XTRACT_KURTOSIS](wavetable, BLOCKSIZE, argd, &kurtosis); FVec[count++] = kurtosis; //MY-ZERO CROSSING RATE xtract[XTRACT_ZCR](wavetable, BLOCKSIZE, NULL, &zcr); FVec[count++] = zcr; //MY-RMS AMPLITUDE xtract[XTRACT_RMS_AMPLITUDE](wavetable, BLOCKSIZE, NULL, &rmsAmplitude); FVec[count++] = rmsAmplitude; //MY-HIGHEST VALUE xtract[XTRACT_HIGHEST_VALUE](wavetable, BLOCKSIZE, NULL, &highestValue); FVec[count++] = highestValue; //MY-SUM xtract[XTRACT_SUM](wavetable, BLOCKSIZE, NULL, &sum); FVec[count++] = sum; //MY-CREST argd[0] = mean; argd[1] = highestValue; xtract[XTRACT_CREST](wavetable, BLOCKSIZE, argd, &crest); FVec[count++] = crest; //* get the lowest value in the input argd[0] = -.5; rv = xtract[XTRACT_LOWEST_VALUE](wavetable, BLOCKSIZE, argd, &lowest); FVec[count++] = lowest; //MY-AMDF xtract[XTRACT_AMDF](wavetable, BLOCKSIZE, NULL, amdf); for(k=0;k<BLOCKSIZE;k++) FVec[i++] = amdf[k]; //MY-ASDF xtract[XTRACT_ASDF](wavetable, BLOCKSIZE, NULL, asdf); for(k=0;k<BLOCKSIZE;k++) FVec[i++] = asdf[k]; //MY-DCT xtract[XTRACT_DCT](wavetable, BLOCKSIZE, NULL, dct); for(k=0;k<BLOCKSIZE;k++) FVec[i++] = dct[k]; //* create the window function window = xtract_init_window(BLOCKSIZE, XTRACT_HANN); xtract_windowed(wavetable, BLOCKSIZE, window, windowed); xtract_free_window(window); //* get the spectrum argd[0] = SAMPLERATE / (double)BLOCKSIZE; argd[1] = XTRACT_MAGNITUDE_SPECTRUM; argd[2] = 0.f; //* DC component - we expect this to zero for square wave argd[3] = 0.f; //* No Normalisation xtract_init_fft(BLOCKSIZE, XTRACT_SPECTRUM); xtract[XTRACT_SPECTRUM](windowed, BLOCKSIZE, &argd[0], spectrum); xtract_free_fft(); //MY_BARK // xtract_init_bark(BLOCKSIZE,samplerate,barkCoeff); // xtract[XTRACT_BARK_COEFFICIENTS](spectrum,BLOCKSIZE,barkCoeff,bark); //MY-SPECTRAL MEAN xtract[XTRACT_SPECTRAL_MEAN](spectrum, BLOCKSIZE, NULL, &specMean); FVec[count++] = specMean; //MY-SPECTRAL VARIANCE xtract[XTRACT_SPECTRAL_VARIANCE](spectrum, BLOCKSIZE, &specMean, &specVariance); FVec[count++] = specVariance; //MY-SPECTRAL STANDARD DEVIATION xtract[XTRACT_SPECTRAL_STANDARD_DEVIATION](spectrum, BLOCKSIZE, &specMean, &specStdDeviation); FVec[count++] = specStdDeviation; //xtract[XTRACT_SPECTRAL_AVERAGE_DEVIATION](spectrum, BLOCKSIZE, &specMean, &specAvgDeviation); //FVec[count++] = specAvgDeviation; //MY-SPECTRAL SKEWNESS argd[0] = specMean; argd[1] = specStdDeviation; xtract[XTRACT_SPECTRAL_SKEWNESS](spectrum, BLOCKSIZE, argd, &specSkewness); FVec[count++] = specSkewness; //MY-SPECTRAL KURTOSIS xtract[XTRACT_SPECTRAL_KURTOSIS](spectrum, BLOCKSIZE, argd, &specKurtosis); FVec[count++] = specKurtosis; xtract[XTRACT_SPECTRAL_CENTROID](spectrum, BLOCKSIZE, NULL, ¢roid); FVec[count++] = centroid; //MY-POWER xtract[XTRACT_POWER](spectrum, BLOCKSIZE, NULL, &power); FVec[count++] = power; //MY-SHARPNESS xtract[XTRACT_SHARPNESS](spectrum, BLOCKSIZE, NULL, &sharpness); FVec[count++] = sharpness; //MY-SPECTRAL SLOPE xtract[XTRACT_SPECTRAL_SLOPE](spectrum, BLOCKSIZE/2, NULL, &specSlope); FVec[count++] = specSlope; //MY-HPS xtract[XTRACT_HPS](spectrum, BLOCKSIZE, NULL, &hps); FVec[count++] = hps; //MY-FLATNESS xtract[XTRACT_FLATNESS](spectrum, BLOCKSIZE, NULL, &flatness); FVec[count++] = flatness; //MY-TONALITY xtract[XTRACT_TONALITY](NULL, NULL, &flatness, &tonality); FVec[count++] = tonality; argd[0] = SAMPLERATE / (double)BLOCKSIZE; argd[1] = 10.0; //* peak threshold as % of maximum peak xtract[XTRACT_PEAK_SPECTRUM](spectrum, BLOCKSIZE / 2, argd, peaks); argd[0] = f0; argd[1] = .3; //* harmonic threshold xtract[XTRACT_HARMONIC_SPECTRUM](peaks, BLOCKSIZE, argd, harmonics); //MY-ODD EVEN RATIO xtract[XTRACT_ODD_EVEN_RATIO](harmonics, BLOCKSIZE, NULL, &oddEvenRatio); FVec[count++] = oddEvenRatio; //MY-TRISTIMULUS-1 xtract[XTRACT_TRISTIMULUS_1](harmonics, BLOCKSIZE, NULL, &tristimulus1); FVec[count++] = tristimulus1; //MY-TRISTIMULUS-2 xtract[XTRACT_TRISTIMULUS_2](harmonics, BLOCKSIZE, NULL, &tristimulus2); FVec[count++] = tristimulus2; //MY-TRISTIMULUS-2 xtract[XTRACT_TRISTIMULUS_3](harmonics, BLOCKSIZE, NULL, &tristimulus3); FVec[count++] = tristimulus3; //MY-NOISINESS xtract[XTRACT_NOISINESS](NULL, NULL, harmonics, &noisiness); FVec[count++] = noisiness; //MY-SPECTRAL INHARMONICITY // xtract[XTRACT_SPECTRAL_INHARMONICITY](peaks, BLOCKSIZE, &f0, &specInharmonicity); // FVec[count++] = specInharmonicity; //MY-SPERAD // xtract[XTRACT_SPREAD](spectrum, BLOCKSIZE, NULL, &spread); // FVec[count++] = spread; //MY-AUTOCORRELATION and AUTOCORRELATION FFT // xtract[XTRACT_AUTOCORRELATION](wavetable, BLOCKSIZE, NULL, &autocorrelation); // FVec[count++] = autocorrelation; // printf("\nAutocorrelation : %f\n", autocorrelation); //xtract[XTRACT_AUTOCORRELATION_FFT](wavetable, BLOCKSIZE, NULL, &autocorrelationFFT); //FVec[count++] = autocorrelationFFT; for(k=0;k<BLOCKSIZE;k++) FVec[i++] = spectrum[k]; //* compute the MFCCs mel_filters.n_filters = MFCC_FREQ_BANDS; mel_filters.filters = (double **)malloc(MFCC_FREQ_BANDS * sizeof(double *)); for(n = 0; n < MFCC_FREQ_BANDS; ++n) { mel_filters.filters[n] = (double *)malloc(BLOCKSIZE * sizeof(double)); } xtract_init_mfcc(BLOCKSIZE >> 1, SAMPLERATE >> 1, XTRACT_EQUAL_GAIN, MFCC_FREQ_MIN, MFCC_FREQ_MAX, mel_filters.n_filters, mel_filters.filters); xtract_mfcc(spectrum, BLOCKSIZE >> 1, &mel_filters, mfccs); for(k=0;k<MFCC_FREQ_BANDS;k++) FVec[i++] = mfccs[k]; //* compute Spectral Flux argd[0] = SAMPLERATE / (BLOCKSIZE/2); argd[1] = XTRACT_MAGNITUDE_SPECTRUM; argd[2] = 0.f; //* DC component argd[3] = 0.f; //* No Normalisation xtract_init_fft(BLOCKSIZE/2, XTRACT_SPECTRUM); xtract_features_from_subframes(wavetable, BLOCKSIZE, XTRACT_SPECTRUM, argd, subframes); xtract_difference_vector(subframes, BLOCKSIZE, NULL, difference); argd[0] = 1.0; //* norm order argd[1] = XTRACT_POSITIVE_SLOPE; //* positive slope xtract_flux(difference, BLOCKSIZE/2, argd, &flux); FVec[i++] = flux; for(k=0;k<BLOCKSIZE;k++) FVec[i++] = peaks[k]; /* printf("\nF0: %f\n", f0); printf("\nMIDI cents: %f\n", midicents); printf("\nInput mean = %.5f\t%.5f\n", mean); //* We expect this to be zero for a square wave printf("\nVariance = %f\n",variance); printf("\nStandard Deviation = %f\n",stdDeviation); printf("\nAverage Deviation = %f\n",avgDeviation); printf("\nSkewness = %f\n",skewness); printf("\nKurtosis = %f\n",kurtosis); printf("\nZero Crossing Rate = %f\n",zcr); printf("\nRMS Amplitude = %f\n",rmsAmplitude); printf("\nHighest Value = %f\n",highestValue); printf("\nSum = %f\n", sum); printf("\nCrest = %f\n", crest); printf("\nLowest value = %.6f\n\n", lowest); for(n=0;n<BLOCKSIZE;n+=50) printf("\nAMDF[%d]: %f",n,amdf[n]); for(n=0;n<BLOCKSIZE;n+=50) printf("\nASDF[%d]: %f",n,asdf[n]); for(n=0;n<BLOCKSIZE;n+=50) printf("\nDCT[%d]: %f",n,dct[n]); // for(n=0;n<BLOCKSIZE;n+=1000) // printf("\nBARK[%d]: %f",n,bark[n]); printf("\nSpectral Mean: %f\n", specMean); printf("\nSpectral Variance: %f\n", specVariance); printf("\nSpectral Standard Deviation: %f\n", specStdDeviation); //printf("\nSpectral Average Deviation: %f\n", specAvgDeviation); printf("\nSpectral Skewness: %f\n", specSkewness); printf("\nSpectral Kurtosis: %f\n", specKurtosis); printf("\nSpectral Centroid: %f\n", centroid); printf("\nPower = %f\n",power); printf("\nSharpness = %f\n",sharpness); printf("\nSpectral Slope = %f\n",specSlope); printf("\nHPS = %f\n",hps); printf("\nFlatness: %f\n", flatness); printf("\nTonality: %f\n", tonality); printf("\nOdd Even Ratio : %f\n", oddEvenRatio); printf("\nTristimulus-1 : %f\n", tristimulus1); printf("\nTristimulus-2 : %f\n", tristimulus2); printf("\nTristimulus-3 : %f\n", tristimulus3); printf("\nNoisiness : %f\n", noisiness); // printf("\nSpectral Inharmonicity : %f\n", specInharmonicity); // printf("\nSpread : %f\n", spread); // printf("\nAutocorrelation fft : %f\n",autocorrelationFFT); printf("\nSpectrum:\n"); for(n = 0; n < (BLOCKSIZE >> 1); n+=1000) { printf("freq: %.1f\tamp: %.6f", spectrum[n + (BLOCKSIZE >> 1)], spectrum[n]); if (peaks[n + (BLOCKSIZE >> 1)] != 0.f) { printf("\tpeak:: freq: %.1f\tamp: %.6f\n", peaks[n + (BLOCKSIZE >> 1)], peaks[n]); } else { printf("\n"); } } printf("\n"); printf("MFCCs:\n"); for(n = 0; n < MFCC_FREQ_BANDS; ++n) { printf("band: %d\t", n); if(n < 10) { printf("\t"); } printf("coeff: %f\n", mfccs[n]); } printf("Flux: %f\n", flux);*/ //} // cleanup for(n = 0; n < MFCC_FREQ_BANDS; ++n) { free(mel_filters.filters[n]); } free(mel_filters.filters); return FVec; }