jamie@264: jamie@264: #include "xttest_util.hpp" jamie@264: jamie@264: #include "xtract/xtract_scalar.h" jamie@264: jamie@264: #include "catch.hpp" jamie@264: jamie@264: jamie@264: SCENARIO( "F0 is correctly detected for a clean sine wave", "[xtract_f0]" ) jamie@264: { jamie@264: GIVEN( "a 1024 sample block with a sample rate of 44100" ) jamie@264: { jamie@264: uint32_t blocksize = 1024; jamie@264: double samplerate = 44100; jamie@264: double result = 0.0; jamie@264: double table[blocksize]; jamie@264: jamie@264: WHEN( "the frequency is 344.53125 Hz" ) // This will give a period of exactly 128 samples: 8 cycles in the block jamie@264: { jamie@264: double frequency = 344.53125; jamie@264: double min = frequency * 0.995; jamie@264: double max = frequency * 1.005; jamie@264: jamie@264: WHEN( "the amplitude is 1.0" ) jamie@264: { jamie@264: double amplitude = 1.0; jamie@264: jamie@264: xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); jamie@264: xtract_f0(table, blocksize, &samplerate, &result); jamie@264: CAPTURE( result ); jamie@264: jamie@264: THEN( "the detected F0 is in the range 344.53125 ± 0.5%" ) jamie@264: { jamie@264: REQUIRE(result < max); jamie@264: REQUIRE(result > min); jamie@264: } jamie@264: } jamie@264: WHEN( "the amplitude is 0.1" ) jamie@264: { jamie@264: double amplitude = 0.1; jamie@264: jamie@264: xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); jamie@264: xtract_f0(table, blocksize, &samplerate, &result); jamie@264: CAPTURE( result ); jamie@264: jamie@264: THEN( "the detected F0 is in the range 344.53125 ± 0.5%" ) jamie@264: { jamie@264: REQUIRE(result < max); jamie@264: REQUIRE(result > min); jamie@264: } jamie@264: } jamie@264: } jamie@264: } jamie@264: }