Mercurial > hg > match-vamp
diff test/TestFeatureExtractor.cpp @ 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 |
line wrap: on
line diff
--- 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()); } }