# HG changeset patch # User Geogaddi\David # Date 1439414706 -3600 # Node ID 262e084a15a9f62ad7af75b3010b9abea35d4767 # Parent fdc592312a96626a7bb2a63eab89a43521c86e8e Vectorised everything and made use of unique_ptr so there should be no more memory leaks. Hurrah for RAII diff -r fdc592312a96 -r 262e084a15a9 Source/AudioReader.cpp --- a/Source/AudioReader.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/AudioReader.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -40,7 +40,6 @@ AudioFormatManager m_formatManager; m_formatManager.registerBasicFormats(); - //AudioSourceFeatureExtractor audioSourceFeatureExtractor = AudioSourceFeatureExtractor(); m_AudioSourceFeatureExtractor.Initialise(SAMPLERATE); for(size_t i=0; i audioFileReader(m_formatManager.createReaderFor(audioFile)); if(audioFileReader != nullptr) { @@ -75,19 +74,15 @@ } //Length of the full track in stereo; - int* destSamples[2] = {0}; - int* L = new int[static_cast(iLengthInSamples)]; - memset(L, 0, static_cast(iLengthInSamples)*sizeof(float)); - destSamples[0]=L; - destSamples[1]=L; + int* destSamples[2] = { nullptr }; + unique_ptr L(new int[iLengthInSamples]); + memset(L.get(), 0, iLengthInSamples); + destSamples[0] = L.get(); + destSamples[1] = L.get(); + //30 sec clips to check energy levels - float* destSamplesFloat = new float[static_cast(numOfSamplesToCollect)]; - memset(destSamplesFloat, 0, static_cast(numOfSamplesToCollect)*sizeof(float)); - - ////30 sec clips to check energy levels - //float* destSamplesFloatLoudest = new float[(size_t)numOfSamplesToCollect]; - //memset(destSamplesFloatLoudest, 0, (size_t)numOfSamplesToCollect*sizeof(float)); + std::vector destSamplesFloat = std::vector(static_cast(numOfSamplesToCollect, 0)); int timesToLoop = 0; @@ -103,8 +98,8 @@ std::vector thirtySecEnergy = std::vector(); //float loudestEnergy = 0.0; - - audioFileReader->readSamples(destSamples, iNumOfChannels, 0, 0, iLengthInSamples); + bool dave; + dave = audioFileReader->readSamples(destSamples, iNumOfChannels, 0, 0, iLengthInSamples); for(int j=0; j < timesToLoop;j++) { @@ -115,11 +110,11 @@ //Sum to mono if needed and workout the energy for each 30 sec. frame if(iNumOfChannels > 1) { - destSamplesFloat[n] = (static_cast((destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n] + destSamples[1][int( j * ENERGYSEARCHTIME * fSampleRate) + n]) / 2) / (0x7fffffff)); + destSamplesFloat.push_back(static_cast((destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n] + destSamples[1][int( j * ENERGYSEARCHTIME * fSampleRate) + n]) / 2) / (0x7fffffff)); } else { - destSamplesFloat[n] = (static_cast(destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n]) / (0x7fffffff)); + destSamplesFloat.push_back(static_cast(destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n]) / (0x7fffffff)); } fSum+=(destSamplesFloat[n] * destSamplesFloat[n]); @@ -141,29 +136,30 @@ int maxIdx = std::distance(thirtySecEnergy.begin(), max_element(thirtySecEnergy.begin(), thirtySecEnergy.end())); int* thirtySecSamples[2] = {0}; - int* L30 = new int[static_cast(numOfSamplesToCollect)]; - memset(L30, 0, static_cast(numOfSamplesToCollect)*sizeof(float)); - thirtySecSamples[0]=L30; //Left channel - thirtySecSamples[1]=L30; //Left right + unique_ptr L30(new int[iLengthInSamples]{ 0 }); + memset(L30.get(), 0, iLengthInSamples); + thirtySecSamples[0]=L30.get(); //Left channel + thirtySecSamples[1]=L30.get(); //Left right //Read the 30 secs. in audioFileReader->readSamples(thirtySecSamples, iNumOfChannels, 0, int(maxIdx * ENERGYSEARCHTIME * fSampleRate), numOfSamplesToCollect); - memset(destSamplesFloat, 0, static_cast(numOfSamplesToCollect)*sizeof(float)); + + destSamplesFloat = std::vector(static_cast(numOfSamplesToCollect, 0)); for(int n=0; n 1) { - destSamplesFloat[n] = (static_cast((thirtySecSamples[0][n] + thirtySecSamples[1][n]) / 2) / (0x7fffffff)); + destSamplesFloat.push_back(static_cast((thirtySecSamples[0][n] + thirtySecSamples[1][n]) / 2) / (0x7fffffff)); } else { - destSamplesFloat[n] = (static_cast(thirtySecSamples[0][n]) / (0x7fffffff)); + destSamplesFloat.push_back(static_cast(thirtySecSamples[0][n]) / (0x7fffffff)); } } - std::vector newObs = m_AudioSourceFeatureExtractor.Process(destSamplesFloat, numOfSamplesToCollect); + std::vector newObs = m_AudioSourceFeatureExtractor.Process(destSamplesFloat); FeatureData newFeature = FeatureData(newObs, labels[i], audioFileNames[i], fSampleRate, FFTSIZE, static_cast(numOfSamplesToCollect), poolTimeSecs); @@ -171,29 +167,7 @@ //Update the screen information; - cout << string(outputStr.length(),'\b'); - - //Cleanup - if(L != nullptr) - { - delete[] L; - L = nullptr; - } - - if (L30 != nullptr) - { - delete[] L30; - L30 = nullptr; - } - - if(destSamplesFloat != nullptr) - { - delete[] destSamplesFloat; - destSamplesFloat = nullptr; - } - - delete[] audioFileReader; - audioFileReader = nullptr; + cout << string(outputStr.length(),'\b'); } else diff -r fdc592312a96 -r 262e084a15a9 Source/AudioSourceFeatureExtractor.cpp --- a/Source/AudioSourceFeatureExtractor.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/AudioSourceFeatureExtractor.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -52,7 +52,7 @@ } //============================================================================== process -std::vector AudioSourceFeatureExtractor::Process(const float* data, size_t numSamples) +std::vector AudioSourceFeatureExtractor::Process(const std::vector data) { std::vector observations = std::vector(); @@ -61,11 +61,11 @@ m_fPreviousMagnitudeSpectrum = std::vector(MAGNITUDESIZE, 0); m_iWriteIdx = 0; - float perdiodicity = EstimatePerdiodicity(const_cast(data), numSamples); + float perdiodicity = EstimatePerdiodicity(data); - float entropyofenergy = EntropyOfEnergy(const_cast(data), numSamples); + float entropyofenergy = EntropyOfEnergy(data); - for (size_t n = 0; n < numSamples; n++) + for (size_t n = 0; n < data.size(); n++) { m_fInputBuffer[m_iWriteIdx] = data[n]; m_iWriteIdx++; @@ -166,7 +166,6 @@ void AudioSourceFeatureExtractor::Finalize() { - m_MFCC.freeMFCCmemory(); } void AudioSourceFeatureExtractor::VectorDistance(std::vector vIn1, int stride1, std::vector vIn2, int stride2, std::vector &vOut, int strideOut, size_t nElements) @@ -443,15 +442,15 @@ fftwf_free(product); } -float AudioSourceFeatureExtractor::EstimatePerdiodicity(float* data, size_t numSamples) +float AudioSourceFeatureExtractor::EstimatePerdiodicity(std::vector data) { float periodicity = 0.0; - std::vector downsampleddata = std::vector(numSamples, 0); + std::vector downsampleddata = std::vector(data.size(), 0); std::vector xcorr; - for (size_t k = 0; k < numSamples; k++) + for (size_t k = 0; k < data.size(); k++) { downsampleddata[k] = data[k]; } @@ -495,7 +494,7 @@ float minValInRange = std::numeric_limits::max(); - for (size_t j = static_cast(from); j < to; j++) + for (size_t j = static_cast(from); j < static_cast(to); j++) { if (temp2[j] < minValInRange) { @@ -536,19 +535,19 @@ } } -float AudioSourceFeatureExtractor::EntropyOfEnergy(float* data, size_t len) +float AudioSourceFeatureExtractor::EntropyOfEnergy(std::vector data) { float totalEnergy = 0.0; float totalentropy = 0.0; const int numSubFrames = 30; //Calculate Total Energy and normalise it - for (size_t i = 0; i < len; i++) + for (size_t i = 0; i < data.size(); i++) { totalEnergy += (data[i] * data[i]); } - int subFrameSize = len / numSubFrames; + int subFrameSize = data.size() / numSubFrames; for (size_t i = 0; i < numSubFrames; i++) { diff -r fdc592312a96 -r 262e084a15a9 Source/AudioSourceFeatureExtractor.h --- a/Source/AudioSourceFeatureExtractor.h Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/AudioSourceFeatureExtractor.h Wed Aug 12 22:25:06 2015 +0100 @@ -31,7 +31,7 @@ ~AudioSourceFeatureExtractor(); void Initialise ( float fSampleRate); - std::vector Process (const float* data, size_t numSamples); + std::vector Process (const std::vector data); void Finalize(); private: @@ -40,15 +40,13 @@ void SpectralFeatures(std::vector &magnitude, std::vector &previousmagnitude, size_t windowSize, float ¢roid, float &spread, float &skew, float &kurtosis, float &brightness, float &rolloff95, float &rolloff85, float &spectralentropy, float &flatness, float &spectralcf, float &spectralflux); - void MFCCs(std::vector &magnitude, size_t windowSize, float sampleRate); - - float EstimatePerdiodicity(float* data, size_t numSamples); + float EstimatePerdiodicity(std::vector data); void EnvelopeCurve(std::vector data, std::vector &out, float sampleRate); void XCorr(std::vector &output, std::vector input1, std::vector input2, size_t maxLag); - float EntropyOfEnergy(float* data, size_t numSamples); + float EntropyOfEnergy(std::vector data); float Log2(float n); diff -r fdc592312a96 -r 262e084a15a9 Source/FFT.cpp --- a/Source/FFT.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/FFT.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -12,4 +12,4 @@ //FFT::FastFourierTransform() //{ // -//} +//} diff -r fdc592312a96 -r 262e084a15a9 Source/FFT.h --- a/Source/FFT.h Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/FFT.h Wed Aug 12 22:25:06 2015 +0100 @@ -19,33 +19,20 @@ { public: - FastFourierTransform(); + FastFourierTransform(){}; FastFourierTransform( unsigned fftLength ) : m_fft_impl( fftLength ) { - m_realPart = new float[fftLength]; - m_imagPart = new float[fftLength]; - - memset(m_realPart, 0, (fftLength)*sizeof(float)); - memset(m_imagPart, 0, (fftLength)*sizeof(float)); + std::vector m_realPart = std::vector(fftLength, 0); + std::vector m_imagPart = std::vector(fftLength, 0); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ~FastFourierTransform() { - if(m_realPart != NULL) - { - delete[] m_realPart; - m_realPart = nullptr; - } - if(m_imagPart != NULL) - { - delete[] m_imagPart; - m_imagPart = nullptr; - } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -54,13 +41,13 @@ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const float * realPart() { return m_realPart; } - const float * imagPart() { return m_imagPart; } + std::vector realPart() { return m_realPart; } + std::vector imagPart() { return m_imagPart; } private: - float* m_realPart; - float* m_imagPart; + std::vector m_realPart; + std::vector m_imagPart; FFTImpl m_fft_impl; diff -r fdc592312a96 -r 262e084a15a9 Source/FeatureData.cpp --- a/Source/FeatureData.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/FeatureData.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -17,7 +17,7 @@ void FeatureData::PoolData(float timefactor) { //TODO: Remove hardcoded value - int modval = (int)(timefactor / 0.05); //50 millisecs + int modval = static_cast(timefactor / 0.05); //50 millisecs int index = 0; int remainderindex = 0; @@ -519,7 +519,7 @@ avgdeltamfcc.push_back(Average(m_deltamfccs[10])); avgdeltamfcc.push_back(Average(m_deltamfccs[11])); - for(size_t i =0; i < m_PooledObservationDataAverage.size(); i++) + //for(size_t i =0; i < m_PooledObservationDataAverage.size(); i++) { obs = ObservationData(avgrms, avgpeak, avgcrestFactor, avgzcr, avgcentroid, avgspread, avgskewness, avgkurtosis, avgbrightness, avgrolloff85, avgrolloff95, avgspectralentropy, avgflatness, avgspectralcf, avgspectralflux, avgmfcc, avgdeltamfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy()); obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy()); @@ -776,7 +776,7 @@ sum += v[i]; } - return sum / (float)v.size(); + return sum / static_cast(v.size()); } float FeatureData::Deviation(std::vector v, float ave) @@ -788,7 +788,7 @@ E += (v[i] - ave) * (v[i] - ave); } - return sqrt((1 / (float)v.size()) * E); + return sqrt((1 / static_cast(v.size())) * E); } float FeatureData::Max(std::vector v) diff -r fdc592312a96 -r 262e084a15a9 Source/MFCC.cpp --- a/Source/MFCC.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/MFCC.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -1,40 +1,39 @@ /* - ============================================================================== +============================================================================== - MFCC.cpp - Created: 2 Sep 2014 3:30:50pm - Author: david.ronan +MFCC.cpp +Created: 2 Sep 2014 3:30:50pm +Author: david.ronan - ============================================================================== +============================================================================== */ #include "MFCC.h" #include -//#include //----------------------------------------------------------------------------- ComputeMFCC void MFCC::ComputeMFCC(std::vector magnitude, std::vector &mfccs) { - //Apply the Mel Filters to the spectrum magnitude: - for(int i=0; i(m_iNumMFCCCoefs, 0); - //Add a value to take into account the 0 coefficient - int iStartMfccCoeff = 1; - //Mel FilterBank parameters - float fLowestFreq = 133.3333f; - int iNumLinearFilter = 13; - float fLinearSpacing = 66.66666666f; - int iNumLogFilters = 27; - float fLogSpacing = 1.0711703f; - float fFreqPerBin = fSampleRate / (float)(Nfft); - m_iTotalMFCCFilters = iNumLinearFilter + iNumLogFilters; + //Add a value to take into account the 0 coefficient + int iStartMfccCoeff = 1; - m_fMelFilteredFFT = new float[m_iTotalMFCCFilters]; - m_pMFCCFilterStart = new int[m_iTotalMFCCFilters]; - m_pMFCCFilterLength = new int[m_iTotalMFCCFilters]; - m_ppMFCCFilters = new float*[m_iTotalMFCCFilters]; + //Mel FilterBank parameters + float fLowestFreq = 133.3333f; + int iNumLinearFilter = 13; + float fLinearSpacing = 66.66666666f; + int iNumLogFilters = 27; + float fLogSpacing = 1.0711703f; + float fFreqPerBin = fSampleRate / static_cast(Nfft); + m_iTotalMFCCFilters = iNumLinearFilter + iNumLogFilters; - float FilterLimits[3]; - int iFilterWidthMax = 0; - for(int i = 0; i < m_iTotalMFCCFilters; i++) - { - for(int j = 0; j < 3; j++) - { - if(i + j < iNumLinearFilter) - { - FilterLimits[j] = (i + j) * fLinearSpacing + fLowestFreq; - } - else - { - float fLowestLogFreq = (iNumLinearFilter-1) * fLinearSpacing + fLowestFreq; - FilterLimits[j] = fLowestLogFreq * powf(fLogSpacing, (float)((i + j) - iNumLinearFilter + 1)); - } - } + m_fMelFilteredFFT = std::vector(m_iTotalMFCCFilters, 0); + m_pMFCCFilterStart = std::vector(m_iTotalMFCCFilters, 0); + m_pMFCCFilterLength = std::vector(m_iTotalMFCCFilters, 0); + m_ppMFCCFilters = std::vector>(m_iTotalMFCCFilters); - float fTriangleHeight = 2.f / (FilterLimits[2] - FilterLimits[0]); - - int iStartBin = (int)(ceil(FilterLimits[0] / fFreqPerBin)); - int iStopBin = (int)(floor(FilterLimits[2] / fFreqPerBin)); - - int iFilterWidth = iStopBin-iStartBin+1; - m_pMFCCFilterStart[i] = iStartBin; - m_pMFCCFilterLength[i] = iFilterWidth; - m_ppMFCCFilters[i] = new float[iFilterWidth]; - - if(iFilterWidth > iFilterWidthMax) + float FilterLimits[3]; + int iFilterWidthMax = 0; + for (int i = 0; i < m_iTotalMFCCFilters; i++) { - iFilterWidthMax = iFilterWidth; - } - - for(int n=iStartBin; n((i + j) - iNumLinearFilter + 1)); } } - delete (m_ppMFCCFilters); - m_ppMFCCFilters=nullptr; + float fTriangleHeight = 2.f / (FilterLimits[2] - FilterLimits[0]); + + int iStartBin = static_cast(ceil(FilterLimits[0] / fFreqPerBin)); + int iStopBin = static_cast(floor(FilterLimits[2] / fFreqPerBin)); + + int iFilterWidth = iStopBin - iStartBin + 1; + m_pMFCCFilterStart[i] = iStartBin; + m_pMFCCFilterLength[i] = iFilterWidth; + m_ppMFCCFilters[i] = std::vector(iFilterWidth, 0); + + if (iFilterWidth > iFilterWidthMax) + { + iFilterWidthMax = iFilterWidth; + } + + for (int n = iStartBin; n(iFilterWidthMax, 0); + + //Compute the DCT reduction matrix + m_ppMFFC_DCT = std::vector(NCoeffs * m_iTotalMFCCFilters, 0); + + float fScaleDCTMatrix = 1.f / sqrtf(m_iTotalMFCCFilters / 2.f); + + for (int n = iStartMfccCoeff; n < NCoeffs + iStartMfccCoeff; n++) + { + for (int m = 0; m < m_iTotalMFCCFilters; m++) + { + m_ppMFFC_DCT[(n - iStartMfccCoeff) * m_iTotalMFCCFilters + m] = fScaleDCTMatrix * cosf(n * (m + 0.5f) * 3.141592653589793f / m_iTotalMFCCFilters); + } } } -//----------------------------------------------------------------------------- vDSP_vmul -inline void MFCC::vDSP_vmul(float* v1,int stride1, float* v2, int stride2, float* out, int outstride, int iNumSamples) +//----------------------------------------------------------------------------- MultiplyVector +void MFCC::MultiplyVector(std::vector v1, std::vector v2, std::vector &out, int iNumSamples) { - for(int i=0; i v) { - float fSum = 0; + float fSum = 0; - for(int i=0; i < iNumSamples; i++) - { - fSum += v[i]; - } + for (size_t i = 0; i < v.size(); i++) + { + fSum += v[i]; + } - return fSum; + return fSum; } -//----------------------------------------------------------------------------- vDSP_mmul -inline void MFCC::vDSP_mmul(float* v1, int , float* v2, int , float* &vout, int , int M, int , int P) +//----------------------------------------------------------------------------- MultiplySumVector +void MFCC::MultiplySumVector(std::vector v1, std::vector v2, std::vector &vout, int M, int P) { - for(int m = 0; m < M; m++) - { - float fProdSum = 0.f; + for (int m = 0; m < M; m++) + { + float fProdSum = 0.f; - for(int p = 0; p < P; p++) - { - fProdSum+=v1[m * P + p] * v2[p]; - } + for (int p = 0; p < P; p++) + { + fProdSum += v1[m * P + p] * v2[p]; + } - vout[m]=fProdSum; - } + vout[m] = fProdSum; + } } diff -r fdc592312a96 -r 262e084a15a9 Source/MFCC.h --- a/Source/MFCC.h Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/MFCC.h Wed Aug 12 22:25:06 2015 +0100 @@ -18,26 +18,23 @@ public: void initMFFCvariables(int NCoeffs, int Nfft, float fSampleRate); void ComputeMFCC(std::vector magnitude, std::vector &mfccs); - void freeMFCCmemory(); private: // -------- MFFC computation int m_iNumMFCCCoefs; int m_iTotalMFCCFilters; - int* m_pMFCCFilterStart; - int* m_pMFCCFilterLength; - float** m_ppMFCCFilters; - float* m_ppMFFC_DCT; - float* m_fMelFilteredFFT; - float* m_pMFCC; - float* m_pfTempMelFilterResult; + std::vector m_pMFCCFilterStart; + std::vector m_pMFCCFilterLength; + std::vector> m_ppMFCCFilters; + std::vector m_ppMFFC_DCT; + std::vector m_fMelFilteredFFT; + std::vector m_pMFCC; + std::vector m_pfTempMelFilterResult; - -// -------- tools -inline void vDSP_vmul(float* v1,int stride1, float* v2, int stride2, float* out, int outstride, int iNumSamples); + void MultiplyVector(std::vector v1, std::vector v2, std::vector &out, int iNumSamples); -inline float vDSP_sve(float* v, int stride, int iNumSamples); + float SumVector(std::vector v); -inline void vDSP_mmul(float* v1, int stride1, float* v2, int stride2, float* &vout, int strideOut, int M, int N, int P); + void MultiplySumVector(std::vector v1, std::vector v2, std::vector &vout, int M, int P); }; diff -r fdc592312a96 -r 262e084a15a9 Source/ParseCSV.cpp --- a/Source/ParseCSV.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/ParseCSV.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -89,4 +89,4 @@ } return lines; -} +} diff -r fdc592312a96 -r 262e084a15a9 Source/WriteCSV.cpp --- a/Source/WriteCSV.cpp Wed Jul 22 15:28:00 2015 +0100 +++ b/Source/WriteCSV.cpp Wed Aug 12 22:25:06 2015 +0100 @@ -410,4 +410,4 @@ strftime(buf, sizeof(buf), "%Y-%m-%d.%H-%M-%S", &tstruct); return buf; -} +}