Mercurial > hg > vamp-tempogram
changeset 20:de7213b35755
* Removed warnings of comparisons with ints and size_t
author | Carl Bussey <c.bussey@se10.qmul.ac.uk> |
---|---|
date | Fri, 15 Aug 2014 15:17:28 +0100 |
parents | e90a4797e579 |
children | 12b952286959 |
files | FIRFilter.cpp FIRFilter.h Makefile NoveltyCurveProcessor.cpp NoveltyCurveProcessor.h SpectrogramProcessor.cpp SpectrogramProcessor.h TempogramPlugin.cpp TempogramPlugin.h WindowFunction.cpp |
diffstat | 10 files changed, 60 insertions(+), 51 deletions(-) [+] |
line wrap: on
line diff
--- a/FIRFilter.cpp Fri Aug 15 12:34:07 2014 +0100 +++ b/FIRFilter.cpp Fri Aug 15 15:17:28 2014 +0100 @@ -51,7 +51,7 @@ m_pFftOutputReal = new double[m_lengthFIRFFT]; m_pFftOutputImag = new double[m_lengthFIRFFT]; - for(unsigned int i = 0; i < m_lengthFIRFFT; i++){ + for(int i = 0; i < (int)m_lengthFIRFFT; i++){ m_pFftInput[i] = m_pFftCoefficients[i] = m_pFftReal1[i] = m_pFftImag1[i] = m_pFftReal2[i] = m_pFftImag2[i] = m_pFftFilteredReal[i] = m_pFftFilteredImag[i] = m_pFftOutputReal[i] = m_pFftOutputImag[i] = 0.0; } } @@ -61,16 +61,16 @@ { //Copy to same length FFT buffers - for(unsigned int i = 0; i < m_lengthFIRFFT; i++){ - m_pFftInput[i] = i < m_lengthInput ? pInput[i] : 0.0; - m_pFftCoefficients[i] = i < m_numberOfCoefficients ? pCoefficients[i] : 0.0; + for(int i = 0; i < (int)m_lengthFIRFFT; i++){ + m_pFftInput[i] = i < (int)m_lengthInput ? pInput[i] : 0.0; + m_pFftCoefficients[i] = i < (int)m_numberOfCoefficients ? pCoefficients[i] : 0.0; } FFT::forward(m_lengthFIRFFT, m_pFftInput, 0, m_pFftReal1, m_pFftImag1); FFT::forward(m_lengthFIRFFT, m_pFftCoefficients, 0, m_pFftReal2, m_pFftImag2); //Multiply FFT coefficients. Multiplication in freq domain is convolution in time domain. - for (unsigned int i = 0; i < m_lengthFIRFFT; i++){ + for (int i = 0; i < (int)m_lengthFIRFFT; i++){ m_pFftFilteredReal[i] = (m_pFftReal1[i] * m_pFftReal2[i]) - (m_pFftImag1[i] * m_pFftImag2[i]); m_pFftFilteredImag[i] = (m_pFftReal1[i] * m_pFftImag2[i]) + (m_pFftReal2[i] * m_pFftImag1[i]); } @@ -79,12 +79,12 @@ //copy to output int offset = 0; - unsigned int outputLength = m_lengthInput; - if (outputType == all) outputLength = m_lengthFIRFFT; - else if (outputType == middle) offset = floor((float)m_numberOfCoefficients/2); + int outputLength = m_lengthInput; + if (outputType == all) outputLength = (int)m_lengthFIRFFT; + else if (outputType == middle) offset = floor(m_numberOfCoefficients/2.0f); else if (outputType != first) cerr << "FIRFilter::process(params) - " << outputType << " is not a valid argument. outputType is set to first." << endl; - for (unsigned int i = 0; i < outputLength; i++){ + for (int i = 0; i < outputLength; i++){ pOutput[i] = m_pFftOutputReal[i + offset]; } }
--- a/FIRFilter.h Fri Aug 15 12:34:07 2014 +0100 +++ b/FIRFilter.h Fri Aug 15 15:17:28 2014 +0100 @@ -28,7 +28,7 @@ private: size_t m_lengthInput; size_t m_numberOfCoefficients; - int m_lengthFIRFFT; + size_t m_lengthFIRFFT; double *m_pFftInput; double *m_pFftCoefficients;
--- a/Makefile Fri Aug 15 12:34:07 2014 +0100 +++ b/Makefile Fri Aug 15 15:17:28 2014 +0100 @@ -40,7 +40,7 @@ CXX := g++ #-mmacosx-version-min=10.6 -CXXFLAGS := -mmacosx-version-min=10.6 -arch x86_64 -I$(VAMP_SDK_DIR) -Wall -fPIC +CXXFLAGS := -mmacosx-version-min=10.6 -arch x86_64 -I$(VAMP_SDK_DIR) -Wall -Wextra -fPIC PLUGIN_EXT := .dylib LDFLAGS := $(CXXFLAGS) -dynamiclib -install_name $(PLUGIN_LIBRARY_NAME)$(PLUGIN_EXT) /usr/local/lib/libvamp-sdk.a -exported_symbols_list vamp-plugin.list
--- a/NoveltyCurveProcessor.cpp Fri Aug 15 12:34:07 2014 +0100 +++ b/NoveltyCurveProcessor.cpp Fri Aug 15 15:17:28 2014 +0100 @@ -97,13 +97,13 @@ WindowFunction::hanning(diffHannWindow, smoothLength, true); if(smoothLength%2) diffHannWindow[(smoothLength+1)/2 - 1] = 0; - for(unsigned int i = (smoothLength+1)/2; i < smoothLength; i++){ + for(int i = (smoothLength+1)/2; i < (int)smoothLength; i++){ diffHannWindow[i] = -diffHannWindow[i]; } FIRFilter smoothFilter(m_numberOfBlocks, smoothLength); - for (unsigned int i = 0; i < m_blockSize; i++){ + for (int i = 0; i < (int)m_blockSize; i++){ smoothFilter.process(&spectrogram[i][0], diffHannWindow, &spectrogram[i][0], FIRFilter::middle); } } @@ -111,8 +111,8 @@ //half rectification (set negative to zero) void NoveltyCurveProcessor::halfWaveRectify(vector< vector<float> > &spectrogram) const { - for (unsigned int block = 0; block < m_numberOfBlocks; block++){ - for (unsigned int k = 0; k < m_blockSize; k++){ + for (int block = 0; block < (int)m_numberOfBlocks; block++){ + for (int k = 0; k < (int)m_blockSize; k++){ if (spectrogram[k][block] < 0.0) spectrogram[k][block] = 0.0; } } @@ -130,8 +130,8 @@ //normalise and log spectrogram float normaliseScale = calculateMax(spectrogram); - for (unsigned int block = 0; block < m_numberOfBlocks; block++){ - for (unsigned int k = 0; k < m_blockSize; k++){ + for (int block = 0; block < (int)m_numberOfBlocks; block++){ + for (int k = 0; k < (int)m_blockSize; k++){ if(normaliseScale != 0.0) spectrogram[k][block] /= normaliseScale; //normalise spectrogram[k][block] = log(1+m_compressionConstant*spectrogram[k][block]); } @@ -143,8 +143,8 @@ halfWaveRectify(spectrogram); //bandwise processing - for (unsigned int block = 0; block < m_numberOfBlocks; block++){ - for (unsigned int band = 0; band < m_numberOfBands; band++){ + for (int block = 0; block < (int)m_numberOfBlocks; block++){ + for (int band = 0; band < (int)m_numberOfBands; band++){ int k = m_pBandBoundaries[band]; int bandEnd = m_pBandBoundaries[band+1]; m_pBandSum[band] = 0; @@ -155,7 +155,7 @@ } } float total = 0; - for(unsigned int band = 0; band < m_numberOfBands; band++){ + for(int band = 0; band < (int)m_numberOfBands; band++){ total += m_pBandSum[band]; } noveltyCurve[block] = total/m_numberOfBands;
--- a/NoveltyCurveProcessor.h Fri Aug 15 12:34:07 2014 +0100 +++ b/NoveltyCurveProcessor.h Fri Aug 15 15:17:28 2014 +0100 @@ -22,11 +22,11 @@ class NoveltyCurveProcessor{ float m_samplingFrequency; - int m_fftLength; - int m_blockSize; - int m_numberOfBlocks; + size_t m_fftLength; + size_t m_blockSize; + size_t m_numberOfBlocks; int m_compressionConstant; - int m_numberOfBands; + size_t m_numberOfBands; int * m_pBandBoundaries; float * m_pBandSum;
--- a/SpectrogramProcessor.cpp Fri Aug 15 12:34:07 2014 +0100 +++ b/SpectrogramProcessor.cpp Fri Aug 15 15:17:28 2014 +0100 @@ -68,7 +68,7 @@ while(readBlockPointerIndex <= inputLength) { int readPointer = readBlockPointerIndex - m_windowLength/2; - for (unsigned int n = 0; n < m_windowLength; n++){ + for (int n = 0; n < (int)m_windowLength; n++){ if(readPointer < 0 || readPointer >= (int)inputLength){ m_pFftInput[n] = 0.0; //pad with zeros } @@ -77,7 +77,7 @@ } readPointer++; } - for (unsigned int n = m_windowLength; n < m_fftLength; n++){ + for (int n = m_windowLength; n < (int)m_fftLength; n++){ m_pFftInput[n] = 0.0; } @@ -85,7 +85,7 @@ vector<float> binValues; //@todo: sample at logarithmic spacing? Leave for host? - for(unsigned int k = 0; k < m_numberOfOutputBins; k++){ + for(int k = 0; k < (int)m_numberOfOutputBins; k++){ binValues.push_back(m_pFftOutputReal[k]*m_pFftOutputReal[k] + m_pFftOutputImag[k]*m_pFftOutputImag[k]); //Magnitude or power? //std::cout << spectrogram[k][writeBlockPointer] << std::endl; }
--- a/SpectrogramProcessor.h Fri Aug 15 12:34:07 2014 +0100 +++ b/SpectrogramProcessor.h Fri Aug 15 15:17:28 2014 +0100 @@ -11,6 +11,7 @@ #include <vector> #include <vamp-sdk/FFT.h> #include <cmath> +#include <stddef.h> typedef std::vector <std::vector<float> > Spectrogram; typedef std::vector <std::vector<float> > SpectrogramTransposed;
--- a/TempogramPlugin.cpp Fri Aug 15 12:34:07 2014 +0100 +++ b/TempogramPlugin.cpp Fri Aug 15 15:17:28 2014 +0100 @@ -383,17 +383,7 @@ return list; } -bool -TempogramPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - if (channels < getMinChannelCount() || - channels > getMaxChannelCount()) return false; - - // Real initialisation work goes here! - m_inputBlockSize = blockSize; - m_inputStepSize = stepSize; - - m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2 + 1); +void TempogramPlugin::checkParameterValues(){ if (m_tempogramFftLength < m_tempogramWindowLength){ m_tempogramFftLength = m_tempogramWindowLength; @@ -415,6 +405,20 @@ int numberOfBinsInFirstOctave = bpmToBin(m_cyclicTempogramMinBPM); if (m_cyclicTempogramOctaveDivider > numberOfBinsInFirstOctave) m_cyclicTempogramOctaveDivider = numberOfBinsInFirstOctave; +} + +bool +TempogramPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) +{ + if (channels < getMinChannelCount() || + channels > getMaxChannelCount()) return false; + + // Real initialisation work goes here! + m_inputBlockSize = blockSize; + m_inputStepSize = stepSize; + + m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2.0f + 1); + checkParameterValues(); //cout << m_cyclicTempogramOctaveDivider << endl; return true; @@ -425,7 +429,8 @@ { // Clear buffers, reset stored values, etc m_spectrogram.clear(); - m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2 + 1); + m_spectrogram = SpectrogramTransposed(m_inputBlockSize/2.0f + 1); + checkParameterValues(); } TempogramPlugin::FeatureSet @@ -439,7 +444,7 @@ const float *in = inputBuffers[0]; //calculate magnitude of FrequencyDomain input - for (unsigned int i = 0; i < n; i++){ + for (int i = 0; i < (int)n; i++){ float magnitude = sqrt(in[2*i] * in[2*i] + in[2*i + 1] * in[2*i + 1]); magnitude = magnitude > m_noveltyCurveMinDB ? magnitude : m_noveltyCurveMinDB; m_spectrogram[i].push_back(magnitude); @@ -457,10 +462,10 @@ int bin = bpmToBin(bpm); logBins.push_back(bin); - cerr << bin << endl; + //cerr << bin << endl; } - cerr << logBins.size() << endl; + //cerr << logBins.size() << endl; return logBins; } @@ -472,7 +477,7 @@ int bin = floor((float)m_tempogramFftLength*w/sampleRate + 0.5); if(bin < 0) bin = 0; - else if(bin > m_tempogramFftLength/2) bin = m_tempogramFftLength; + else if(bin > m_tempogramFftLength/2.0f) bin = m_tempogramFftLength; return bin; } @@ -482,7 +487,7 @@ { float * hannWindow = new float[m_tempogramWindowLength]; - for (unsigned int i = 0; i < m_tempogramWindowLength; i++){ + for (int i = 0; i < (int)m_tempogramWindowLength; i++){ hannWindow[i] = 0.0; } @@ -490,11 +495,13 @@ //initialise novelty curve processor size_t numberOfBlocks = m_spectrogram[0].size(); + //cerr << numberOfBlocks << endl; NoveltyCurveProcessor nc(m_inputSampleRate, m_inputBlockSize, numberOfBlocks, m_noveltyCurveCompressionConstant); vector<float> noveltyCurve = nc.spectrogramToNoveltyCurve(m_spectrogram); //calculate novelty curve from magnitude data + //if(noveltyCurve.size() > 50) for (int i = 0; i < 50; i++) cerr << noveltyCurve[i] << endl; //push novelty curve data to featureset 1 and set timestamps - for (unsigned int i = 0; i < numberOfBlocks; i++){ + for (int i = 0; i < (int)numberOfBlocks; i++){ Feature noveltyCurveFeature; noveltyCurveFeature.values.push_back(noveltyCurve[i]); noveltyCurveFeature.hasTimestamp = false; @@ -528,14 +535,14 @@ //Calculate cyclic tempogram vector<unsigned int> logBins = calculateTempogramNearestNeighbourLogBins(); - assert(logBins.back() <= m_tempogramFftLength/2); - assert(logBins.size() == m_cyclicTempogramOctaveDivider*m_cyclicTempogramNumberOfOctaves); + assert(logBins.back() <= m_tempogramFftLength/2.0f); + assert((int)logBins.size() == m_cyclicTempogramOctaveDivider*m_cyclicTempogramNumberOfOctaves); for (int block = 0; block < tempogramLength; block++){ Feature cyclicTempogramFeature; - for (int i = 0; i < m_cyclicTempogramOctaveDivider; i++){ + for (int i = 0; i < (int)m_cyclicTempogramOctaveDivider; i++){ float sum = 0; - for (int j = 0; j < m_cyclicTempogramNumberOfOctaves; j++){ + for (int j = 0; j < (int)m_cyclicTempogramNumberOfOctaves; j++){ sum += tempogram[block][logBins[i+j*m_cyclicTempogramOctaveDivider]]; } cyclicTempogramFeature.values.push_back(sum/m_cyclicTempogramNumberOfOctaves);
--- a/TempogramPlugin.h Fri Aug 15 12:34:07 2014 +0100 +++ b/TempogramPlugin.h Fri Aug 15 15:17:28 2014 +0100 @@ -104,6 +104,7 @@ string floatToString(float value) const; vector<unsigned int> calculateTempogramNearestNeighbourLogBins() const; int bpmToBin(const float &bpm) const; + void checkParameterValues(); };
--- a/WindowFunction.cpp Fri Aug 15 12:34:07 2014 +0100 +++ b/WindowFunction.cpp Fri Aug 15 15:17:28 2014 +0100 @@ -14,12 +14,12 @@ WindowFunction::hanning(float * window, const unsigned int &N, const bool &normalise){ float sum = 0; - for(unsigned int i = 0; i < N; i++){ + for(int i = 0; i < (int)N; i++){ window[i] = 0.5*(1-cos((float)2*M_PI*i/N)); sum += window[i]; } if (normalise){ - for(int i = 0; i < N; i++){ + for(int i = 0; i < (int)N; i++){ window[i] /= sum; } }