# HG changeset patch # User Chris Cannam # Date 1418299126 0 # Node ID 2ed42b7616c5747a463a1b6d9471577ecce08b15 # Parent 0ed1adb2d522f28a08c96e6dfabbfa987f8cd225 Non-chroma test diff -r 0ed1adb2d522 -r 2ed42b7616c5 test/TestFeatureExtractor Binary file test/TestFeatureExtractor has changed diff -r 0ed1adb2d522 -r 2ed42b7616c5 test/TestFeatureExtractor.cpp --- a/test/TestFeatureExtractor.cpp Thu Dec 11 11:41:25 2014 +0000 +++ b/test/TestFeatureExtractor.cpp Thu Dec 11 11:58:46 2014 +0000 @@ -22,6 +22,17 @@ return freq2mid(freq) % 12; } +static int bin2warped(int bin, int rate, int sz) +{ + // see comments in nonchroma below + if (bin <= 33) return bin; + double freq = (double(bin) * rate) / sz; + int mid = freq2mid(freq); + if (mid > 127) mid = 127; + int outbin = mid - 77 + 33; + return outbin; +} + BOOST_AUTO_TEST_SUITE(TestFeatureExtractor) BOOST_AUTO_TEST_CASE(chroma) @@ -93,4 +104,67 @@ } } +BOOST_AUTO_TEST_CASE(nonchroma) +{ + int rate = 44100; + int sz = 2048; + int hs = sz / 2 + 1; + int fsz = 84; + + FeatureExtractor::Parameters params(rate, sz); + FeatureExtractor fe(params); + BOOST_CHECK_EQUAL(fe.getFeatureSize(), fsz); + + for (int bin = 0; bin < hs; ++bin) { + + vector real, imag; + real.resize(hs, 0.0); + imag.resize(hs, 0.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; + + vector 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 bins are also distinct + // + // * one bin of value 250 (= 10^2 + 5^2), if the two input + // bins are distinct but their output bins are not + // + // * one bin of value 450 (= 15^2 + 15^2), if the input bins + // are not distinct + // + // The first 34 input bins (i.e. up to and including bin 33, + // 733Hz, MIDI pitch 77.something) are mapped linearly, those + // above that and up to MIDI pitch 127 (12544Hz) are mapped + // logarithmically, remaining bins are all mapped into the + // final output bin. + // + // So MIDI pitches up to and including 77 are mapped linearly + // by frequency into 34 bins; those from 78-126 inclusive are + // mapped linearly by MIDI pitch into the next 49 bins; + // everything above goes into the last bin, for 84 bins total. + + vector expected(fsz); + + if (bin == hs-bin-1) { + expected[bin2warped(bin, rate, sz)] += 450; + } else { + expected[bin2warped(bin, rate, sz)] += 200; + expected[bin2warped(hs-bin-1, rate, sz)] += 50; + } + + BOOST_CHECK_EQUAL_COLLECTIONS(out.begin(), out.end(), + expected.begin(), expected.end()); + } +} + BOOST_AUTO_TEST_SUITE_END()