Mercurial > hg > batch-feature-extraction-tool
changeset 12:761289a660c6
Fixed Spectral Contrast and Periodicity
author | Geogaddi\David <d.m.ronan@qmul.ac.uk> |
---|---|
date | Mon, 17 Aug 2015 19:16:33 +0100 |
parents | be889912d38e |
children | a64055168b9b |
files | Source/AudioSourceFeatureExtractor.cpp Source/FeatureData.cpp Source/ObservationData.h Source/SpectralContrast.cpp |
diffstat | 4 files changed, 65 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/Source/AudioSourceFeatureExtractor.cpp Fri Aug 14 18:33:45 2015 +0100 +++ b/Source/AudioSourceFeatureExtractor.cpp Mon Aug 17 19:16:33 2015 +0100 @@ -13,7 +13,6 @@ #include <math.h> #include <cmath> #include <algorithm> -#include <string> #include <vector> #include <memory> @@ -78,7 +77,7 @@ //Get the peak amplitude rms and crest factor for the current frame float peakvalue = 0; float rms = 0; - float crestfactor = 0; + float crestfactor; for (int i = 0; i < FFTSIZE; i++) { @@ -449,7 +448,7 @@ float AudioSourceFeatureExtractor::EstimatePerdiodicity(std::vector<float> data) { - float periodicity = 0.0; + float periodicity; std::vector<float> downsampleddata = std::vector<float>(data.size(), 0); @@ -466,8 +465,9 @@ int endLag = static_cast<int>(floor(static_cast<float>(60.0 / 30.0 * m_fSampleRate))); int thresh = static_cast<int>(floor(static_cast<float>(0.2 * m_fSampleRate))); - size_t xcorrlen = 0; + XCorr(xcorr, downsampleddata, downsampleddata, endLag); + size_t xcorrlen = xcorr.size(); int i = static_cast<int>(floor(xcorrlen / 2)); @@ -509,7 +509,7 @@ periodicity = (maxVal - minValInRange); - std::string dave = "Periodicity " + std::to_string(periodicity) + "\n"; + //std::string dave = "Periodicity " + std::to_string(periodicity) + "\n"; //OutputDebugString(dave.c_str()); return periodicity; @@ -596,7 +596,7 @@ for (int i = 0; i <= n - 2; i++) { - float temp = min + i * (max - min) / (floor((float)n) - 1); + float temp = min + i * (max - min) / (floor(static_cast<float>(n)) - 1); result.insert(result.begin() + iterator, temp); iterator += 1; }
--- a/Source/FeatureData.cpp Fri Aug 14 18:33:45 2015 +0100 +++ b/Source/FeatureData.cpp Mon Aug 17 19:16:33 2015 +0100 @@ -9,7 +9,6 @@ */ #include "FeatureData.h" -#include <algorithm> FeatureData::FeatureData(){} FeatureData::~FeatureData(){} @@ -799,6 +798,22 @@ maxdeltamfcc.push_back(Max(m_deltamfccs[10])); maxdeltamfcc.push_back(Max(m_deltamfccs[11])); + maxspectralContrast.clear(); + maxspectralContrast.push_back(Max(spectralContrast1)); + maxspectralContrast.push_back(Max(spectralContrast2)); + maxspectralContrast.push_back(Max(spectralContrast3)); + maxspectralContrast.push_back(Max(spectralContrast4)); + maxspectralContrast.push_back(Max(spectralContrast5)); + maxspectralContrast.push_back(Max(spectralContrast6)); + + maxspectralValley.clear(); + maxspectralValley.push_back(Max(spectralValley1)); + maxspectralValley.push_back(Max(spectralValley2)); + maxspectralValley.push_back(Max(spectralValley3)); + maxspectralValley.push_back(Max(spectralValley4)); + maxspectralValley.push_back(Max(spectralValley5)); + maxspectralValley.push_back(Max(spectralValley6)); + obs = ObservationData(Max(rms), Max(peak), Max(crestFactor), Max(zcr), Max(centroid), Max(spread), Max(skewness), Max(kurtosis), Max(brightness), Max(rolloff85), Max(rolloff95), Max(spectralentropy), Max(flatness), Max(spectralcf), Max(spectralflux), maxmfcc, maxdeltamfcc, maxspectralContrast, maxspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy()); obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy()); m_WholeTrackObservationDataMax.push_back(obs); @@ -831,6 +846,22 @@ mindeltamfcc.push_back(Min(m_deltamfccs[10])); mindeltamfcc.push_back(Min(m_deltamfccs[11])); + minspectralContrast.clear(); + minspectralContrast.push_back(Min(spectralContrast1)); + minspectralContrast.push_back(Min(spectralContrast2)); + minspectralContrast.push_back(Min(spectralContrast3)); + minspectralContrast.push_back(Min(spectralContrast4)); + minspectralContrast.push_back(Min(spectralContrast5)); + minspectralContrast.push_back(Min(spectralContrast6)); + + minspectralValley.clear(); + minspectralValley.push_back(Min(spectralValley1)); + minspectralValley.push_back(Min(spectralValley2)); + minspectralValley.push_back(Min(spectralValley3)); + minspectralValley.push_back(Min(spectralValley4)); + minspectralValley.push_back(Min(spectralValley5)); + minspectralValley.push_back(Min(spectralValley6)); + obs = ObservationData(Min(rms), Min(peak), Min(crestFactor), Min(zcr), Min(centroid), Min(spread), Min(skewness), Min(kurtosis), Min(brightness), Min(rolloff85), Min(rolloff95), Min(spectralentropy), Min(flatness), Min(spectralcf), Min(spectralflux), minmfcc, mindeltamfcc, minspectralContrast, minspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy()); obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy()); m_WholeTrackObservationDataMin.push_back(obs);
--- a/Source/ObservationData.h Fri Aug 14 18:33:45 2015 +0100 +++ b/Source/ObservationData.h Mon Aug 17 19:16:33 2015 +0100 @@ -59,11 +59,11 @@ m_spectralentropy = spectralentropy; m_flatness = flatness; m_spectralcf = spectralcf; - m_spectralflux = spectralflux; + m_spectralflux = spectralflux; + m_mfccs = mfccs; + m_dmfccs = dmfccs; m_spectralContrast = spectralContrast; m_spectralValley = spectralValley; - m_mfccs = mfccs; - m_dmfccs = dmfccs; m_periodicity = periodicity; m_entropyofenergy = entropyofenergy; };
--- a/Source/SpectralContrast.cpp Fri Aug 14 18:33:45 2015 +0100 +++ b/Source/SpectralContrast.cpp Mon Aug 17 19:16:33 2015 +0100 @@ -10,6 +10,7 @@ #include "SpectralContrast.h" #include <algorithm> +#include <iostream> void SpectralContrast::initSpectralContrastVariables(int frameSize, float sampleRate) { @@ -56,14 +57,14 @@ std::vector<float> spectrumCopy = spectrum; // I want a copy because I'll be transforming it //substitute minReal for a static value that is the same in all architectures. i.e.: 1e-30 - float minReal = 1e-30f; //numeric_limits<Real>::min(); + float minFloat = std::numeric_limits<float>::min(); //numeric_limits<Real>::min(); spectralContrast.clear(); valleys.clear(); int specIdx = m_startAtBin; - for (int bandIdx = 0; bandIdx < int(m_numberOfBinsInBands.size()) && specIdx < int(spectrumCopy.size()); ++bandIdx) + for (int bandIdx = 0; bandIdx < int(m_numberOfBinsInBands.size()) && specIdx < int(spectrumCopy.size()); ++bandIdx) { // get the mean of the band float bandMean = 0; @@ -72,39 +73,49 @@ bandMean += spectrumCopy[specIdx + i]; } - if (m_numberOfBinsInBands[bandIdx] != 0) bandMean /= m_numberOfBinsInBands[bandIdx]; + if (m_numberOfBinsInBands[bandIdx] != 0) { - bandMean += minReal; + bandMean /= m_numberOfBinsInBands[bandIdx]; } + bandMean += minFloat; + // sort the subband (ascending order) std::sort(spectrumCopy.begin() + specIdx, spectrumCopy.begin() + std::min(specIdx + m_numberOfBinsInBands[bandIdx], int(spectrum.size()))); // number of bins to take the mean of int neighbourBins = int(m_neighbourRatio * m_numberOfBinsInBands[bandIdx]); - if (neighbourBins < 1) neighbourBins = 1; + if (neighbourBins < 1) + { + neighbourBins = 1; + } // valley (FLT_MIN prevents log(0)) float sum = 0; - for (int i = 0; i < neighbourBins && specIdx + i < int(spectrum.size()); ++i) + for (int i = 0; i < neighbourBins && specIdx + i < int(spectrumCopy.size()); ++i) { - sum += spectrum[specIdx + i]; + sum += spectrumCopy[specIdx + i]; } - float valley = sum / neighbourBins + minReal; + float valley = (sum / neighbourBins) + minFloat; // peak sum = 0; - for (int i = m_numberOfBinsInBands[bandIdx]; i > m_numberOfBinsInBands[bandIdx] - neighbourBins && specIdx + i - 1 < int(spectrum.size()) && i > 0; --i) + for (int i = m_numberOfBinsInBands[bandIdx]; i > m_numberOfBinsInBands[bandIdx] - neighbourBins && specIdx + i - 1 < int(spectrumCopy.size()) && i > 0; --i) { - sum += spectrum[specIdx + i - 1]; + sum += spectrumCopy[specIdx + i - 1]; } + - float peak = sum / neighbourBins + minReal; + float peak = (sum / neighbourBins) + minFloat; - spectralContrast.push_back(-1.0f * (pow(peak / valley, float(1.0f / log(bandMean))))); - valleys.push_back(log(valley)); + float ans = (log10(peak / valley)) / (log10(bandMean) + minFloat) ; + + spectralContrast.push_back(ans); + valleys.push_back(log10(valley)); specIdx += m_numberOfBinsInBands[bandIdx]; } + + int dave = 0; } \ No newline at end of file