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>