Mercurial > hg > batch-feature-extraction-tool
changeset 8:fdc592312a96
Vectorised Xcorr
author | Geogaddi\David <d.m.ronan@qmul.ac.uk> |
---|---|
date | Wed, 22 Jul 2015 15:28:00 +0100 |
parents | c6f38cba266d |
children | 262e084a15a9 |
files | Source/AudioSourceFeatureExtractor.cpp Source/AudioSourceFeatureExtractor.h Source/FFTW.h |
diffstat | 3 files changed, 290 insertions(+), 305 deletions(-) [+] |
line wrap: on
line diff
--- a/Source/AudioSourceFeatureExtractor.cpp Wed Jul 22 15:14:58 2015 +0100 +++ b/Source/AudioSourceFeatureExtractor.cpp Wed Jul 22 15:28:00 2015 +0100 @@ -364,46 +364,13 @@ } } -//void AudioSourceFeatureExtractor::ConvolveFunction(float* & z, float* x, float* y, size_t& lenz, size_t lenx, size_t leny) -//{ -// // computes cross-correlation of two vectors, takes 2 vectors of the same length and computes 2*length-1 lags -// -// //float *zptr, s, *xp, *yp; -// //size_t n_lo, n_hi; -// -// //lenz = lenx + leny - 1; -// -// //z = new float[lenz]; -// -// //zptr = z; -// -// //for (size_t i = 0; i < lenz; i++) -// //{ -// // s = 0.0; -// // n_lo = 0 > (i - leny + 1) ? 0 : (i - leny + 1); -// // n_hi = (lenx - 1) < i ? (lenx - 1) : i; -// // xp = &x[0] + n_lo; -// // yp = &y[0] + i - n_lo; -// -// // for (size_t n = n_lo; n <= n_hi; n++) -// // { -// // s += *xp * *yp; -// // xp++; -// // yp--; -// // } -// -// // *zptr = s; -// // zptr++; -// //} -//} - -void AudioSourceFeatureExtractor::XCorr(float*& output, float* input1, float* input2, size_t& outputlen, size_t inputlen, size_t maxLag = 0) +void AudioSourceFeatureExtractor::XCorr(std::vector<float>& output, std::vector<float> input1, std::vector<float> input2, size_t maxLag = 0) { // TODO: adapt for different sizes // find next power of 2 for efficient FFT size_t fftSize = 1; - while (fftSize < 2 * static_cast<size_t>(inputlen) - 1) + while (fftSize < 2 * static_cast<size_t>(input1.size()) - 1) { fftSize *= 2; } @@ -422,7 +389,7 @@ std::vector<float> out2Imag = std::vector<float>(fftSize, 0); // copy input to allocated arrays - for (size_t i = 0; i < static_cast<size_t>(inputlen); ++i) + for (size_t i = 0; i < static_cast<size_t>(input1.size()); ++i) { in1[i] = input1[i]; in2[i] = input2[i]; @@ -455,14 +422,12 @@ fftwf_destroy_plan(plan); // copy real part of result back to output array, normalize by FFT size - if (maxLag == 0 || maxLag >= static_cast<size_t>(inputlen)) + if (maxLag == 0 || maxLag >= static_cast<size_t>(input1.size())) { - maxLag = static_cast<size_t>(inputlen) - 1; + maxLag = static_cast<size_t>(input1.size()) - 1; } - - output = new float[2 * maxLag + 1]; - outputlen = 2 * maxLag + 1; + output = std::vector<float>(2 * maxLag + 1, 0); for (size_t i = fftSize - maxLag; i < fftSize; ++i) { @@ -481,24 +446,24 @@ float AudioSourceFeatureExtractor::EstimatePerdiodicity(float* data, size_t numSamples) { float periodicity = 0.0; - float* downsampleddata = new float[numSamples]; - memset(downsampleddata, 0, sizeof(float) * numSamples); - float* xcorr = nullptr; + + std::vector<float> downsampleddata = std::vector<float>(numSamples, 0); + + std::vector<float> xcorr; for (size_t k = 0; k < numSamples; k++) { downsampleddata[k] = data[k]; } - - - EnvelopeCurve(downsampleddata, downsampleddata, numSamples, m_fSampleRate); + + EnvelopeCurve(downsampleddata, downsampleddata, m_fSampleRate); int startLag = static_cast<int>(floor(static_cast<float>(60.0 / 480.0 * m_fSampleRate))); int endLag = static_cast<int>(floor(static_cast<float>(60.0 / 30.0 * m_fSampleRate))); - int thresh = static_cast<int>(floor(static_cast<float>(.2 * m_fSampleRate))); + int thresh = static_cast<int>(floor(static_cast<float>(0.2 * m_fSampleRate))); size_t xcorrlen = 0; - XCorr(xcorr, downsampleddata, downsampleddata, xcorrlen, numSamples, endLag); + XCorr(xcorr, downsampleddata, downsampleddata, endLag); int i = static_cast<int>(floor(xcorrlen / 2)); @@ -543,89 +508,17 @@ std::string dave = "Periodicity " + std::to_string(periodicity) + "\n"; //OutputDebugString(dave.c_str()); - if (xcorr != nullptr) - { - delete[] xcorr; - xcorr = nullptr; - } - - if (downsampleddata != nullptr) - { - delete[] downsampleddata; - downsampleddata = nullptr; - } - return periodicity; } -void AudioSourceFeatureExtractor::DownSampler(float* data, float* & out, size_t lenIn, size_t& lenOut, float currentSampleRate, float futureSampleRate) -{ - ////Low pass our data before we decimate - //const int filterlength = 101; - //float* tempdata = new float[lenIn]; - //memset(tempdata, 0, sizeof(float)*lenIn); - - ////Coefficients were taken from Matlab - //float coeffs[filterlength] ={2.0839274e-05f, 6.6880953e-06f,-4.7252855e-05f, -3.4874138e-05f, 7.8508412e-05f,9.7089069e-05f,-9.9197161e-05f, -0.00020412984f, 8.2261082e-05f, 0.00035689832f, 9.4890293e-06f, -0.00053820928f, -0.00021722882f, 0.00070567406f, 0.00057491515f, -0.00078844035f, -0.0010939316f, 0.00069057313f, 0.0017460365f, -0.00030308162f, -0.0024484061f, -0.00047496572f, 0.0030552838f, 0.0017078921f, -0.0033604759f, -0.0033912712f, 0.0031135236f, 0.0054217125f, -0.0020499325f, -0.0075746416f, -6.7239242e-05f, 0.0094950572f, 0.0034002098f, -0.010703080f, -0.0079918290f, 0.010610434f, 0.013732497f, -0.0085344436f, -0.020346783f, 0.0036776769f, 0.027405130f, 0.0050050775f, -0.034361813f, -0.019287759f, 0.040615436f, 0.043452863f,-0.045583628f, -0.093336113f, 0.048780452f, 0.31394306f, 0.45011634f, 0.31394306f, 0.048780452f,-0.093336113f,-0.045583628f, 0.043452863f,0.040615436f,-0.019287759f, -0.034361813f, 0.0050050775f, 0.027405130f,0.0036776769f,-0.020346783f, -0.0085344436f, 0.013732497f, 0.010610434f, -0.0079918290f, -0.010703080f, 0.0034002098f, 0.0094950572f, -6.7239242e-05f, -0.0075746416f, -0.0020499325f, 0.0054217125f, 0.0031135236f, -0.0033912712f, -0.0033604759f, 0.0017078921f, 0.0030552838f, -0.00047496572f, -0.0024484061f, -0.00030308162f, 0.0017460365f,0.00069057313f, -0.0010939316f, -0.00078844035f, 0.00057491515f, 0.00070567406f, -0.00021722882f, -0.00053820928f, 9.4890293e-06f, 0.00035689832f, 8.2261082e-05f, -0.00020412984f, -9.9197161e-05f, 9.7089069e-05f, 7.8508412e-05f, -3.4874138e-05f, -4.7252855e-05f, 6.6880953e-06f, 2.0839274e-05f}; - // - //float acc; // accumulator for MACs - // float* coeffp; // pointer to coefficients - // float* inputp; // pointer to input samples - //float* endp = &data[lenIn -1]; // pointer to last sample - // - // - // // apply the filter to each input sample - // for (size_t n = 0; n < lenIn; n++ ) - //{ - // // calculate output n - // coeffp = &coeffs[0]; - // inputp = &data[filterlength - 1 + n]; - - // acc = 0.0f; - // for (int k = 0; k < filterlength; k++ ) - // { - // if(inputp <= endp) - // acc += (*coeffp++) * (*inputp--); - // else - // { - // //When we reach the end of the buffer - // acc += (*coeffp++) * 0.0f; - // *inputp--; - // } - // } - - // tempdata[n] = acc; - // } - //int ratio = (int) (currentSampleRate / futureSampleRate); - // - //lenOut = lenIn / ratio; - - //out = new float[lenOut]; - //memset(out, 0, sizeof(float)*lenOut); - - - //int idx = 0; - //for(size_t i = 0; i < lenIn; i = i + ratio) - //{ - // out[idx] = tempdata[i]; - // idx++; - //} - - //if(tempdata != NULL) - //{ - // delete[] tempdata; - // tempdata = nullptr; - //} -} - -void AudioSourceFeatureExtractor::EnvelopeCurve(float* data, float* & out, size_t dataLen, float sampleRate) +void AudioSourceFeatureExtractor::EnvelopeCurve(std::vector<float> data, std::vector<float> & out, float sampleRate) { float release = 0.02f; float envelope = 0.0f; float gr = exp(-1 / (sampleRate * release)); - for (size_t i = 0; i < dataLen; i++) + for (size_t i = 0; i < data.size(); i++) { float EnvIn = abs(data[i]); @@ -643,22 +536,6 @@ } } -void AudioSourceFeatureExtractor::Normalise(float* data, float* & out, size_t len) -{ - //float maxvalue = std::numeric_limits<float>::lowest(); - - //for (size_t i = 0; i < len; i++) - //{ - // if (data[i] > maxvalue) - // maxvalue = data[i]; - //} - - //for (size_t i = 0; i < len; i++) - //{ - // out[i] = data[i] / maxvalue; - //} -} - float AudioSourceFeatureExtractor::EntropyOfEnergy(float* data, size_t len) { float totalEnergy = 0.0; @@ -690,166 +567,6 @@ return (totalentropy * -1); } -void AudioSourceFeatureExtractor::PDF_getResampleKrnl(std::vector<float> freqVec, float fsProc, int nfft, int nBin, std::vector<float>& outLogFreqVec, std::vector<std::vector<float>>& outKrnl) -{ - //float f1 = freqVec[0]; - //float f2 = freqVec[freqVec.size() - 1]; - - //outLogFreqVec = LinSpace(log(f1), log(f2), nBin); - //std::vector<float> f(nfft / 2, 0.0f); - - //for (size_t i = 0; i < static_cast<size_t>(nBin); i++) - //{ - // outKrnl.push_back(f); - //} - - //for (size_t i = 0; i < outLogFreqVec.size(); i++) - //{ - // outLogFreqVec[i] = exp(outLogFreqVec[i]); - //} - - //for (size_t i = 1; i < static_cast<size_t>(nBin) - 2; i++) - //{ - // float freqBinLin = outLogFreqVec[i] / (fsProc / nfft); - - // float nextBinUp = outLogFreqVec[i + 1] / (fsProc / nfft); - - // float nextBinDown = outLogFreqVec[i - 1] / (fsProc / nfft); - - // float filtWid = nextBinUp - nextBinDown; - - // if (filtWid <= 2) - // { - // // log resolution is finer than linear resolution - // // linear interpolation of neighboring bins - - // float binDown = floor(freqBinLin); - // float frac = freqBinLin - binDown; - // std::vector<float> filt(nfft / 2, 0.0f); - // filt[((int)binDown) - 1] = 1 - frac; - // filt[((int)binDown + 1) - 1] = frac; - // outKrnl[i][((int)binDown) - 1] = filt[((int)binDown) - 1]; - // outKrnl[i][((int)binDown + 1) - 1] = filt[((int)binDown + 1) - 1]; - // } - // else - // { - // float ceilNextBinDown = ceil(nextBinDown); - // float floorFreqBinLin = floor(freqBinLin); - // float ceilFreqBinLin = ceil(freqBinLin); - // float floorNextBinUp = floor(nextBinUp); - - // std::vector<int> idxLow; - // std::vector<int> idxHigh; - // std::vector<int> filtIdx; - - // for (size_t j = (size_t)ceilNextBinDown; j <= (size_t)floorFreqBinLin; j++) - // { - // idxLow.push_back(j); - // } - - // for (size_t j = (size_t)ceilFreqBinLin; j <= (size_t)floorNextBinUp; j++) - // { - // idxHigh.push_back(j); - // } - - // std::vector<int>::iterator it; - // it = std::unique(idxLow.begin(), idxLow.end()); - // idxLow.resize(std::distance(idxLow.begin(), it)); - - // it = std::unique(idxHigh.begin(), idxHigh.end()); - // idxHigh.resize(std::distance(idxHigh.begin(), it)); - - // filtIdx.reserve(idxLow.size() + idxHigh.size()); // preallocate memory - // filtIdx.insert(filtIdx.end(), idxLow.begin(), idxLow.end()); - // filtIdx.insert(filtIdx.end(), idxHigh.begin(), idxHigh.end()); - - // std::vector<float> rampUp; - // std::vector<float> rampDown; - // for (size_t j = 0; j < filtIdx.size(); j++) - // { - // rampUp.push_back(1 - (freqBinLin - filtIdx[j]) / (freqBinLin - nextBinDown)); - // rampDown.push_back(1 - (filtIdx[j] - freqBinLin) / (nextBinUp - freqBinLin)); - // } - - // std::vector<float> filt; - - // for (size_t j = 0; j < rampUp.size(); j++) - // { - // filt.push_back(std::min(rampUp[j], rampDown[j])); - // } - - // float sumfilt = 0.0f; - // for (size_t j = 0; j < filt.size(); j++) - // { - // sumfilt += filt[j]; - // } - - // for (size_t j = 0; j < filt.size(); j++) - // { - // filt[j] /= sumfilt; - // } - - // for (size_t j = 0; j < filtIdx.size(); j++) - // { - // outKrnl[i][filtIdx[j] - 1] = filt[j]; - // } - // } - //} - - // special routine for first bin - // get frequency in linear bins - - //float freqBinLin = outLogFreqVec[0] / (fsProc / (float)nfft); - //float binDown = floor(freqBinLin); - //float frac = freqBinLin - binDown; - - //std::vector<float> filt(nfft / 2, 0.0f); - //filt[((int)binDown) - 1] = 1 - frac; - //filt[((int)binDown + 1) - 1] = frac; - - //outKrnl[0][((int)binDown) - 1] = filt[((int)binDown) - 1]; - //outKrnl[0][((int)binDown + 1) - 1] = filt[((int)binDown + 1) - 1]; - - //// special routine for last bin - //// get frequency in linear bins - //freqBinLin = outLogFreqVec[outLogFreqVec.size() - 1] / (fsProc / nfft); - - //// get next lower bin - //float nextBinDown = outLogFreqVec[outLogFreqVec.size() - 2] / (fsProc / nfft); - - //float ceilNextBinDown = ceil(nextBinDown); //Subtract by -1 because of array - //float floorFreqBinLin = floor(freqBinLin); - - //std::vector<int> filtIdx; - - //for (size_t i = (size_t)ceilNextBinDown; i <= (size_t)floorFreqBinLin; i++) - //{ - // filtIdx.push_back(i); - //} - - //std::vector<float> filt2; - //for (size_t i = 0; i < filtIdx.size(); i++) - //{ - // filt2.push_back(1 - (freqBinLin - filtIdx[i]) / (freqBinLin - nextBinDown)); - //} - - //float sumfilt = 0.0f; - //for (size_t i = 0; i < filt2.size(); i++) - //{ - // sumfilt += filt2[i]; - //} - - //for (size_t i = 0; i < filt2.size(); i++) - //{ - // filt2[i] /= sumfilt; - //} - - //for (size_t j = 0; j < filtIdx.size(); j++) - //{ - // outKrnl[outKrnl.size() - 1][filtIdx[j] - 1] = filt2[j]; - //} -} - float AudioSourceFeatureExtractor::Log2(float n) { // log(n)/log(2) is log2. @@ -900,3 +617,274 @@ return v; } + +//void AudioSourceFeatureExtractor::ConvolveFunction(float* & z, float* x, float* y, size_t& lenz, size_t lenx, size_t leny) +//{ +// // computes cross-correlation of two vectors, takes 2 vectors of the same length and computes 2*length-1 lags +// +// //float *zptr, s, *xp, *yp; +// //size_t n_lo, n_hi; +// +// //lenz = lenx + leny - 1; +// +// //z = new float[lenz]; +// +// //zptr = z; +// +// //for (size_t i = 0; i < lenz; i++) +// //{ +// // s = 0.0; +// // n_lo = 0 > (i - leny + 1) ? 0 : (i - leny + 1); +// // n_hi = (lenx - 1) < i ? (lenx - 1) : i; +// // xp = &x[0] + n_lo; +// // yp = &y[0] + i - n_lo; +// +// // for (size_t n = n_lo; n <= n_hi; n++) +// // { +// // s += *xp * *yp; +// // xp++; +// // yp--; +// // } +// +// // *zptr = s; +// // zptr++; +// //} +//} + +//void AudioSourceFeatureExtractor::DownSampler(float* data, float* & out, size_t lenIn, size_t& lenOut, float currentSampleRate, float futureSampleRate) +//{ +// ////Low pass our data before we decimate +// //const int filterlength = 101; +// //float* tempdata = new float[lenIn]; +// //memset(tempdata, 0, sizeof(float)*lenIn); +// +// ////Coefficients were taken from Matlab +// //float coeffs[filterlength] ={2.0839274e-05f, 6.6880953e-06f,-4.7252855e-05f, -3.4874138e-05f, 7.8508412e-05f,9.7089069e-05f,-9.9197161e-05f, -0.00020412984f, 8.2261082e-05f, 0.00035689832f, 9.4890293e-06f, -0.00053820928f, -0.00021722882f, 0.00070567406f, 0.00057491515f, -0.00078844035f, -0.0010939316f, 0.00069057313f, 0.0017460365f, -0.00030308162f, -0.0024484061f, -0.00047496572f, 0.0030552838f, 0.0017078921f, -0.0033604759f, -0.0033912712f, 0.0031135236f, 0.0054217125f, -0.0020499325f, -0.0075746416f, -6.7239242e-05f, 0.0094950572f, 0.0034002098f, -0.010703080f, -0.0079918290f, 0.010610434f, 0.013732497f, -0.0085344436f, -0.020346783f, 0.0036776769f, 0.027405130f, 0.0050050775f, -0.034361813f, -0.019287759f, 0.040615436f, 0.043452863f,-0.045583628f, -0.093336113f, 0.048780452f, 0.31394306f, 0.45011634f, 0.31394306f, 0.048780452f,-0.093336113f,-0.045583628f, 0.043452863f,0.040615436f,-0.019287759f, -0.034361813f, 0.0050050775f, 0.027405130f,0.0036776769f,-0.020346783f, -0.0085344436f, 0.013732497f, 0.010610434f, -0.0079918290f, -0.010703080f, 0.0034002098f, 0.0094950572f, -6.7239242e-05f, -0.0075746416f, -0.0020499325f, 0.0054217125f, 0.0031135236f, -0.0033912712f, -0.0033604759f, 0.0017078921f, 0.0030552838f, -0.00047496572f, -0.0024484061f, -0.00030308162f, 0.0017460365f,0.00069057313f, -0.0010939316f, -0.00078844035f, 0.00057491515f, 0.00070567406f, -0.00021722882f, -0.00053820928f, 9.4890293e-06f, 0.00035689832f, 8.2261082e-05f, -0.00020412984f, -9.9197161e-05f, 9.7089069e-05f, 7.8508412e-05f, -3.4874138e-05f, -4.7252855e-05f, 6.6880953e-06f, 2.0839274e-05f}; +// // +// //float acc; // accumulator for MACs +// // float* coeffp; // pointer to coefficients +// // float* inputp; // pointer to input samples +// //float* endp = &data[lenIn -1]; // pointer to last sample +// // +// // +// // // apply the filter to each input sample +// // for (size_t n = 0; n < lenIn; n++ ) +// //{ +// // // calculate output n +// // coeffp = &coeffs[0]; +// // inputp = &data[filterlength - 1 + n]; +// +// // acc = 0.0f; +// // for (int k = 0; k < filterlength; k++ ) +// // { +// // if(inputp <= endp) +// // acc += (*coeffp++) * (*inputp--); +// // else +// // { +// // //When we reach the end of the buffer +// // acc += (*coeffp++) * 0.0f; +// // *inputp--; +// // } +// // } +// +// // tempdata[n] = acc; +// // } +// //int ratio = (int) (currentSampleRate / futureSampleRate); +// // +// //lenOut = lenIn / ratio; +// +// //out = new float[lenOut]; +// //memset(out, 0, sizeof(float)*lenOut); +// +// +// //int idx = 0; +// //for(size_t i = 0; i < lenIn; i = i + ratio) +// //{ +// // out[idx] = tempdata[i]; +// // idx++; +// //} +// +// //if(tempdata != NULL) +// //{ +// // delete[] tempdata; +// // tempdata = nullptr; +// //} +//} + +//void AudioSourceFeatureExtractor::Normalise(float* data, float* & out, size_t len) +//{ +// //float maxvalue = std::numeric_limits<float>::lowest(); +// +// //for (size_t i = 0; i < len; i++) +// //{ +// // if (data[i] > maxvalue) +// // maxvalue = data[i]; +// //} +// +// //for (size_t i = 0; i < len; i++) +// //{ +// // out[i] = data[i] / maxvalue; +// //} +//} + +//void AudioSourceFeatureExtractor::PDF_getResampleKrnl(std::vector<float> freqVec, float fsProc, int nfft, int nBin, std::vector<float>& outLogFreqVec, std::vector<std::vector<float>>& outKrnl) +//{ +// //float f1 = freqVec[0]; +// //float f2 = freqVec[freqVec.size() - 1]; +// +// //outLogFreqVec = LinSpace(log(f1), log(f2), nBin); +// //std::vector<float> f(nfft / 2, 0.0f); +// +// //for (size_t i = 0; i < static_cast<size_t>(nBin); i++) +// //{ +// // outKrnl.push_back(f); +// //} +// +// //for (size_t i = 0; i < outLogFreqVec.size(); i++) +// //{ +// // outLogFreqVec[i] = exp(outLogFreqVec[i]); +// //} +// +// //for (size_t i = 1; i < static_cast<size_t>(nBin) - 2; i++) +// //{ +// // float freqBinLin = outLogFreqVec[i] / (fsProc / nfft); +// +// // float nextBinUp = outLogFreqVec[i + 1] / (fsProc / nfft); +// +// // float nextBinDown = outLogFreqVec[i - 1] / (fsProc / nfft); +// +// // float filtWid = nextBinUp - nextBinDown; +// +// // if (filtWid <= 2) +// // { +// // // log resolution is finer than linear resolution +// // // linear interpolation of neighboring bins +// +// // float binDown = floor(freqBinLin); +// // float frac = freqBinLin - binDown; +// // std::vector<float> filt(nfft / 2, 0.0f); +// // filt[((int)binDown) - 1] = 1 - frac; +// // filt[((int)binDown + 1) - 1] = frac; +// // outKrnl[i][((int)binDown) - 1] = filt[((int)binDown) - 1]; +// // outKrnl[i][((int)binDown + 1) - 1] = filt[((int)binDown + 1) - 1]; +// // } +// // else +// // { +// // float ceilNextBinDown = ceil(nextBinDown); +// // float floorFreqBinLin = floor(freqBinLin); +// // float ceilFreqBinLin = ceil(freqBinLin); +// // float floorNextBinUp = floor(nextBinUp); +// +// // std::vector<int> idxLow; +// // std::vector<int> idxHigh; +// // std::vector<int> filtIdx; +// +// // for (size_t j = (size_t)ceilNextBinDown; j <= (size_t)floorFreqBinLin; j++) +// // { +// // idxLow.push_back(j); +// // } +// +// // for (size_t j = (size_t)ceilFreqBinLin; j <= (size_t)floorNextBinUp; j++) +// // { +// // idxHigh.push_back(j); +// // } +// +// // std::vector<int>::iterator it; +// // it = std::unique(idxLow.begin(), idxLow.end()); +// // idxLow.resize(std::distance(idxLow.begin(), it)); +// +// // it = std::unique(idxHigh.begin(), idxHigh.end()); +// // idxHigh.resize(std::distance(idxHigh.begin(), it)); +// +// // filtIdx.reserve(idxLow.size() + idxHigh.size()); // preallocate memory +// // filtIdx.insert(filtIdx.end(), idxLow.begin(), idxLow.end()); +// // filtIdx.insert(filtIdx.end(), idxHigh.begin(), idxHigh.end()); +// +// // std::vector<float> rampUp; +// // std::vector<float> rampDown; +// // for (size_t j = 0; j < filtIdx.size(); j++) +// // { +// // rampUp.push_back(1 - (freqBinLin - filtIdx[j]) / (freqBinLin - nextBinDown)); +// // rampDown.push_back(1 - (filtIdx[j] - freqBinLin) / (nextBinUp - freqBinLin)); +// // } +// +// // std::vector<float> filt; +// +// // for (size_t j = 0; j < rampUp.size(); j++) +// // { +// // filt.push_back(std::min(rampUp[j], rampDown[j])); +// // } +// +// // float sumfilt = 0.0f; +// // for (size_t j = 0; j < filt.size(); j++) +// // { +// // sumfilt += filt[j]; +// // } +// +// // for (size_t j = 0; j < filt.size(); j++) +// // { +// // filt[j] /= sumfilt; +// // } +// +// // for (size_t j = 0; j < filtIdx.size(); j++) +// // { +// // outKrnl[i][filtIdx[j] - 1] = filt[j]; +// // } +// // } +// //} +// +// // special routine for first bin +// // get frequency in linear bins +// +// //float freqBinLin = outLogFreqVec[0] / (fsProc / (float)nfft); +// //float binDown = floor(freqBinLin); +// //float frac = freqBinLin - binDown; +// +// //std::vector<float> filt(nfft / 2, 0.0f); +// //filt[((int)binDown) - 1] = 1 - frac; +// //filt[((int)binDown + 1) - 1] = frac; +// +// //outKrnl[0][((int)binDown) - 1] = filt[((int)binDown) - 1]; +// //outKrnl[0][((int)binDown + 1) - 1] = filt[((int)binDown + 1) - 1]; +// +// //// special routine for last bin +// //// get frequency in linear bins +// //freqBinLin = outLogFreqVec[outLogFreqVec.size() - 1] / (fsProc / nfft); +// +// //// get next lower bin +// //float nextBinDown = outLogFreqVec[outLogFreqVec.size() - 2] / (fsProc / nfft); +// +// //float ceilNextBinDown = ceil(nextBinDown); //Subtract by -1 because of array +// //float floorFreqBinLin = floor(freqBinLin); +// +// //std::vector<int> filtIdx; +// +// //for (size_t i = (size_t)ceilNextBinDown; i <= (size_t)floorFreqBinLin; i++) +// //{ +// // filtIdx.push_back(i); +// //} +// +// //std::vector<float> filt2; +// //for (size_t i = 0; i < filtIdx.size(); i++) +// //{ +// // filt2.push_back(1 - (freqBinLin - filtIdx[i]) / (freqBinLin - nextBinDown)); +// //} +// +// //float sumfilt = 0.0f; +// //for (size_t i = 0; i < filt2.size(); i++) +// //{ +// // sumfilt += filt2[i]; +// //} +// +// //for (size_t i = 0; i < filt2.size(); i++) +// //{ +// // filt2[i] /= sumfilt; +// //} +// +// //for (size_t j = 0; j < filtIdx.size(); j++) +// //{ +// // outKrnl[outKrnl.size() - 1][filtIdx[j] - 1] = filt2[j]; +// //} +//} + +
--- a/Source/AudioSourceFeatureExtractor.h Wed Jul 22 15:14:58 2015 +0100 +++ b/Source/AudioSourceFeatureExtractor.h Wed Jul 22 15:28:00 2015 +0100 @@ -44,9 +44,9 @@ float EstimatePerdiodicity(float* data, size_t numSamples); - void EnvelopeCurve(float* data, float* &out, size_t dataLen, float sampleRate); + void EnvelopeCurve(std::vector<float> data, std::vector<float> &out, float sampleRate); - void XCorr(std::vector<float> *&output, float* input1, float* input2, size_t &outputlen, size_t input1len, size_t maxLag); + void XCorr(std::vector<float> &output, std::vector<float> input1, std::vector<float> input2, size_t maxLag); float EntropyOfEnergy(float* data, size_t numSamples);
--- a/Source/FFTW.h Wed Jul 22 15:14:58 2015 +0100 +++ b/Source/FFTW.h Wed Jul 22 15:28:00 2015 +0100 @@ -15,11 +15,8 @@ #pragma once #include "fftw3.h" -#include <vector> -#include <memory> -#include <stdio.h> +#include <vector> //#include <windows.h> -#include <string.h> //#include <itl/dsp/SimdTools.h>