changeset 10:73852457b624

We now have a the spectral contrast feature
author Geogaddi\David <d.m.ronan@qmul.ac.uk>
date Fri, 14 Aug 2015 18:21:43 +0100
parents 262e084a15a9
children be889912d38e
files FeatureExtractionTool.jucer Source/AudioSourceFeatureExtractor.cpp Source/AudioSourceFeatureExtractor.h Source/FeatureData.cpp Source/ObservationData.h Source/SpectralContrast.cpp Source/SpectralContrast.h Source/WriteCSV.cpp
diffstat 8 files changed, 545 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- a/FeatureExtractionTool.jucer	Wed Aug 12 22:25:06 2015 +0100
+++ b/FeatureExtractionTool.jucer	Fri Aug 14 18:21:43 2015 +0100
@@ -2,7 +2,7 @@
 
 <JUCERPROJECT id="hvJbYi" name="FeatureExtractionTool" projectType="consoleapp"
               version="1.0.0" bundleIdentifier="com.yourcompany.FeatureExtractionTool"
-              includeBinaryInAppConfig="1" jucerVersion="3.1.0">
+              includeBinaryInAppConfig="1" jucerVersion="3.2.0">
   <MAINGROUP id="UKgH5X" name="FeatureExtractionTool">
     <GROUP id="{95DEE943-A3F3-BB07-A6D9-BD28F3B3CFDF}" name="Resource">
       <FILE id="rkvdMy" name="initMFCCVariables.m" compile="1" resource="1"
@@ -29,6 +29,10 @@
         <FILE id="V4aBIS" name="AudioReader.h" compile="0" resource="0" file="Source/AudioReader.h"/>
       </GROUP>
       <GROUP id="{73D0B8BA-664F-24A1-D1DE-9F157AB458E7}" name="Analysis">
+        <FILE id="FpmIPD" name="SpectralContrast.cpp" compile="1" resource="0"
+              file="Source/SpectralContrast.cpp"/>
+        <FILE id="f7YbDu" name="SpectralContrast.h" compile="0" resource="0"
+              file="Source/SpectralContrast.h"/>
         <FILE id="GuHO7T" name="MFCC.cpp" compile="1" resource="0" file="Source/MFCC.cpp"/>
         <FILE id="DStwU0" name="MFCC.h" compile="0" resource="0" file="Source/MFCC.h"/>
         <FILE id="buHhF1" name="AudioSourceFeatureExtractor.cpp" compile="1"
--- a/Source/AudioSourceFeatureExtractor.cpp	Wed Aug 12 22:25:06 2015 +0100
+++ b/Source/AudioSourceFeatureExtractor.cpp	Fri Aug 14 18:21:43 2015 +0100
@@ -49,6 +49,7 @@
 	}
 
 	m_MFCC.initMFFCvariables(12, MAGNITUDESIZE, m_fSampleRate);
+	m_SpectralContrast.initSpectralContrastVariables(FFTSIZE, m_fSampleRate);
 }
 
 //==============================================================================  process
@@ -137,11 +138,15 @@
 			float spectralcf = 0;
 			float spectralflux = 0;
 			std::vector<float> mfccs;
+			std::vector<float> spectralContrast;
+			std::vector<float> spectralValleys;
 
 			SpectralFeatures(m_fMagnitudeSpectrum, m_fPreviousMagnitudeSpectrum, MAGNITUDESIZE, centroid, spread, skewness, kurtosis, brightness, rolloff85, rolloff95, spectralentropy, flatness, spectralcf, spectralflux);
 
 			m_MFCC.ComputeMFCC(m_fMagnitudeSpectrum, mfccs);
 
+			m_SpectralContrast.computeSpectralContrast(m_fMagnitudeSpectrum, spectralContrast, spectralValleys);
+
 			//Update for Spectral Flux
 			for (int i = 0; i < MAGNITUDESIZE; i++)
 			{
@@ -156,7 +161,7 @@
 			}
 
 			//create an observation for this window and push it to the list of observations for this 30 sec. audio clip
-			ObservationData newObservation = ObservationData(rms, peakvalue, crestfactor, ZCR, centroid, spread, skewness, kurtosis, brightness, rolloff85, rolloff95, spectralentropy, flatness, spectralcf, spectralflux, mfccs, perdiodicity, entropyofenergy);
+			ObservationData newObservation = ObservationData(rms, peakvalue, crestfactor, ZCR, centroid, spread, skewness, kurtosis, brightness, rolloff85, rolloff95, spectralentropy, flatness, spectralcf, spectralflux, mfccs, spectralContrast, spectralValleys, perdiodicity, entropyofenergy);
 			observations.push_back(newObservation);
 		}
 	}
--- a/Source/AudioSourceFeatureExtractor.h	Wed Aug 12 22:25:06 2015 +0100
+++ b/Source/AudioSourceFeatureExtractor.h	Fri Aug 14 18:21:43 2015 +0100
@@ -15,6 +15,7 @@
 
 #include "FFT.h"
 #include "MFCC.h"
+#include "SpectralContrast.h"
 #include "ObservationData.h"
 
 #define MAGNITUDESIZE 512
@@ -71,6 +72,7 @@
 	std::vector<float> m_OutReal;
 	std::vector<float> m_OutImag;
 	MFCC   m_MFCC;
+	SpectralContrast m_SpectralContrast;
 	std::vector<float> m_fInputBuffer;
 	std::vector<float> m_fMagnitudeSpectrum;
 	std::vector<float> m_fPreviousMagnitudeSpectrum;
--- a/Source/FeatureData.cpp	Wed Aug 12 22:25:06 2015 +0100
+++ b/Source/FeatureData.cpp	Fri Aug 14 18:21:43 2015 +0100
@@ -50,18 +50,19 @@
 	std::vector<float>  mfcc11;
 	std::vector<float>  mfcc12;
 
