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