# HG changeset patch # User Carl Bussey # Date 1407428724 -3600 # Node ID 4e429b9f2b4de209b19d500ddda2996670dda709 # Parent 21147df9cb2db722792e18b611e3eea420f4e2cf * Fixed memory leak bug. Issue with calculating size of spectrogram array. * Fixed bug in Tempogram::reset() where specData wasn't reinitialised. diff -r 21147df9cb2d -r 4e429b9f2b4d FIRFilter.cpp --- a/FIRFilter.cpp Thu Aug 07 16:21:21 2014 +0100 +++ b/FIRFilter.cpp Thu Aug 07 17:25:24 2014 +0100 @@ -12,8 +12,8 @@ using Vamp::FFT; FIRFilter::FIRFilter(const unsigned int lengthInput, const unsigned int numberOfCoefficients) : - _lengthInput(lengthInput), - _numberOfCoefficients(numberOfCoefficients), + m_lengthInput(lengthInput), + m_numberOfCoefficients(numberOfCoefficients), fftInput(NULL), fftCoefficients(NULL), fftReal1(NULL), @@ -36,20 +36,20 @@ void FIRFilter::initialise() { - _lengthFIRFFT = pow(2,(ceil(log2(_lengthInput+_numberOfCoefficients-1)))); + m_lengthFIRFFT = pow(2,(ceil(log2(m_lengthInput+m_numberOfCoefficients-1)))); - fftInput = new double[_lengthFIRFFT]; - fftCoefficients = new double[_lengthFIRFFT]; - fftReal1 = new double[_lengthFIRFFT]; - fftImag1 = new double[_lengthFIRFFT]; - fftReal2 = new double[_lengthFIRFFT]; - fftImag2 = new double[_lengthFIRFFT]; - fftFilteredReal = new double[_lengthFIRFFT]; - fftFilteredImag = new double[_lengthFIRFFT]; - fftOutputReal = new double[_lengthFIRFFT]; - fftOutputImag = new double[_lengthFIRFFT]; + fftInput = new double[m_lengthFIRFFT]; + fftCoefficients = new double[m_lengthFIRFFT]; + fftReal1 = new double[m_lengthFIRFFT]; + fftImag1 = new double[m_lengthFIRFFT]; + fftReal2 = new double[m_lengthFIRFFT]; + fftImag2 = new double[m_lengthFIRFFT]; + fftFilteredReal = new double[m_lengthFIRFFT]; + fftFilteredImag = new double[m_lengthFIRFFT]; + fftOutputReal = new double[m_lengthFIRFFT]; + fftOutputImag = new double[m_lengthFIRFFT]; - for(int i = 0; i < _lengthFIRFFT; i++){ + for(int i = 0; i < m_lengthFIRFFT; i++){ fftInput[i] = fftCoefficients[i] = fftReal1[i] = fftImag1[i] = fftReal2[i] = fftImag2[i] = fftFilteredReal[i] = fftFilteredImag[i] = fftOutputReal[i] = fftOutputImag[i] = 0.0; } } @@ -57,21 +57,21 @@ void FIRFilter::process(const float* input, const float* coefficients, float* output) { - for(int i = 0; i < _lengthFIRFFT; i++){ - fftInput[i] = i < _lengthInput ? input[i] : 0.0; - fftCoefficients[i] = i < _numberOfCoefficients ? coefficients[i] : 0.0; + for(int i = 0; i < m_lengthFIRFFT; i++){ + fftInput[i] = i < m_lengthInput ? input[i] : 0.0; + fftCoefficients[i] = i < m_numberOfCoefficients ? coefficients[i] : 0.0; } - FFT::forward(_lengthFIRFFT, fftInput, NULL, fftReal1, fftImag1); - FFT::forward(_lengthFIRFFT, fftCoefficients, NULL, fftReal2, fftImag2); + FFT::forward(m_lengthFIRFFT, fftInput, NULL, fftReal1, fftImag1); + FFT::forward(m_lengthFIRFFT, fftCoefficients, NULL, fftReal2, fftImag2); - for (int i = 0; i < _lengthFIRFFT; i++){ + for (int i = 0; i < m_lengthFIRFFT; i++){ fftFilteredReal[i] = (fftReal1[i] * fftReal2[i]) - (fftImag1[i] * fftImag2[i]); fftFilteredImag[i] = (fftReal1[i] * fftImag2[i]) + (fftReal2[i] * fftImag1[i]); } - FFT::inverse(_lengthFIRFFT, fftFilteredReal, fftFilteredImag, fftOutputReal, fftOutputImag); + FFT::inverse(m_lengthFIRFFT, fftFilteredReal, fftFilteredImag, fftOutputReal, fftOutputImag); - for (int i = 0; i < _lengthInput; i++){ + for (int i = 0; i < m_lengthInput; i++){ output[i] = fftOutputReal[i]; } } diff -r 21147df9cb2d -r 4e429b9f2b4d FIRFilter.h --- a/FIRFilter.h Thu Aug 07 16:21:21 2014 +0100 +++ b/FIRFilter.h Thu Aug 07 17:25:24 2014 +0100 @@ -20,9 +20,9 @@ ~FIRFilter(); void process(const float *input, const float *coefficients, float *output); private: - unsigned int _lengthInput; - unsigned int _numberOfCoefficients; - unsigned int _lengthFIRFFT; + unsigned int m_lengthInput; + unsigned int m_numberOfCoefficients; + unsigned int m_lengthFIRFFT; double *fftInput; double *fftCoefficients; diff -r 21147df9cb2d -r 4e429b9f2b4d Spectrogram.cpp --- a/Spectrogram.cpp Thu Aug 07 16:21:21 2014 +0100 +++ b/Spectrogram.cpp Thu Aug 07 17:25:24 2014 +0100 @@ -15,7 +15,7 @@ m_inputLength(inputLength), m_fftLength(fftLength), m_hopSize(hopSize), - m_numberOfOutputBins(floor(fftLength/2 + 0.5) + 1), + m_numberOfOutputBins(ceil(fftLength/2) + 1), fftInput(NULL), fftOutputReal(NULL), fftOutputImag(NULL) @@ -32,7 +32,7 @@ fftOutputReal = new double [m_fftLength]; fftOutputImag = new double [m_fftLength]; - int numberOfBlocks = ceil(m_inputLength/m_hopSize) + m_fftLength/m_hopSize-1; + int numberOfBlocks = ceil(m_inputLength/m_hopSize) + 2*(ceil(m_fftLength/m_hopSize)-1); //The last term corresponds to overlaps at the beginning and end with padded zeros. I.e., if m_hopSize = m_fftLength/2, there'll be 1 overlap at each end. If m_hopSize = m_fftLength/4, there'll be 3 overlaps at each end, etc... spectrogramOutput = vector< vector >(m_numberOfOutputBins, vector(numberOfBlocks)); } @@ -42,8 +42,6 @@ delete []fftOutputImag; fftInput = fftOutputReal = fftOutputImag = NULL; - - cerr << "Spectrogram" << endl; } vector< vector > Spectrogram::audioToMagnitudeSpectrogram(const float * const input, const float * window){ @@ -69,6 +67,7 @@ //@todo: sample at logarithmic spacing? Leave for host? for(int k = 0; k < m_numberOfOutputBins; k++){ spectrogramOutput[k][writeBlockPointer] = (fftOutputReal[k]*fftOutputReal[k] + fftOutputImag[k]*fftOutputImag[k]); //Magnitude or power? + cerr << writeBlockPointer << " : " << spectrogramOutput[k].size() << endl; } readPointerBeginIndex += m_hopSize; diff -r 21147df9cb2d -r 4e429b9f2b4d Tempogram.cpp --- a/Tempogram.cpp Thu Aug 07 16:21:21 2014 +0100 +++ b/Tempogram.cpp Thu Aug 07 17:25:24 2014 +0100 @@ -269,12 +269,12 @@ cleanupForGRF(); ncTimestamps.clear(); specData.clear(); + specData = vector< vector >(m_blockSize/2 + 1); } Tempogram::FeatureSet Tempogram::process(const float *const *inputBuffers, Vamp::RealTime timestamp) { - size_t n = m_blockSize/2 + 1; FeatureSet featureSet; @@ -337,10 +337,7 @@ WindowFunction::hanning(hannWindowtN, tN); Spectrogram * spectrogramProcessor = new Spectrogram(numberOfBlocks, tN, thopSize); vector< vector > tempogram = spectrogramProcessor->audioToMagnitudeSpectrogram(&noveltyCurve[0], hannWindowtN); - - cout << "About to delete..." << endl; delete spectrogramProcessor; - cout << "Deleted!" << endl; spectrogramProcessor = NULL; int timePointer = thopSize-tN/2; @@ -351,8 +348,6 @@ int timeMS = floor(1000*(m_stepSize*timePointer)/m_inputSampleRate + 0.5); - cout << timeMS << endl; - for(int k = 0; k < tN/2 + 1; k++){ feature.values.push_back(tempogram[k][block]); }