diff options
Diffstat (limited to 'tests/xttest_scalar.cpp')
-rw-r--r-- | tests/xttest_scalar.cpp | 215 |
1 files changed, 122 insertions, 93 deletions
diff --git a/tests/xttest_scalar.cpp b/tests/xttest_scalar.cpp index 09f1665..29549b4 100644 --- a/tests/xttest_scalar.cpp +++ b/tests/xttest_scalar.cpp @@ -11,7 +11,7 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) { uint16_t expected = 0; uint16_t actual = 0; - + GIVEN( "a 512 sample block with a sample rate of 44100" ) { uint32_t blocksize = 512; @@ -19,39 +19,40 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) double result = -1.0; double amplitude = 1.0; double table[blocksize]; - + WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 1 cycles in the block { double frequency = 86.1328125; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" ) { REQUIRE(rv == XTRACT_NO_RESULT); REQUIRE(result == 0.0); } } - + WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 2 cycles in the block { double frequency = 172.265625; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" ) { REQUIRE(rv == XTRACT_NO_RESULT); REQUIRE(result == 0.0); } } - + + WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 4 cycles in the block { double frequency = 344.53125; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); @@ -63,15 +64,15 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( expected ); REQUIRE(actual == expected); } - - + + WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case { double amplitude = 0.01; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -83,22 +84,22 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) } } } - + GIVEN( "a 1024 sample block with a sample rate of 44100" ) { uint32_t blocksize = 1024; double samplerate = 44100; double result = -1.0; + double amplitude = 1.0; double table[blocksize]; WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 2 cycles in the block { double frequency = 86.1328125; - double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" ) { REQUIRE(rv == XTRACT_NO_RESULT); @@ -106,10 +107,44 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) } } + WHEN( "the frequency is 140 Hz" ) // period of 315 samples: 3.25 cycles in the block + { + double frequency = 140; + + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); + xtract_f0(table, blocksize, &samplerate, &result); + + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) + { + actual = xttest_ftom(result); + expected = xttest_ftom(frequency); + CAPTURE( actual ); + CAPTURE( expected ); + REQUIRE(actual == expected); + } + } + + WHEN( "the frequency is 155 Hz" ) // period of 284.52 samples: 3.6 cycles in the block + { + double frequency = 155; + + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); + xtract_f0(table, blocksize, &samplerate, &result); + + THEN( "the detected F0 is quantized to the nearest whole number of samples" ) + { + actual = xttest_ftom(result); + expected = xttest_ftom(155.28169014); // period of 284 samples + CAPTURE( result ); + CAPTURE( expected ); + REQUIRE(actual == expected); + } + } + + WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 4 cycles in the block { double frequency = 172.265625; - double amplitude = 1.0; xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); @@ -127,13 +162,12 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 8 cycles in the block { double frequency = 344.53125; + double noise[blocksize]; expected = xttest_ftom(frequency); CAPTURE( expected ); WHEN( "the amplitude is 1.0" ) { - double amplitude = 1.0; - xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); @@ -144,10 +178,10 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case { - double amplitude = 0.01; + amplitude = 0.01; xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); @@ -159,17 +193,16 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "white noise is added at 10%" ) // Only test noise for one case { - double amplitude = 0.1; - double noise[blocksize]; - + amplitude = 0.1; + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -177,17 +210,16 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "white noise is added at 20%" ) { - double amplitude = 0.2; - double noise[blocksize]; - + amplitude = 0.2; + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -195,17 +227,16 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "white noise is added at 25%" ) { - double amplitude = 0.25; - double noise[blocksize]; - + amplitude = 0.25; + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest semitone" ) { actual = xttest_ftom(result); @@ -216,17 +247,16 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE( actual < max ); } } - + WHEN( "white noise is added at 30%" ) { - double amplitude = 0.25; - double noise[blocksize]; - + amplitude = 0.25; + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest quarter-tone" ) { actual = xttest_ftom(result); @@ -237,17 +267,16 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE( actual < max ); } } - + WHEN( "white noise is added at 35%" ) { - double amplitude = 0.35; - double noise[blocksize]; - + amplitude = 0.35; + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is inaccurate by more than one semitone" ) { actual = xttest_ftom(result); @@ -258,22 +287,22 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) } } } - + GIVEN( "a 1024 sample block with a sample rate of 11025" ) { uint32_t blocksize = 1024; double samplerate = 11025; double result = -1.0; double table[blocksize]; - + WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 2 cycles in the block { double frequency = 86.1328125; double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -281,17 +310,17 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( actual ); CAPTURE( expected ); REQUIRE(actual == expected); - } + } } - + WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 4 cycles in the block { double frequency = 172.265625; double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -301,20 +330,20 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 8 cycles in the block { double frequency = 344.53125; expected = xttest_ftom(frequency); CAPTURE( expected ); - + WHEN( "the amplitude is 1.0" ) { double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -322,14 +351,14 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case { double amplitude = 0.01; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -337,17 +366,17 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "white noise is added at 20%" ) { double amplitude = 0.2; double noise[blocksize]; - + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest quarter-tone" ) { actual = xttest_ftom(result); @@ -356,19 +385,19 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( actual ); REQUIRE( actual > min ); REQUIRE( actual < max ); - } + } } - + WHEN( "white noise is added at 40%" ) { double amplitude = 0.4; double noise[blocksize]; - + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest semi-tone" ) { actual = xttest_ftom(result); @@ -377,19 +406,19 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( actual ); REQUIRE( actual > min ); REQUIRE( actual < max ); - } + } } - + WHEN( "white noise is added at 60%" ) { double amplitude = 0.6; double noise[blocksize]; - + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest semi-tone" ) { actual = xttest_ftom(result); @@ -398,20 +427,20 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( actual ); REQUIRE( actual > min ); REQUIRE( actual < max ); - } + } } - + WHEN( "white noise is added at 80%" ) { double amplitude = 0.8; double noise[blocksize]; - + xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude); xttest_gen_noise(noise, blocksize, amplitude); xttest_add(table, noise, blocksize); xtract_f0(table, blocksize, &samplerate, &result); - - THEN( "the detected F0 is inaccurate by more than one semitone" ) + + THEN( "the detected F0 is inaccurate by more than one semitone" ) { actual = xttest_ftom(result); uint16_t difference = abs(expected - actual); @@ -421,37 +450,37 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) } } } - + GIVEN( "a 2048 sample block with a sample rate of 44100" ) { uint32_t blocksize = 2048; double samplerate = 44100; double result = -1.0; double table[blocksize]; - + WHEN( "the frequency is 43.06640625 Hz" ) // period of exactly 256 samples: 2 cycles in the block { double frequency = 43.06640625; double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" ) { REQUIRE(rv == XTRACT_NO_RESULT); REQUIRE(result == 0.0); } } - + WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 4 cycles in the block { double frequency = 86.1328125; double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); int rv = xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -461,15 +490,15 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 8 cycles in the block { double frequency = 172.265625; double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -479,18 +508,18 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) REQUIRE(actual == expected); } } - + WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 16 cycles in the block { double frequency = 344.53125; - + WHEN( "the amplitude is 1.0" ) { double amplitude = 1.0; - + xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude); xtract_f0(table, blocksize, &samplerate, &result); - + THEN( "the detected F0 is accurate to the nearest MIDI cent" ) { actual = xttest_ftom(result); @@ -499,7 +528,7 @@ SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" ) CAPTURE( expected ); REQUIRE(actual == expected); } - } + } } } } |