changeset 129:dad9fdc32a6a refactors

Generalise chroma test at least to other frame/samplerate etc
author Chris Cannam
date Thu, 11 Dec 2014 12:54:46 +0000
parents 3f32a88ee15a
children 8e240bbea845
files test/TestFeatureExtractor test/TestFeatureExtractor.cpp
diffstat 2 files changed, 67 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
Binary file test/TestFeatureExtractor has changed
--- a/test/TestFeatureExtractor.cpp	Thu Dec 11 12:13:26 2014 +0000
+++ b/test/TestFeatureExtractor.cpp	Thu Dec 11 12:54:46 2014 +0000
@@ -37,72 +37,85 @@
 
 BOOST_AUTO_TEST_CASE(chroma)
 {
-    int rate = 44100;
-    int sz = 2048;
-    int hs = sz / 2 + 1;
-    int fsz = 13;
+    int szs[] = { 1024, 2048, 4000 };
+    int rates[] = { 44100, 48000 };
     
-    FeatureExtractor::Parameters params(rate, sz);
-    params.useChromaFrequencyMap = true;
-    FeatureExtractor fe(params);
-    BOOST_CHECK_EQUAL(fe.getFeatureSize(), fsz);
+    for (int irate = 0; irate < int(sizeof(rates)/sizeof(rates[0])); ++irate) {
 
-    for (int bin = 0; bin < hs; ++bin) {
+	int rate = rates[irate];
 
-	vector<double> real, imag;
-	real.resize(hs, 0.0);
-	imag.resize(hs, 0.0);
+	for (int isz = 0; isz < int(sizeof(szs)/sizeof(szs[0])); ++isz) {
+	    
+	    int sz = szs[isz];
+
+	    int hs = sz / 2 + 1;
+	    int fsz = 13;
+    
+	    FeatureExtractor::Parameters params(rate, sz);
+	    params.useChromaFrequencyMap = true;
+	    FeatureExtractor fe(params);
+	    BOOST_CHECK_EQUAL(fe.getFeatureSize(), fsz);
+
+	    for (int bin = 0; bin < hs; ++bin) {
+
+		vector<double> real, imag;
+		real.resize(hs, 0.0);
+		imag.resize(hs, 0.0);
 	
-	real[bin] += 10.0;
-	imag[bin] += 10.0;
+		real[bin] += 10.0;
+		imag[bin] += 10.0;
 
-	// use two input sweeps, so we can test that they are properly
-	// summed into the output bin
-	real[hs-bin-1] += 5.0;
-	imag[hs-bin-1] += 5.0;
+		// use two input sweeps, so we can test that they are
+		// properly summed into the output bin
+		real[hs-bin-1] += 5.0;
+		imag[hs-bin-1] += 5.0;
+	
+		vector<double> out = fe.process(real, imag);
 
-	vector<double> out = fe.process(real, imag);
+		// We expect to find all bins are 0 except for:
+		// 
+		// * two bins of 200 and 50 respectively, if the two input
+		// bins are distinct and their output chroma are also distinct
+		//
+		// * one bin of value 250 (= 10^2 + 5^2), if the two input
+		// bins are distinct but their output chroma are not
+		//
+		// * one bin of value 450 (= 15^2 + 15^2), if the input bins
+		// are not distinct (the feature extractor sums energies
+		// rather than magnitudes so as to integrate energy for a
+		// partial in the face of spectral leakage)
+		// 
+		// The bin corresponding to each input frequency is
+		// that of its semitone value (with C=0), except that
+		// input bins less than the 17th are shepherded into
+		// the separate bin 0 (see docs in FeatureExtractor.h)
 
-	// We expect to find all bins are 0 except for:
-	// 
-	// * two bins of 200 and 50 respectively, if the two input
-	// bins are distinct and their output chroma are also distinct
-	//
-	// * one bin of value 250 (= 10^2 + 5^2), if the two input
-	// bins are distinct but their output chroma are not
-	//
-	// * one bin of value 450 (= 15^2 + 15^2), if the input bins
-	// are not distinct (the feature extractor sums energies
-	// rather than magnitudes so as to integrate energy for a
-	// partial in the face of spectral leakage)
-	// 
-	// The bin corresponding to each input frequency is that of
-	// its semitone value (with C=0), except that input bin
-	// frequencies less than 362Hz are shepherded into the
-	// separate bin 0 (see docs in FeatureExtractor.h)
+		double cutoff = (17.0 * rate) / sz;
+		
+		vector<double> expected(fsz);
 
-	vector<double> expected(fsz);
+		double infreq1 = (double(bin) * rate) / sz;
 
-	double infreq1 = (double(bin) * rate) / sz;
+		if (bin == hs-bin-1) {
+		    expected[freq2chroma(infreq1) + 1] += 450;
+		} else {
+		    if (infreq1 < cutoff) {
+			expected[0] += 200;
+		    } else {
+			expected[freq2chroma(infreq1) + 1] += 200;
+		    }
+		    double infreq2 = (double(hs-bin-1) * rate) / sz;
+		    if (infreq2 < cutoff) {
+			expected[0] += 50;
+		    } else {
+			expected[freq2chroma(infreq2) + 1] += 50;
+		    }
+		}
 
-	if (bin == hs-bin-1) {
-	    expected[freq2chroma(infreq1) + 1] += 450;
-	} else {
-	    if (infreq1 < 362) {
-		expected[0] += 200;
-	    } else {
-		expected[freq2chroma(infreq1) + 1] += 200;
-	    }
-	    double infreq2 = (double(hs-bin-1) * rate) / sz;
-	    if (infreq2 < 362) {
-		expected[0] += 50;
-	    } else {
-		expected[freq2chroma(infreq2) + 1] += 50;
+		BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(),
+					      expected.begin(), expected.end());
 	    }
 	}
-
-	BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(),
-				      expected.begin(), expected.end());
     }
 }