adamstark@112: #include "doctest.h" adamstark@112: #include adamstark@112: adamstark@112: //====================================================================== adamstark@112: //==================== CHECKING INITIALISATION ========================= adamstark@112: //====================================================================== adamstark@112: TEST_SUITE ("checkingInitialisation") adamstark@112: { adamstark@112: //====================================================================== adamstark@112: TEST_CASE ("constructorWithNoArguments") adamstark@112: { adamstark@112: BTrack b; adamstark@112: adamstark@112: CHECK_EQ (b.getHopSize(), 512); adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: TEST_CASE("constructorWithHopSize") adamstark@112: { adamstark@112: BTrack b(1024); adamstark@112: adamstark@112: CHECK_EQ (b.getHopSize(), 1024); adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: TEST_CASE("constructorWithHopSizeAndFrameSize") adamstark@112: { adamstark@112: BTrack b(256,512); adamstark@112: adamstark@112: CHECK_EQ (b.getHopSize(), 256); adamstark@112: } adamstark@112: adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: //=================== PROCESSING SIMPLE VALUES ========================= adamstark@112: //====================================================================== adamstark@112: adamstark@112: TEST_SUITE("processingSimpleValues") adamstark@112: { adamstark@112: //====================================================================== adamstark@112: TEST_CASE ("processZeroValuedOnsetDetectionFunctionSamples") adamstark@112: { adamstark@112: BTrack b(512); adamstark@112: adamstark@112: long numSamples = 20000; adamstark@112: adamstark@112: std::vector odfSamples; adamstark@112: adamstark@112: int maxInterval = 0; adamstark@112: int currentInterval = 0; adamstark@112: int numBeats = 0; adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: b.processOnsetDetectionFunctionSample(0.0); adamstark@112: adamstark@112: currentInterval++; adamstark@112: adamstark@112: if (b.beatDueInCurrentFrame()) adamstark@112: { adamstark@112: numBeats++; adamstark@112: adamstark@112: if (currentInterval > maxInterval) adamstark@112: { adamstark@112: maxInterval = currentInterval; adamstark@112: } adamstark@112: adamstark@112: currentInterval = 0; adamstark@112: } adamstark@112: } adamstark@112: adamstark@112: // check that the maximum interval between beats does not adamstark@112: // exceed 100 onset detection function samples (~ 1.3 seconds) adamstark@112: CHECK (maxInterval < 100); adamstark@112: adamstark@112: // check that we have at least a beat for every 100 samples adamstark@112: CHECK (numBeats > (numSamples/100)); adamstark@112: adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: TEST_CASE ("processRandomOnsetDetectionFunctionSamples") adamstark@112: { adamstark@112: BTrack b(512); adamstark@112: adamstark@112: long numSamples = 20000; adamstark@112: adamstark@112: std::vector odfSamples; adamstark@112: adamstark@112: int maxInterval = 0; adamstark@112: int currentInterval = 0; adamstark@112: int numBeats = 0; adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: odfSamples.push_back(random() % 1000); adamstark@112: } adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: b.processOnsetDetectionFunctionSample(odfSamples[i]); adamstark@112: adamstark@112: currentInterval++; adamstark@112: adamstark@112: if (b.beatDueInCurrentFrame()) adamstark@112: { adamstark@112: numBeats++; adamstark@112: adamstark@112: if (currentInterval > maxInterval) adamstark@112: { adamstark@112: maxInterval = currentInterval; adamstark@112: } adamstark@112: adamstark@112: currentInterval = 0; adamstark@112: } adamstark@112: } adamstark@112: adamstark@112: // check that the maximum interval between beats does not adamstark@112: // exceed 100 onset detection function samples (~ 1.3 seconds) adamstark@112: CHECK(maxInterval < 100); adamstark@112: adamstark@112: // check that we have at least a beat for every 100 samples adamstark@112: CHECK(numBeats > (numSamples/100)); adamstark@112: adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: TEST_CASE ("processNegativeOnsetDetectionFunctionSamples") adamstark@112: { adamstark@112: BTrack b(512); adamstark@112: adamstark@112: long numSamples = 20000; adamstark@112: adamstark@112: std::vector odfSamples; adamstark@112: adamstark@112: int maxInterval = 0; adamstark@112: int currentInterval = 0; adamstark@112: int numBeats = 0; adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: odfSamples.push_back(-1.0*(random() % 1000)); adamstark@112: } adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: b.processOnsetDetectionFunctionSample(odfSamples[i]); adamstark@112: adamstark@112: currentInterval++; adamstark@112: adamstark@112: if (b.beatDueInCurrentFrame()) adamstark@112: { adamstark@112: numBeats++; adamstark@112: adamstark@112: if (currentInterval > maxInterval) adamstark@112: { adamstark@112: maxInterval = currentInterval; adamstark@112: } adamstark@112: adamstark@112: currentInterval = 0; adamstark@112: } adamstark@112: } adamstark@112: adamstark@112: // check that the maximum interval between beats does not adamstark@112: // exceed 100 onset detection function samples (~ 1.3 seconds) adamstark@112: CHECK (maxInterval < 100); adamstark@112: adamstark@112: // check that we have at least a beat for every 100 samples adamstark@112: CHECK (numBeats > (numSamples/100)); adamstark@112: adamstark@112: } adamstark@112: adamstark@112: //====================================================================== adamstark@112: TEST_CASE ("processSeriesOfDeltaFunctions") adamstark@112: { adamstark@112: BTrack b(512); adamstark@112: adamstark@112: long numSamples = 20000; adamstark@112: int beatPeriod = 43; adamstark@112: adamstark@112: std::vector odfSamples; adamstark@112: adamstark@112: int maxInterval = 0; adamstark@112: int currentInterval = 0; adamstark@112: int numBeats = 0; adamstark@112: int correct = 0; adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: if (i % beatPeriod == 0) adamstark@112: { adamstark@112: odfSamples.push_back(1000); adamstark@112: } adamstark@112: else adamstark@112: { adamstark@112: odfSamples.push_back(0.0); adamstark@112: } adamstark@112: } adamstark@112: adamstark@112: for (int i = 0;i < numSamples;i++) adamstark@112: { adamstark@112: b.processOnsetDetectionFunctionSample(odfSamples[i]); adamstark@112: adamstark@112: currentInterval++; adamstark@112: adamstark@112: if (b.beatDueInCurrentFrame()) adamstark@112: { adamstark@112: numBeats++; adamstark@112: adamstark@112: if (currentInterval > maxInterval) adamstark@112: { adamstark@112: maxInterval = currentInterval; adamstark@112: } adamstark@112: adamstark@112: if (currentInterval == beatPeriod) adamstark@112: { adamstark@112: correct++; adamstark@112: } adamstark@112: adamstark@112: currentInterval = 0; adamstark@112: } adamstark@112: } adamstark@112: adamstark@112: // check that the maximum interval between beats does not adamstark@112: // exceed 100 onset detection function samples (~ 1.3 seconds) adamstark@112: CHECK (maxInterval < 100); adamstark@112: adamstark@112: // check that we have at least a beat for every 100 samples adamstark@112: CHECK (numBeats > (numSamples/100)); adamstark@112: adamstark@112: // check that the number of correct beats is larger than 99% adamstark@112: // of the total number of beats adamstark@112: CHECK (((double)correct) > (((double)numBeats)*0.99)); adamstark@112: } adamstark@112: }