-	std::vector<float>  dmfcc1;
-	std::vector<float>  dmfcc2;
-	std::vector<float>  dmfcc3;
-	std::vector<float>  dmfcc4;
-	std::vector<float>  dmfcc5;
-	std::vector<float>  dmfcc6;
-	std::vector<float>  dmfcc7;
-	std::vector<float>  dmfcc8;
-	std::vector<float>  dmfcc9;
-	std::vector<float>  dmfcc10;
-	std::vector<float>  dmfcc11;
-	std::vector<float>  dmfcc12;
+	std::vector<float>  spectralContrast1;
+	std::vector<float>  spectralContrast2;
+	std::vector<float>  spectralContrast3;
+	std::vector<float>  spectralContrast4;
+	std::vector<float>  spectralContrast5;
+	std::vector<float>  spectralContrast6;
+
+	std::vector<float>  spectralValley1;
+	std::vector<float>  spectralValley2;
+	std::vector<float>  spectralValley3;
+	std::vector<float>  spectralValley4;
+	std::vector<float>  spectralValley5;
+	std::vector<float>  spectralValley6;
 
 	for(size_t i = 1; i <= m_ObservationData.size(); i++)
 	{
@@ -80,6 +81,7 @@
 		flatness.push_back(m_ObservationData[i -1].GetFlatness());
 		spectralcf.push_back(m_ObservationData[i -1].GetSpectralCF());
 		spectralflux.push_back(m_ObservationData[i -1].GetSpectralFlux());
+
 		mfcc1.push_back(m_ObservationData[i -1].GetMFCCs()[0]);
 		mfcc2.push_back(m_ObservationData[i -1].GetMFCCs()[1]);
 		mfcc3.push_back(m_ObservationData[i -1].GetMFCCs()[2]);
@@ -93,6 +95,20 @@
 		mfcc11.push_back(m_ObservationData[i -1].GetMFCCs()[10]);
 		mfcc12.push_back(m_ObservationData[i -1].GetMFCCs()[11]);
 
+		spectralContrast1.push_back(m_ObservationData[i - 1].GetSpectralContrast()[0]);
+		spectralContrast2.push_back(m_ObservationData[i - 1].GetSpectralContrast()[1]);
+		spectralContrast3.push_back(m_ObservationData[i - 1].GetSpectralContrast()[2]);
+		spectralContrast4.push_back(m_ObservationData[i - 1].GetSpectralContrast()[3]);
+		spectralContrast5.push_back(m_ObservationData[i - 1].GetSpectralContrast()[4]);
+		spectralContrast6.push_back(m_ObservationData[i - 1].GetSpectralContrast()[5]);
+
+		spectralValley1.push_back(m_ObservationData[i - 1].GetSpectralValley()[0]);
+		spectralValley2.push_back(m_ObservationData[i - 1].GetSpectralValley()[1]);
+		spectralValley3.push_back(m_ObservationData[i - 1].GetSpectralValley()[2]);
+		spectralValley4.push_back(m_ObservationData[i - 1].GetSpectralValley()[3]);
+		spectralValley5.push_back(m_ObservationData[i - 1].GetSpectralValley()[4]);
+		spectralValley6.push_back(m_ObservationData[i - 1].GetSpectralValley()[5]);
+
 		if(i % modval == 0)
 		{
 			std::vector<float> peaksubset(peak.begin() + index, peak.begin() + index + modval);
@@ -123,19 +139,33 @@
 			std::vector<float> mfcc10subset(mfcc10.begin() + index, mfcc10.begin() + index + modval);			
 			std::vector<float> mfcc11subset(mfcc11.begin() + index, mfcc11.begin() + index + modval);			
 			std::vector<float> mfcc12subset(mfcc12.begin() + index, mfcc12.begin() + index + modval);
+					
+			std::vector<float> dmfcc1subset(m_deltamfccs[0].begin() + index, m_deltamfccs[0].begin() + index + modval);
+			std::vector<float> dmfcc2subset(m_deltamfccs[1].begin() + index, m_deltamfccs[1].begin() + index + modval);
+			std::vector<float> dmfcc3subset(m_deltamfccs[2].begin() + index, m_deltamfccs[2].begin() + index + modval);
+			std::vector<float> dmfcc4subset(m_deltamfccs[3].begin() + index, m_deltamfccs[3].begin() + index + modval);
+			std::vector<float> dmfcc5subset(m_deltamfccs[4].begin() + index, m_deltamfccs[4].begin() + index + modval);
+			std::vector<float> dmfcc6subset(m_deltamfccs[5].begin() + index, m_deltamfccs[5].begin() + index + modval);
+			std::vector<float> dmfcc7subset(m_deltamfccs[6].begin() + index, m_deltamfccs[6].begin() + index + modval);
+			std::vector<float> dmfcc8subset(m_deltamfccs[7].begin() + index, m_deltamfccs[7].begin() + index + modval);
+			std::vector<float> dmfcc9subset(m_deltamfccs[8].begin() + index, m_deltamfccs[8].begin() + index + modval);
+			std::vector<float> dmfcc10subset(m_deltamfccs[9].begin() + index, m_deltamfccs[9].begin() + index + modval);
+			std::vector<float> dmfcc11subset(m_deltamfccs[10].begin() + index, m_deltamfccs[10].begin() + index + modval);
+			std::vector<float> dmfcc12subset(m_deltamfccs[11].begin() + index, m_deltamfccs[11].begin() + index + modval);
 
-			std::vector<float> dmfcc1subset(m_deltamfccs[0].begin() + index, m_deltamfccs[0].begin() + index + modval);			
-			std::vector<float> dmfcc2subset(m_deltamfccs[1].begin() + index, m_deltamfccs[1].begin() + index + modval);			
-			std::vector<float> dmfcc3subset(m_deltamfccs[2].begin() + index, m_deltamfccs[2].begin() + index + modval);			
-			std::vector<float> dmfcc4subset(m_deltamfccs[3].begin() + index, m_deltamfccs[3].begin() + index + modval);			
-			std::vector<float> dmfcc5subset(m_deltamfccs[4].begin() + index, m_deltamfccs[4].begin() + index + modval);			
-			std::vector<float> dmfcc6subset(m_deltamfccs[5].begin() + index, m_deltamfccs[5].begin() + index + modval);			
-			std::vector<float> dmfcc7subset(m_deltamfccs[6].begin() + index, m_deltamfccs[6].begin() + index + modval);			
-			std::vector<float> dmfcc8subset(m_deltamfccs[7].begin() + index, m_deltamfccs[7].begin() + index + modval);			
-			std::vector<float> dmfcc9subset(m_deltamfccs[8].begin() + index, m_deltamfccs[8].begin() + index + modval);			
-			std::vector<float> dmfcc10subset(m_deltamfccs[9].begin() + index, m_deltamfccs[9].begin() + index + modval);			
-			std::vector<float> dmfcc11subset(m_deltamfccs[10].begin() + index, m_deltamfccs[10].begin() + index + modval);			
-			std::vector<float> dmfcc12subset(m_deltamfccs[11].begin() + index, m_deltamfccs[11].begin() + index + modval);
+			std::vector<float> spectralContrast1subset(spectralContrast1.begin() + index, spectralContrast1.begin() + index + modval);
+			std::vector<float> spectralContrast2subset(spectralContrast2.begin() + index, spectralContrast2.begin() + index + modval);
+			std::vector<float> spectralContrast3subset(spectralContrast3.begin() + index, spectralContrast3.begin() + index + modval);
+			std::vector<float> spectralContrast4subset(spectralContrast4.begin() + index, spectralContrast4.begin() + index + modval);
+			std::vector<float> spectralContrast5subset(spectralContrast5.begin() + index, spectralContrast5.begin() + index + modval);
+			std::vector<float> spectralContrast6subset(spectralContrast6.begin() + index, spectralContrast6.begin() + index + modval);
+
+			std::vector<float> spectralValley1subset(spectralValley1.begin() + index, spectralValley1.begin() + index + modval);
+			std::vector<float> spectralValley2subset(spectralValley2.begin() + index, spectralValley2.begin() + index + modval);
+			std::vector<float> spectralValley3subset(spectralValley3.begin() + index, spectralValley3.begin() + index + modval);
+			std::vector<float> spectralValley4subset(spectralValley4.begin() + index, spectralValley4.begin() + index + modval);
+			std::vector<float> spectralValley5subset(spectralValley5.begin() + index, spectralValley5.begin() + index + modval);
+			std::vector<float> spectralValley6subset(spectralValley6.begin() + index, spectralValley6.begin() + index + modval);
 
 			float  avgpeak = Average(peaksubset);
 			float  avgrms = Average(rmssubset);
@@ -154,6 +184,9 @@
 			float  avgspectralflux = Average(spectralfluxsubset); 
 			std::vector<float>  avgmfcc;
 			std::vector<float>  avgdmfcc;
+			std::vector<float>  avgspectralContrast;
+			std::vector<float>  avgspectralValley;
+
 			avgmfcc.push_back(Average(mfcc1subset));
 			avgmfcc.push_back(Average(mfcc2subset));
 			avgmfcc.push_back(Average(mfcc3subset));
@@ -180,44 +213,79 @@
 			avgdmfcc.push_back(Average(dmfcc11subset));
 			avgdmfcc.push_back(Average(dmfcc12subset));
 
-			ObservationData obs = ObservationData(avgrms, avgpeak, avgcrestFactor, avgzcr, avgcentroid, avgspread, avgskewness, avgkurtosis, avgbrightness, avgrolloff85, avgrolloff95, avgspectralentropy, avgflatness, avgspectralcf, avgspectralflux, avgmfcc, avgdmfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+			avgspectralContrast.push_back(Average(spectralContrast1subset));
+			avgspectralContrast.push_back(Average(spectralContrast2subset));
+			avgspectralContrast.push_back(Average(spectralContrast3subset));
+			avgspectralContrast.push_back(Average(spectralContrast4subset));
+			avgspectralContrast.push_back(Average(spectralContrast5subset));
+			avgspectralContrast.push_back(Average(spectralContrast6subset));
+
+			avgspectralValley.push_back(Average(spectralValley1subset));
+			avgspectralValley.push_back(Average(spectralValley2subset));
+			avgspectralValley.push_back(Average(spectralValley3subset));
+			avgspectralValley.push_back(Average(spectralValley4subset));
+			avgspectralValley.push_back(Average(spectralValley5subset));
+			avgspectralValley.push_back(Average(spectralValley6subset));
+
+
+			ObservationData obs = ObservationData(avgrms, avgpeak, avgcrestFactor, avgzcr, avgcentroid, avgspread, avgskewness, avgkurtosis, avgbrightness, avgrolloff85, avgrolloff95, avgspectralentropy, avgflatness, avgspectralcf, avgspectralflux, avgmfcc, avgdmfcc, avgspectralContrast, avgspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 			obs.SetLowEnergy(m_ObservationData[i-1].GetLowEnergy());
 			m_PooledObservationDataAverage.push_back(obs);
 
 			std::vector<float>  stdmfcc;
 			std::vector<float>  stddmfcc;
-			stdmfcc.push_back(Deviation(mfcc1,avgmfcc[0]));
-			stdmfcc.push_back(Deviation(mfcc2,avgmfcc[1]));
-			stdmfcc.push_back(Deviation(mfcc3,avgmfcc[2]));
-			stdmfcc.push_back(Deviation(mfcc4,avgmfcc[3]));
-			stdmfcc.push_back(Deviation(mfcc5,avgmfcc[4]));
-			stdmfcc.push_back(Deviation(mfcc6,avgmfcc[5]));
-			stdmfcc.push_back(Deviation(mfcc7,avgmfcc[6]));
-			stdmfcc.push_back(Deviation(mfcc8,avgmfcc[7]));
-			stdmfcc.push_back(Deviation(mfcc9,avgmfcc[8]));
-			stdmfcc.push_back(Deviation(mfcc10,avgmfcc[9]));
-			stdmfcc.push_back(Deviation(mfcc11,avgmfcc[10]));
-			stdmfcc.push_back(Deviation(mfcc12,avgmfcc[11]));
+			std::vector<float>  stdspectralContrast;
+			std::vector<float>  stdspectralValley;
 
-			stddmfcc.push_back(Deviation(m_deltamfccs[0], avgdmfcc[0]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[1], avgdmfcc[1]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[2], avgdmfcc[2]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[3], avgdmfcc[3]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[4], avgdmfcc[4]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[5], avgdmfcc[5]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[6], avgdmfcc[6]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[7], avgdmfcc[7]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[8], avgdmfcc[8]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[9], avgdmfcc[9]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[10], avgdmfcc[10]));
-			stddmfcc.push_back(Deviation(m_deltamfccs[11], avgdmfcc[11]));
+			stdmfcc.push_back(Deviation(mfcc1subset,avgmfcc[0]));
+			stdmfcc.push_back(Deviation(mfcc2subset, avgmfcc[1]));
+			stdmfcc.push_back(Deviation(mfcc3subset, avgmfcc[2]));
+			stdmfcc.push_back(Deviation(mfcc4subset, avgmfcc[3]));
+			stdmfcc.push_back(Deviation(mfcc5subset, avgmfcc[4]));
+			stdmfcc.push_back(Deviation(mfcc6subset, avgmfcc[5]));
+			stdmfcc.push_back(Deviation(mfcc7subset, avgmfcc[6]));
+			stdmfcc.push_back(Deviation(mfcc8subset, avgmfcc[7]));
+			stdmfcc.push_back(Deviation(mfcc9subset, avgmfcc[8]));
+			stdmfcc.push_back(Deviation(mfcc10subset, avgmfcc[9]));
+			stdmfcc.push_back(Deviation(mfcc11subset, avgmfcc[10]));
+			stdmfcc.push_back(Deviation(mfcc12subset, avgmfcc[11]));
 
-			obs = ObservationData(Deviation(rmssubset, avgrms), Deviation(peaksubset, avgpeak),  Deviation(crestfactorsubset, avgcrestFactor), Deviation(zcrsubset, avgzcr), Deviation(centroidsubset, avgcentroid), Deviation(spreadsubset, avgspread), Deviation(skewnesssubset, avgskewness), Deviation(kurtosissubset, avgkurtosis), Deviation(brightnesssubset, avgbrightness), Deviation(rolloff85subset, avgrolloff85), Deviation(rolloff95subset, avgrolloff95), Deviation(spectralentropysubset, avgspectralentropy), Deviation(flatnesssubset, avgflatness), Deviation(spectralcfsubset, avgspectralcf), Deviation(spectralfluxsubset, avgspectralflux), stdmfcc, stddmfcc, 0, 0);
+			stddmfcc.push_back(Deviation(dmfcc1subset, avgdmfcc[0]));
+			stddmfcc.push_back(Deviation(dmfcc2subset, avgdmfcc[1]));
+			stddmfcc.push_back(Deviation(dmfcc3subset, avgdmfcc[2]));
+			stddmfcc.push_back(Deviation(dmfcc4subset, avgdmfcc[3]));
+			stddmfcc.push_back(Deviation(dmfcc5subset, avgdmfcc[4]));
+			stddmfcc.push_back(Deviation(dmfcc6subset, avgdmfcc[5]));
+			stddmfcc.push_back(Deviation(dmfcc7subset, avgdmfcc[6]));
+			stddmfcc.push_back(Deviation(dmfcc8subset, avgdmfcc[7]));
+			stddmfcc.push_back(Deviation(dmfcc9subset, avgdmfcc[8]));
+			stddmfcc.push_back(Deviation(dmfcc10subset, avgdmfcc[9]));
+			stddmfcc.push_back(Deviation(dmfcc11subset, avgdmfcc[10]));
+			stddmfcc.push_back(Deviation(dmfcc12subset, avgdmfcc[11]));
+
+			stdspectralContrast.push_back(Deviation(spectralContrast1subset, avgspectralContrast[0]));
+			stdspectralContrast.push_back(Deviation(spectralContrast2subset, avgspectralContrast[1]));
+			stdspectralContrast.push_back(Deviation(spectralContrast3subset, avgspectralContrast[2]));
+			stdspectralContrast.push_back(Deviation(spectralContrast4subset, avgspectralContrast[3]));
+			stdspectralContrast.push_back(Deviation(spectralContrast5subset, avgspectralContrast[4]));
+			stdspectralContrast.push_back(Deviation(spectralContrast6subset, avgspectralContrast[5]));
+
+			stdspectralValley.push_back(Deviation(spectralValley1subset, avgspectralValley[0]));
+			stdspectralValley.push_back(Deviation(spectralValley2subset, avgspectralValley[1]));
+			stdspectralValley.push_back(Deviation(spectralValley3subset, avgspectralValley[2]));
+			stdspectralValley.push_back(Deviation(spectralValley4subset, avgspectralValley[3]));
+			stdspectralValley.push_back(Deviation(spectralValley5subset, avgspectralValley[4]));
+			stdspectralValley.push_back(Deviation(spectralValley6subset, avgspectralValley[5]));
+
+			obs = ObservationData(Deviation(rmssubset, avgrms), Deviation(peaksubset, avgpeak),  Deviation(crestfactorsubset, avgcrestFactor), Deviation(zcrsubset, avgzcr), Deviation(centroidsubset, avgcentroid), Deviation(spreadsubset, avgspread), Deviation(skewnesssubset, avgskewness), Deviation(kurtosissubset, avgkurtosis), Deviation(brightnesssubset, avgbrightness), Deviation(rolloff85subset, avgrolloff85), Deviation(rolloff95subset, avgrolloff95), Deviation(spectralentropysubset, avgspectralentropy), Deviation(flatnesssubset, avgflatness), Deviation(spectralcfsubset, avgspectralcf), Deviation(spectralfluxsubset, avgspectralflux), stdmfcc, stddmfcc, stdspectralContrast, stdspectralValley, 0, 0);
 			obs.SetLowEnergy(0); //
 			m_PooledObservationDataStd.push_back(obs);
 
 			std::vector<float>  maxmfcc;
 			std::vector<float>  maxdmfcc;
+			std::vector<float>  maxspectralContrast;
+			std::vector<float>  maxspectralValley;
+
 			maxmfcc.push_back(Max(mfcc1subset));
 			maxmfcc.push_back(Max(mfcc2subset));
 			maxmfcc.push_back(Max(mfcc3subset));
@@ -244,12 +312,29 @@
 			maxdmfcc.push_back(Max(dmfcc11subset));
 			maxdmfcc.push_back(Max(dmfcc12subset));
 
-			obs = ObservationData(Max(rmssubset), Max(peaksubset), Max(crestfactorsubset),  Max(zcrsubset), Max(centroidsubset), Max(spreadsubset), Max(skewnesssubset), Max(kurtosissubset), Max(brightnesssubset), Max(rolloff85subset), Max(rolloff95subset), Max(spectralentropysubset), Max(flatnesssubset), Max(spectralcfsubset), Max(spectralfluxsubset), maxmfcc, maxdmfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+			maxspectralContrast.push_back(Max(spectralContrast1subset));
+			maxspectralContrast.push_back(Max(spectralContrast2subset));
+			maxspectralContrast.push_back(Max(spectralContrast3subset));
+			maxspectralContrast.push_back(Max(spectralContrast4subset));
+			maxspectralContrast.push_back(Max(spectralContrast5subset));
+			maxspectralContrast.push_back(Max(spectralContrast6subset));
+
+			maxspectralValley.push_back(Max(spectralValley1subset));
+			maxspectralValley.push_back(Max(spectralValley2subset));
+			maxspectralValley.push_back(Max(spectralValley3subset));
+			maxspectralValley.push_back(Max(spectralValley4subset));
+			maxspectralValley.push_back(Max(spectralValley5subset));
+			maxspectralValley.push_back(Max(spectralValley6subset));
+
+			obs = ObservationData(Max(rmssubset), Max(peaksubset), Max(crestfactorsubset),  Max(zcrsubset), Max(centroidsubset), Max(spreadsubset), Max(skewnesssubset), Max(kurtosissubset), Max(brightnesssubset), Max(rolloff85subset), Max(rolloff95subset), Max(spectralentropysubset), Max(flatnesssubset), Max(spectralcfsubset), Max(spectralfluxsubset), maxmfcc, maxdmfcc, maxspectralContrast, maxspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 			obs.SetLowEnergy(m_ObservationData[i-1].GetLowEnergy());
 			m_PooledObservationDataMax.push_back(obs);
 
 			std::vector<float>  minmfcc;
 			std::vector<float>  mindmfcc;
+			std::vector<float>  minspectralContrast;
+			std::vector<float>  minspectralValley;
+
 			minmfcc.push_back(Min(mfcc1subset));
 			minmfcc.push_back(Min(mfcc2subset));
 			minmfcc.push_back(Min(mfcc3subset));
@@ -276,7 +361,21 @@
 			mindmfcc.push_back(Min(dmfcc11subset));
 			mindmfcc.push_back(Min(dmfcc12subset));
 
-			obs = ObservationData(Min(rmssubset), Min(peaksubset),  Min(crestfactorsubset),  Min(zcrsubset), Min(centroidsubset), Min(spreadsubset), Min(skewnesssubset), Min(kurtosissubset), Min(brightnesssubset), Min(rolloff85subset), Min(rolloff95subset), Min(spectralentropysubset), Min(flatnesssubset), Min(spectralcfsubset),  Min(spectralfluxsubset), minmfcc, mindmfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+			minspectralContrast.push_back(Min(spectralContrast1subset));
+			minspectralContrast.push_back(Min(spectralContrast2subset));
+			minspectralContrast.push_back(Min(spectralContrast3subset));
+			minspectralContrast.push_back(Min(spectralContrast4subset));
+			minspectralContrast.push_back(Min(spectralContrast5subset));
+			minspectralContrast.push_back(Min(spectralContrast6subset));
+
+			minspectralValley.push_back(Min(spectralValley1subset));
+			minspectralValley.push_back(Min(spectralValley2subset));
+			minspectralValley.push_back(Min(spectralValley3subset));
+			minspectralValley.push_back(Min(spectralValley4subset));
+			minspectralValley.push_back(Min(spectralValley5subset));
+			minspectralValley.push_back(Min(spectralValley6subset));
+
+			obs = ObservationData(Min(rmssubset), Min(peaksubset),  Min(crestfactorsubset),  Min(zcrsubset), Min(centroidsubset), Min(spreadsubset), Min(skewnesssubset), Min(kurtosissubset), Min(brightnesssubset), Min(rolloff85subset), Min(rolloff95subset), Min(spectralentropysubset), Min(flatnesssubset), Min(spectralcfsubset),  Min(spectralfluxsubset), minmfcc, mindmfcc, minspectralContrast, minspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 			obs.SetLowEnergy(m_ObservationData[i-1].GetLowEnergy());
 			m_PooledObservationDataMin.push_back(obs);
 
@@ -329,6 +428,20 @@
 	std::vector<float> dmfcc11subset(m_deltamfccs[10].begin() + remainderindex, m_deltamfccs[10].end());			
 	std::vector<float> dmfcc12subset(m_deltamfccs[11].begin() + remainderindex, m_deltamfccs[11].end());
 
+	std::vector<float> spectralContrast1subset(spectralContrast1.begin() + remainderindex, spectralContrast1.end());
+	std::vector<float> spectralContrast2subset(spectralContrast2.begin() + remainderindex, spectralContrast2.end());
+	std::vector<float> spectralContrast3subset(spectralContrast3.begin() + remainderindex, spectralContrast3.end());
+	std::vector<float> spectralContrast4subset(spectralContrast4.begin() + remainderindex, spectralContrast4.end());
+	std::vector<float> spectralContrast5subset(spectralContrast5.begin() + remainderindex, spectralContrast5.end());
+	std::vector<float> spectralContrast6subset(spectralContrast6.begin() + remainderindex, spectralContrast6.end());
+
+	std::vector<float> spectralValley1subset(spectralValley1.begin() + remainderindex, spectralValley1.end());
+	std::vector<float> spectralValley2subset(spectralValley2.begin() + remainderindex, spectralValley2.end());
+	std::vector<float> spectralValley3subset(spectralValley3.begin() + remainderindex, spectralValley3.end());
+	std::vector<float> spectralValley4subset(spectralValley4.begin() + remainderindex, spectralValley4.end());
+	std::vector<float> spectralValley5subset(spectralValley5.begin() + remainderindex, spectralValley5.end());
+	std::vector<float> spectralValley6subset(spectralValley6.begin() + remainderindex, spectralValley6.end());
+
 	float  avgpeak = Average(peaksubset);
 	float  avgrms = Average(rmssubset);
 	float  avgcrestFactor = Average(crestFactorsubset);
@@ -347,6 +460,9 @@
 
 	std::vector<float>  avgmfcc;
 	std::vector<float>  avgdeltamfcc;
+	std::vector<float>  avgspectralContrast;
+	std::vector<float>  avgspectralValley;
+
 	avgmfcc.push_back(Average(mfcc1subset));
 	avgmfcc.push_back(Average(mfcc2subset));
 	avgmfcc.push_back(Average(mfcc3subset));
@@ -373,12 +489,29 @@
 	avgdeltamfcc.push_back(Average(dmfcc11subset));
 	avgdeltamfcc.push_back(Average(dmfcc12subset));
 
-	ObservationData 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());
+	avgspectralContrast.push_back(Average(spectralContrast1subset));
+	avgspectralContrast.push_back(Average(spectralContrast2subset));
+	avgspectralContrast.push_back(Average(spectralContrast3subset));
+	avgspectralContrast.push_back(Average(spectralContrast4subset));
+	avgspectralContrast.push_back(Average(spectralContrast5subset));
+	avgspectralContrast.push_back(Average(spectralContrast6subset));
+
+	avgspectralValley.push_back(Average(spectralValley1subset));
+	avgspectralValley.push_back(Average(spectralValley2subset));
+	avgspectralValley.push_back(Average(spectralValley3subset));
+	avgspectralValley.push_back(Average(spectralValley4subset));
+	avgspectralValley.push_back(Average(spectralValley5subset));
+	avgspectralValley.push_back(Average(spectralValley6subset));
+
+	ObservationData obs = ObservationData(avgrms, avgpeak, avgcrestFactor, avgzcr, avgcentroid, avgspread, avgskewness, avgkurtosis, avgbrightness, avgrolloff85, avgrolloff95, avgspectralentropy, avgflatness, avgspectralcf, avgspectralflux, avgmfcc, avgdeltamfcc, avgspectralContrast, avgspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 	obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy());
 	m_PooledObservationDataAverage.push_back(obs);
 
 	std::vector<float>  stdmfcc;
 	std::vector<float>  stddeltamfcc;
+	std::vector<float>  stdspectralContrast;
+	std::vector<float>  stdspectralValley;
+
 	stdmfcc.push_back(Deviation(mfcc1subset,avgmfcc[0]));
 	stdmfcc.push_back(Deviation(mfcc2subset,avgmfcc[1]));
 	stdmfcc.push_back(Deviation(mfcc3subset,avgmfcc[2]));
@@ -405,12 +538,29 @@
 	stddeltamfcc.push_back(Deviation(dmfcc11subset,avgdeltamfcc[10]));
 	stddeltamfcc.push_back(Deviation(dmfcc12subset,avgdeltamfcc[11]));
 
-	obs = ObservationData(Deviation(rmssubset, avgrms), Deviation(peaksubset, avgpeak), Deviation(crestFactorsubset, avgcrestFactor), Deviation(zcrsubset, avgzcr), Deviation(centroidsubset, avgcentroid), Deviation(spreadsubset, avgspread), Deviation(skewnesssubset, avgskewness), Deviation(kurtosissubset, avgkurtosis), Deviation(brightnesssubset, avgbrightness), Deviation(rolloff85subset, avgrolloff85), Deviation(rolloff95subset, avgrolloff95), Deviation(spectralentropysubset, avgspectralentropy), Deviation(flatnesssubset, avgflatness), Deviation(spectralcfsubset, avgspectralcf), Deviation(spectralfluxsubset, avgspectralflux), stdmfcc, stddeltamfcc, 0, 0);
+	stdspectralContrast.push_back(Deviation(spectralContrast1subset, avgspectralContrast[0]));
+	stdspectralContrast.push_back(Deviation(spectralContrast2subset, avgspectralContrast[1]));
+	stdspectralContrast.push_back(Deviation(spectralContrast3subset, avgspectralContrast[2]));
+	stdspectralContrast.push_back(Deviation(spectralContrast4subset, avgspectralContrast[3]));
+	stdspectralContrast.push_back(Deviation(spectralContrast5subset, avgspectralContrast[4]));
+	stdspectralContrast.push_back(Deviation(spectralContrast6subset, avgspectralContrast[5]));
+
+	stdspectralValley.push_back(Deviation(spectralValley1subset, avgspectralValley[0]));
+	stdspectralValley.push_back(Deviation(spectralValley2subset, avgspectralValley[1]));
+	stdspectralValley.push_back(Deviation(spectralValley3subset, avgspectralValley[2]));
+	stdspectralValley.push_back(Deviation(spectralValley4subset, avgspectralValley[3]));
+	stdspectralValley.push_back(Deviation(spectralValley5subset, avgspectralValley[4]));
+	stdspectralValley.push_back(Deviation(spectralValley6subset, avgspectralValley[5]));
+
+	obs = ObservationData(Deviation(rmssubset, avgrms), Deviation(peaksubset, avgpeak), Deviation(crestFactorsubset, avgcrestFactor), Deviation(zcrsubset, avgzcr), Deviation(centroidsubset, avgcentroid), Deviation(spreadsubset, avgspread), Deviation(skewnesssubset, avgskewness), Deviation(kurtosissubset, avgkurtosis), Deviation(brightnesssubset, avgbrightness), Deviation(rolloff85subset, avgrolloff85), Deviation(rolloff95subset, avgrolloff95), Deviation(spectralentropysubset, avgspectralentropy), Deviation(flatnesssubset, avgflatness), Deviation(spectralcfsubset, avgspectralcf), Deviation(spectralfluxsubset, avgspectralflux), stdmfcc, stddeltamfcc, stdspectralContrast, stdspectralValley, 0, 0);
 	obs.SetLowEnergy(0); //
 	m_PooledObservationDataStd.push_back(obs);
 
 	std::vector<float>  maxmfcc;
 	std::vector<float>  maxdeltamfcc;
+	std::vector<float>  maxspectralContrast;
+	std::vector<float>  maxspectralValley;
+
 	maxmfcc.push_back(Max(mfcc1subset));
 	maxmfcc.push_back(Max(mfcc2subset));
 	maxmfcc.push_back(Max(mfcc3subset));
@@ -437,12 +587,29 @@
 	maxdeltamfcc.push_back(Max(dmfcc11subset));
 	maxdeltamfcc.push_back(Max(dmfcc12subset));
 
-	obs = ObservationData(Max(rmssubset), Max(peaksubset), Max(crestFactorsubset), Max(zcrsubset), Max(centroidsubset), Max(spreadsubset), Max(skewnesssubset), Max(kurtosissubset), Max(brightnesssubset), Max(rolloff85subset), Max(rolloff95subset), Max(spectralentropysubset), Max(flatnesssubset), Max(spectralcfsubset),  Max(spectralfluxsubset), maxmfcc, maxdeltamfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+	maxspectralContrast.push_back(Max(spectralContrast1subset));
+	maxspectralContrast.push_back(Max(spectralContrast2subset));
+	maxspectralContrast.push_back(Max(spectralContrast3subset));
+	maxspectralContrast.push_back(Max(spectralContrast4subset));
+	maxspectralContrast.push_back(Max(spectralContrast5subset));
+	maxspectralContrast.push_back(Max(spectralContrast6subset));
+
+	maxspectralValley.push_back(Max(spectralValley1subset));
+	maxspectralValley.push_back(Max(spectralValley2subset));
+	maxspectralValley.push_back(Max(spectralValley3subset));
+	maxspectralValley.push_back(Max(spectralValley4subset));
+	maxspectralValley.push_back(Max(spectralValley5subset));
+	maxspectralValley.push_back(Max(spectralValley6subset));
+
+	obs = ObservationData(Max(rmssubset), Max(peaksubset), Max(crestFactorsubset), Max(zcrsubset), Max(centroidsubset), Max(spreadsubset), Max(skewnesssubset), Max(kurtosissubset), Max(brightnesssubset), Max(rolloff85subset), Max(rolloff95subset), Max(spectralentropysubset), Max(flatnesssubset), Max(spectralcfsubset),  Max(spectralfluxsubset), maxmfcc, maxdeltamfcc, maxspectralContrast, maxspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 	obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy());
 	m_PooledObservationDataMax.push_back(obs);
 
 	std::vector<float>  minmfcc;
 	std::vector<float> mindeltamfcc;
+	std::vector<float>  minspectralContrast;
+	std::vector<float>  minspectralValley;
+
 	minmfcc.push_back(Min(mfcc1subset));
 	minmfcc.push_back(Min(mfcc2subset));
 	minmfcc.push_back(Min(mfcc3subset));
@@ -469,7 +636,22 @@
 	mindeltamfcc.push_back(Min(dmfcc11subset));
 	mindeltamfcc.push_back(Min(dmfcc12subset));
 
-	obs = ObservationData( Min(rmssubset), Min(peaksubset), Min(crestFactorsubset), Min(zcrsubset), Min(centroidsubset), Min(spreadsubset), Min(skewnesssubset), Min(kurtosissubset), Min(brightnesssubset), Min(rolloff85subset), Min(rolloff95subset), Min(spectralentropysubset), Min(flatnesssubset), Min(spectralcfsubset),  Min(spectralfluxsubset), minmfcc, mindeltamfcc, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+	minspectralContrast.push_back(Min(spectralContrast1subset));
+	minspectralContrast.push_back(Min(spectralContrast2subset));
+	minspectralContrast.push_back(Min(spectralContrast3subset));
+	minspectralContrast.push_back(Min(spectralContrast4subset));
+	minspectralContrast.push_back(Min(spectralContrast5subset));
+	minspectralContrast.push_back(Min(spectralContrast6subset));
+
+	minspectralValley.push_back(Min(spectralValley1subset));
+	minspectralValley.push_back(Min(spectralValley2subset));
+	minspectralValley.push_back(Min(spectralValley3subset));
+	minspectralValley.push_back(Min(spectralValley4subset));
+	minspectralValley.push_back(Min(spectralValley5subset));
+	minspectralValley.push_back(Min(spectralValley6subset));
+
+
+	obs = ObservationData( Min(rmssubset), Min(peaksubset), Min(crestFactorsubset), Min(zcrsubset), Min(centroidsubset), Min(spreadsubset), Min(skewnesssubset), Min(kurtosissubset), Min(brightnesssubset), Min(rolloff85subset), Min(rolloff95subset), Min(spectralentropysubset), Min(flatnesssubset), Min(spectralcfsubset),  Min(spectralfluxsubset), minmfcc, mindeltamfcc, minspectralContrast, minspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 	obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy());
 	m_PooledObservationDataMin.push_back(obs);
 
@@ -519,9 +701,25 @@
 	avgdeltamfcc.push_back(Average(m_deltamfccs[10]));
 	avgdeltamfcc.push_back(Average(m_deltamfccs[11]));
 
+	avgspectralContrast.clear();
+	avgspectralContrast.push_back(Average(spectralContrast1));
+	avgspectralContrast.push_back(Average(spectralContrast2));
+	avgspectralContrast.push_back(Average(spectralContrast3));
+	avgspectralContrast.push_back(Average(spectralContrast4));
+	avgspectralContrast.push_back(Average(spectralContrast5));
+	avgspectralContrast.push_back(Average(spectralContrast6));
+
+	avgspectralValley.clear();
+	avgspectralValley.push_back(Average(spectralValley1));
+	avgspectralValley.push_back(Average(spectralValley2));
+	avgspectralValley.push_back(Average(spectralValley3));
+	avgspectralValley.push_back(Average(spectralValley4));
+	avgspectralValley.push_back(Average(spectralValley5));
+	avgspectralValley.push_back(Average(spectralValley6));
+
 	//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 = ObservationData(avgrms, avgpeak, avgcrestFactor, avgzcr, avgcentroid, avgspread, avgskewness, avgkurtosis, avgbrightness, avgrolloff85, avgrolloff95, avgspectralentropy, avgflatness, avgspectralcf, avgspectralflux, avgmfcc, avgdeltamfcc, avgspectralContrast, avgspectralValley, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
 		obs.SetLowEnergy(m_ObservationData[0].GetLowEnergy());
 		m_WholeTrackObservationDataAverage.push_back(obs);
 
@@ -540,20 +738,36 @@
 		stdmfcc.push_back(Deviation(mfcc12,avgmfcc[11]));
 
 		stddeltamfcc.clear();
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[0],avgdeltamfcc[0]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[1],avgdeltamfcc[1]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[2],avgdeltamfcc[2]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[3],avgdeltamfcc[3]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[4],avgdeltamfcc[4]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[5],avgdeltamfcc[5]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[6],avgdeltamfcc[6]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[7],avgdeltamfcc[7]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[8],avgdeltamfcc[8]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[9],avgdeltamfcc[9]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[10],avgdeltamfcc[10]));
-		stddeltamfcc.push_back(Deviation(m_deltamfccs[11],avgdeltamfcc[11]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[0], avgdeltamfcc[0]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[1], avgdeltamfcc[1]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[2], avgdeltamfcc[2]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[3], avgdeltamfcc[3]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[4], avgdeltamfcc[4]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[5], avgdeltamfcc[5]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[6], avgdeltamfcc[6]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[7], avgdeltamfcc[7]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[8], avgdeltamfcc[8]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[9], avgdeltamfcc[9]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[10], avgdeltamfcc[10]));
+		stddeltamfcc.push_back(Deviation(m_deltamfccs[11], avgdeltamfcc[11]));
 
-		obs = ObservationData(Deviation(rms, avgrms), Deviation(peak, avgpeak), Deviation(crestFactor, avgcrestFactor), Deviation(zcr, avgzcr), Deviation(centroid, avgcentroid), Deviation(spread, avgspread), Deviation(skewness, avgskewness), Deviation(kurtosis, avgkurtosis), Deviation(brightness, avgbrightness), Deviation(rolloff85, avgrolloff85), Deviation(rolloff95, avgrolloff95), Deviation(spectralentropy, avgspectralentropy), Deviation(flatness, avgflatness), Deviation(spectralcf, avgspectralcf), Deviation(spectralflux, avgspectralflux), stdmfcc, stddeltamfcc, 0, 0);
+		stdspectralContrast.clear();
+		stdspectralContrast.push_back(Deviation(spectralContrast1, avgspectralContrast[0]));
+		stdspectralContrast.push_back(Deviation(spectralContrast2, avgspectralContrast[1]));
+		stdspectralContrast.push_back(Deviation(spectralContrast3, avgspectralContrast[2]));
+		stdspectralContrast.push_back(Deviation(spectralContrast4, avgspectralContrast[3]));
+		stdspectralContrast.push_back(Deviation(spectralContrast5, avgspectralContrast[4]));
+		stdspectralContrast.push_back(Deviation(spectralContrast6, avgspectralContrast[5]));
+
+		stdspectralValley.clear();
+		stdspectralValley.push_back(Deviation(spectralValley1, avgspectralValley[0]));
+		stdspectralValley.push_back(Deviation(spectralValley2, avgspectralValley[1]));
+		stdspectralValley.push_back(Deviation(spectralValley3, avgspectralValley[2]));
+		stdspectralValley.push_back(Deviation(spectralValley4, avgspectralValley[3]));
+		stdspectralValley.push_back(Deviation(spectralValley5, avgspectralValley[4]));
+		stdspectralValley.push_back(Deviation(spectralValley6, avgspectralValley[5]));
+
+		obs = ObservationData(Deviation(rms, avgrms), Deviation(peak, avgpeak), Deviation(crestFactor, avgcrestFactor), Deviation(zcr, avgzcr), Deviation(centroid, avgcentroid), Deviation(spread, avgspread), Deviation(skewness, avgskewness), Deviation(kurtosis, avgkurtosis), Deviation(brightness, avgbrightness), Deviation(rolloff85, avgrolloff85), Deviation(rolloff95, avgrolloff95), Deviation(spectralentropy, avgspectralentropy), Deviation(flatness, avgflatness), Deviation(spectralcf, avgspectralcf), Deviation(spectralflux, avgspectralflux), stdmfcc, stddeltamfcc, stdspectralContrast, stdspectralValley, 0, 0);
 		obs.SetLowEnergy(0);
 		m_WholeTrackObservationDataStd.push_back(obs);
 
@@ -570,6 +784,7 @@
 		maxmfcc.push_back(Max(mfcc10));
 		maxmfcc.push_back(Max(mfcc11));
 		maxmfcc.push_back(Max(mfcc12));
+
 		maxdeltamfcc.clear();
 		maxdeltamfcc.push_back(Max(m_deltamfccs[0]));
 		maxdeltamfcc.push_back(Max(m_deltamfccs[1]));
@@ -584,7 +799,7 @@
 		maxdeltamfcc.push_back(Max(m_deltamfccs[10]));
 		maxdeltamfcc.push_back(Max(m_deltamfccs[11]));
 
-		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, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+		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);
 
@@ -616,7 +831,7 @@
 		mindeltamfcc.push_back(Min(m_deltamfccs[10]));
 		mindeltamfcc.push_back(Min(m_deltamfccs[11]));
 
-		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, m_ObservationData[0].GetPeriodicity(), m_ObservationData[0].GetEntropyOfEnergy());
+		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	Wed Aug 12 22:25:06 2015 +0100
+++ b/Source/ObservationData.h	Fri Aug 14 18:21:43 2015 +0100
@@ -19,7 +19,7 @@
 	ObservationData();
 	~ObservationData();
 
-	ObservationData(float rms, float peak, float crestfactor, float zcr, float centroid, float spread, float skewness, float kurtosis, float brightness, float rolloff85, float rolloff95, float spectralentropy, float flatness, float spectralcf, float spectralflux, std::vector<float> mfccs, float periodicity, float entropyofenergy)
+	ObservationData(float rms, float peak, float crestfactor, float zcr, float centroid, float spread, float skewness, float kurtosis, float brightness, float rolloff85, float rolloff95, float spectralentropy, float flatness, float spectralcf, float spectralflux, std::vector<float> mfccs, std::vector<float> spectralContrast, std::vector<float> spectralValley, float periodicity, float entropyofenergy)
 	{
 		m_peak = peak;
 		m_rms = rms;
@@ -37,11 +37,13 @@
 		m_spectralcf = spectralcf;
 		m_spectralflux = spectralflux;
 		m_mfccs = mfccs;
+		m_spectralContrast = spectralContrast;
+		m_spectralValley = spectralValley;
 		m_periodicity = periodicity;
 		m_entropyofenergy = entropyofenergy;
 	};
 
-	ObservationData(float rms, float peak, float crestfactor, float zcr, float centroid, float spread, float skewness, float kurtosis, float brightness, float rolloff85, float rolloff95, float spectralentropy, float flatness, float spectralcf, float spectralflux, std::vector<float> mfccs, std::vector<float> dmfccs, float periodicity, float entropyofenergy)
+	ObservationData(float rms, float peak, float crestfactor, float zcr, float centroid, float spread, float skewness, float kurtosis, float brightness, float rolloff85, float rolloff95, float spectralentropy, float flatness, float spectralcf, float spectralflux, std::vector<float> mfccs, std::vector<float> dmfccs, std::vector<float> spectralContrast, std::vector<float> spectralValley, float periodicity, float entropyofenergy)
 	{
 		m_peak = peak;
 		m_rms = rms;
@@ -58,6 +60,8 @@
 		m_flatness = flatness;
 		m_spectralcf = spectralcf;
 		m_spectralflux = spectralflux;
+		m_spectralContrast = spectralContrast;
+		m_spectralValley = spectralValley;
 		m_mfccs = mfccs;
 		m_dmfccs = dmfccs;
 		m_periodicity = periodicity;
@@ -84,6 +88,8 @@
 	float GetLowEnergy(){return m_lowEnergy;}
 	std::vector<float> GetMFCCs(){return m_mfccs;}
 	std::vector<float> GetDeltaMFCCs(){return m_dmfccs;}
+	std::vector<float> GetSpectralContrast(){ return m_spectralContrast; }
+	std::vector<float> GetSpectralValley(){ return m_spectralValley; }
 	
 	//WholeTrack Feature
 	void SetLowEnergy(float lowEnergy){m_lowEnergy = lowEnergy;}
@@ -106,6 +112,8 @@
 	float m_spectralflux;
 	std::vector<float> m_mfccs;
 	std::vector<float> m_dmfccs;
+	std::vector<float> m_spectralContrast;
+	std::vector<float> m_spectralValley;
 	float m_periodicity;
 	float m_lowEnergy;
 	float m_entropyofenergy;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/SpectralContrast.cpp	Fri Aug 14 18:21:43 2015 +0100
@@ -0,0 +1,110 @@
+/*
+  ==============================================================================
+
+    SpectralContrast.cpp
+    Created: 14 Aug 2015 12:21:29pm
+    Author:  David
+
+  ==============================================================================
+*/
+
+#include "SpectralContrast.h"
+#include <algorithm>
+
+void SpectralContrast::initSpectralContrastVariables(int frameSize, float sampleRate)
+{
+
+	int numberBands = 6; //the number of bands in the filter
+	float lowFrequencyBound = 20; //the lower bound of the lowest band
+	float highFrequencyBound = sampleRate / 2.0f;
+	float staticDistribution = 0.15f; //the ratio of the bins to distribute equally [0, 1]
+	m_neighbourRatio = 0.4f; //the ratio of the bins in the sub band used to calculate the peak and valley", "(0,1]"
+
+	// get staticDistribution
+	float partToScale = 1.0f - staticDistribution;
+
+	float binWidth = sampleRate / frameSize;
+
+	int lastBins = 0;
+	m_startAtBin = 0;
+
+	m_numberOfBinsInBands.clear();
+	m_numberOfBinsInBands.resize(numberBands);
+	lastBins = int(lowFrequencyBound / binWidth);
+	m_startAtBin = lastBins;
+
+	// Determine how many bins are in each band to start with.
+	// The rest of the bands will be distributed logarithmically.
+	int  totalNumberOfBins = int(highFrequencyBound / binWidth);
+	highFrequencyBound = int(partToScale * totalNumberOfBins) * binWidth;
+	int  staticBinsPerBand = int((1 - partToScale) * totalNumberOfBins) / numberBands;
+	float ratio = highFrequencyBound / lowFrequencyBound;
+	float ratioPerBand = pow(ratio, float(1.0 / numberBands));
+	float currFreq = lowFrequencyBound;
+
+	for (int i = 0; i < numberBands; ++i) 
+	{
+		currFreq = currFreq * ratioPerBand;
+		m_numberOfBinsInBands[i] = int(currFreq / binWidth - lastBins + staticBinsPerBand);
+		lastBins = int(currFreq / binWidth);
+	}
+
+}
+
+void SpectralContrast::computeSpectralContrast(std::vector<float> spectrum, std::vector<float>& spectralContrast, std::vector<float>& valleys)
+{
+	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();
+
+	spectralContrast.clear();
+	valleys.clear();
+
+	int specIdx = m_startAtBin;
+
+	for (int bandIdx = 0; bandIdx < int(m_numberOfBinsInBands.size()) && specIdx < int(spectrumCopy.size()); ++bandIdx) 
+	{
+		// get the mean of the band
+		float bandMean = 0;
+		for (int i = 0; i < m_numberOfBinsInBands[bandIdx] && specIdx + i < int(spectrumCopy.size()); ++i)
+		{
+			bandMean += spectrumCopy[specIdx + i];
+		}
+
+		if (m_numberOfBinsInBands[bandIdx] != 0) bandMean /= m_numberOfBinsInBands[bandIdx];
+		{
+			bandMean += minReal;
+		}
+
+		// 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;
+
+		// valley (FLT_MIN prevents log(0))
+		float sum = 0;
+		for (int i = 0; i < neighbourBins && specIdx + i < int(spectrum.size()); ++i) 
+		{
+			sum += spectrum[specIdx + i];
+		}
+
+		float valley = sum / neighbourBins + minReal;
+
+		// peak
+		sum = 0;
+		for (int i = m_numberOfBinsInBands[bandIdx]; i > m_numberOfBinsInBands[bandIdx] - neighbourBins && specIdx + i - 1 < int(spectrum.size()) && i > 0; --i)
+		{
+			sum += spectrum[specIdx + i - 1];
+		}
+
+		float peak = sum / neighbourBins + minReal;
+
+		spectralContrast.push_back(-1.0f * (pow(peak / valley, float(1.0f / log(bandMean)))));
+		valleys.push_back(log(valley));
+
+		specIdx += m_numberOfBinsInBands[bandIdx];
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/SpectralContrast.h	Fri Aug 14 18:21:43 2015 +0100
@@ -0,0 +1,29 @@
+/*
+  ==============================================================================
+
+    SpectralContrast.h
+    Created: 14 Aug 2015 12:21:29pm
+    Author:  David
+
+  ==============================================================================
+*/
+
+#ifndef SPECTRALCONTRAST_H_INCLUDED
+#define SPECTRALCONTRAST_H_INCLUDED
+
+#include <vector>
+
+class SpectralContrast
+{
+public:
+	void initSpectralContrastVariables(int frameSize, float sampleRate);
+	void computeSpectralContrast(std::vector<float> spectrum, std::vector<float> &spectralContrast, std::vector<float> &valleys);
+private:
+	std::vector<int> m_numberOfBinsInBands;
+	int m_startAtBin;
+	float m_neighbourRatio;
+};
+
+
+
+#endif  // SPECTRALCONTRAST_H_INCLUDED
--- a/Source/WriteCSV.cpp	Wed Aug 12 22:25:06 2015 +0100
+++ b/Source/WriteCSV.cpp	Fri Aug 14 18:21:43 2015 +0100
@@ -196,6 +196,54 @@
 				<< observationDataStd[j].GetDeltaMFCCs()[11] << ','
 				<< observationDataMax[j].GetDeltaMFCCs()[11] << ','
 				<< observationDataMin[j].GetDeltaMFCCs()[11] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[0] << ','
+				<< observationDataStd[j].GetSpectralContrast()[0] << ','
+				<< observationDataMax[j].GetSpectralContrast()[0] << ','
+				<< observationDataMin[j].GetSpectralContrast()[0] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[1] << ','
+				<< observationDataStd[j].GetSpectralContrast()[1] << ','
+				<< observationDataMax[j].GetSpectralContrast()[1] << ','
+				<< observationDataMin[j].GetSpectralContrast()[1] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[2] << ','
+				<< observationDataStd[j].GetSpectralContrast()[2] << ','
+				<< observationDataMax[j].GetSpectralContrast()[2] << ','
+				<< observationDataMin[j].GetSpectralContrast()[2] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[3] << ','
+				<< observationDataStd[j].GetSpectralContrast()[3] << ','
+				<< observationDataMax[j].GetSpectralContrast()[3] << ','
+				<< observationDataMin[j].GetSpectralContrast()[3] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[4] << ','
+				<< observationDataStd[j].GetSpectralContrast()[4] << ','
+				<< observationDataMax[j].GetSpectralContrast()[4] << ','
+				<< observationDataMin[j].GetSpectralContrast()[4] << ','
+				<< observationDataAverage[j].GetSpectralContrast()[5] << ','
+				<< observationDataStd[j].GetSpectralContrast()[5] << ','
+				<< observationDataMax[j].GetSpectralContrast()[5] << ','
+				<< observationDataMin[j].GetSpectralContrast()[5] << ','
+				<< observationDataAverage[j].GetSpectralValley()[0] << ','
+				<< observationDataStd[j].GetSpectralValley()[0] << ','
+				<< observationDataMax[j].GetSpectralValley()[0] << ','
+				<< observationDataMin[j].GetSpectralValley()[0] << ','
+				<< observationDataAverage[j].GetSpectralValley()[1] << ','
+				<< observationDataStd[j].GetSpectralValley()[1] << ','
+				<< observationDataMax[j].GetSpectralValley()[1] << ','
+				<< observationDataMin[j].GetSpectralValley()[1] << ','
+				<< observationDataAverage[j].GetSpectralValley()[2] << ','
+				<< observationDataStd[j].GetSpectralValley()[2] << ','
+				<< observationDataMax[j].GetSpectralValley()[2] << ','
+				<< observationDataMin[j].GetSpectralValley()[2] << ','
+				<< observationDataAverage[j].GetSpectralValley()[3] << ','
+				<< observationDataStd[j].GetSpectralValley()[3] << ','
+				<< observationDataMax[j].GetSpectralValley()[3] << ','
+				<< observationDataMin[j].GetSpectralValley()[3] << ','
+				<< observationDataAverage[j].GetSpectralValley()[4] << ','
+				<< observationDataStd[j].GetSpectralValley()[4] << ','
+				<< observationDataMax[j].GetSpectralValley()[4] << ','
+				<< observationDataMin[j].GetSpectralValley()[4] << ','
+				<< observationDataAverage[j].GetSpectralValley()[5] << ','
+				<< observationDataStd[j].GetSpectralValley()[5] << ','
+				<< observationDataMax[j].GetSpectralValley()[5] << ','
+				<< observationDataMin[j].GetSpectralValley()[5] << ','
 				<< observationDataAverage[j].GetLowEnergy() << ','
 				<< observationDataAverage[j].GetPeriodicity() << ','
 				<< observationDataAverage[j].GetEntropyOfEnergy() << ','
@@ -381,6 +429,54 @@
 				<< wholeTrackobservationDataStd[j].GetDeltaMFCCs()[11] << ',' //90
 				<< wholeTrackobservationDataMax[j].GetDeltaMFCCs()[11] << ',' //91
 				<< wholeTrackobservationDataMin[j].GetDeltaMFCCs()[11] << ',' //92
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[0] << ','//61
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[0] << ',' //62
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[0] << ',' //47
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[0] << ',' //48
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[1] << ',' //49
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[1] << ',' //50
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[1] << ',' //51
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[1] << ',' //52
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[2] << ',' //53
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[2] << ',' //54
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[2] << ',' //55
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[2] << ',' //56
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[3] << ',' //57
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[3] << ',' //58
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[3] << ',' //59
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[3] << ',' //60
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[4] << ',' //61
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[4] << ',' //62
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[4] << ',' //63
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[4] << ',' //64
+				<< wholeTrackobservationDataAverage[j].GetSpectralContrast()[5] << ',' //65
+				<< wholeTrackobservationDataStd[j].GetSpectralContrast()[5] << ',' //66
+				<< wholeTrackobservationDataMax[j].GetSpectralContrast()[5] << ',' //67
+				<< wholeTrackobservationDataMin[j].GetSpectralContrast()[5] << ',' //68
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[0] << ','//61
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[0] << ',' //62
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[0] << ',' //47
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[0] << ',' //48
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[1] << ',' //49
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[1] << ',' //50
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[1] << ',' //51
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[1] << ',' //52
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[2] << ',' //53
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[2] << ',' //54
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[2] << ',' //55
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[2] << ',' //56
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[3] << ',' //57
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[3] << ',' //58
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[3] << ',' //59
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[3] << ',' //60
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[4] << ',' //61
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[4] << ',' //62
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[4] << ',' //63
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[4] << ',' //64
+				<< wholeTrackobservationDataAverage[j].GetSpectralValley()[5] << ',' //65
+				<< wholeTrackobservationDataStd[j].GetSpectralValley()[5] << ',' //66
+				<< wholeTrackobservationDataMax[j].GetSpectralValley()[5] << ',' //67
+				<< wholeTrackobservationDataMin[j].GetSpectralValley()[5] << ',' //68
 				<< wholeTrackobservationDataAverage[j].GetLowEnergy() << ',' //93
 				<< wholeTrackobservationDataAverage[j].GetPeriodicity() << ',' //94
 				<< wholeTrackobservationDataAverage[j].GetEntropyOfEnergy() << ',' //95