jamie@264
|
1
|
jamie@264
|
2 #include "xttest_util.hpp"
|
jamie@264
|
3
|
jamie@264
|
4 #include "xtract/xtract_scalar.h"
|
jamie@267
|
5 #include "xtract/libxtract.h"
|
jamie@264
|
6
|
jamie@264
|
7 #include "catch.hpp"
|
jamie@264
|
8
|
jamie@264
|
9
|
jamie@267
|
10 SCENARIO( "F0 is correctly detected for a sine wave", "[xtract_f0]" )
|
jamie@264
|
11 {
|
jamie@267
|
12 uint16_t expected = 0;
|
jamie@267
|
13 uint16_t actual = 0;
|
jamie@267
|
14
|
jamie@267
|
15 GIVEN( "a 512 sample block with a sample rate of 44100" )
|
jamie@267
|
16 {
|
jamie@267
|
17 uint32_t blocksize = 512;
|
jamie@267
|
18 double samplerate = 44100;
|
jamie@267
|
19 double result = -1.0;
|
jamie@267
|
20 double amplitude = 1.0;
|
jamie@267
|
21 double table[blocksize];
|
jamie@267
|
22
|
jamie@267
|
23 WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 1 cycles in the block
|
jamie@267
|
24 {
|
jamie@267
|
25 double frequency = 86.1328125;
|
jamie@267
|
26
|
jamie@267
|
27 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
28 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
29
|
jamie@267
|
30 THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" )
|
jamie@267
|
31 {
|
jamie@267
|
32 REQUIRE(rv == XTRACT_NO_RESULT);
|
jamie@267
|
33 REQUIRE(result == 0.0);
|
jamie@267
|
34 }
|
jamie@267
|
35 }
|
jamie@267
|
36
|
jamie@267
|
37 WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 2 cycles in the block
|
jamie@267
|
38 {
|
jamie@267
|
39 double frequency = 172.265625;
|
jamie@267
|
40
|
jamie@267
|
41 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
42 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
43
|
jamie@267
|
44 THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" )
|
jamie@267
|
45 {
|
jamie@267
|
46 REQUIRE(rv == XTRACT_NO_RESULT);
|
jamie@267
|
47 REQUIRE(result == 0.0);
|
jamie@267
|
48 }
|
jamie@267
|
49 }
|
jamie@267
|
50
|
jamie@267
|
51 WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 4 cycles in the block
|
jamie@267
|
52 {
|
jamie@267
|
53 double frequency = 344.53125;
|
jamie@267
|
54
|
jamie@267
|
55 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
56 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
57
|
jamie@267
|
58 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
59 {
|
jamie@267
|
60 actual = xttest_ftom(result);
|
jamie@267
|
61 expected = xttest_ftom(frequency);
|
jamie@267
|
62 CAPTURE( actual );
|
jamie@267
|
63 CAPTURE( expected );
|
jamie@267
|
64 REQUIRE(actual == expected);
|
jamie@267
|
65 }
|
jamie@267
|
66
|
jamie@267
|
67
|
jamie@267
|
68 WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case
|
jamie@267
|
69 {
|
jamie@267
|
70 double amplitude = 0.01;
|
jamie@267
|
71
|
jamie@267
|
72 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
73 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
74
|
jamie@267
|
75 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
76 {
|
jamie@267
|
77 actual = xttest_ftom(result);
|
jamie@267
|
78 expected = xttest_ftom(frequency);
|
jamie@267
|
79 CAPTURE( actual );
|
jamie@267
|
80 CAPTURE( expected );
|
jamie@267
|
81 REQUIRE(actual == expected);
|
jamie@267
|
82 }
|
jamie@267
|
83 }
|
jamie@267
|
84 }
|
jamie@267
|
85 }
|
jamie@267
|
86
|
jamie@264
|
87 GIVEN( "a 1024 sample block with a sample rate of 44100" )
|
jamie@264
|
88 {
|
jamie@264
|
89 uint32_t blocksize = 1024;
|
jamie@264
|
90 double samplerate = 44100;
|
jamie@267
|
91 double result = -1.0;
|
jamie@264
|
92 double table[blocksize];
|
jamie@264
|
93
|
jamie@267
|
94 WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 2 cycles in the block
|
jamie@267
|
95 {
|
jamie@267
|
96 double frequency = 86.1328125;
|
jamie@267
|
97 double amplitude = 1.0;
|
jamie@267
|
98
|
jamie@267
|
99 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
100 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
101
|
jamie@267
|
102 THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" )
|
jamie@267
|
103 {
|
jamie@267
|
104 REQUIRE(rv == XTRACT_NO_RESULT);
|
jamie@267
|
105 REQUIRE(result == 0.0);
|
jamie@267
|
106 }
|
jamie@267
|
107 }
|
jamie@267
|
108
|
jamie@267
|
109 WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 4 cycles in the block
|
jamie@267
|
110 {
|
jamie@267
|
111 double frequency = 172.265625;
|
jamie@267
|
112 double amplitude = 1.0;
|
jamie@267
|
113
|
jamie@267
|
114 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
115 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
116
|
jamie@267
|
117 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
118 {
|
jamie@267
|
119 actual = xttest_ftom(result);
|
jamie@267
|
120 expected = xttest_ftom(frequency);
|
jamie@267
|
121 CAPTURE( actual );
|
jamie@267
|
122 CAPTURE( expected );
|
jamie@267
|
123 REQUIRE(actual == expected);
|
jamie@267
|
124 }
|
jamie@267
|
125 }
|
jamie@267
|
126
|
jamie@267
|
127 WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 8 cycles in the block
|
jamie@264
|
128 {
|
jamie@264
|
129 double frequency = 344.53125;
|
jamie@267
|
130 expected = xttest_ftom(frequency);
|
jamie@267
|
131 CAPTURE( expected );
|
jamie@264
|
132
|
jamie@264
|
133 WHEN( "the amplitude is 1.0" )
|
jamie@264
|
134 {
|
jamie@264
|
135 double amplitude = 1.0;
|
jamie@264
|
136
|
jamie@264
|
137 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@264
|
138 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@264
|
139
|
jamie@267
|
140 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@264
|
141 {
|
jamie@267
|
142 actual = xttest_ftom(result);
|
jamie@267
|
143 CAPTURE( actual );
|
jamie@267
|
144 REQUIRE(actual == expected);
|
jamie@264
|
145 }
|
jamie@264
|
146 }
|
jamie@267
|
147
|
jamie@267
|
148 WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case
|
jamie@264
|
149 {
|
jamie@267
|
150 double amplitude = 0.01;
|
jamie@264
|
151
|
jamie@264
|
152 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@264
|
153 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@264
|
154
|
jamie@267
|
155 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@264
|
156 {
|
jamie@267
|
157 actual = xttest_ftom(result);
|
jamie@267
|
158 CAPTURE( actual );
|
jamie@267
|
159 REQUIRE(actual == expected);
|
jamie@267
|
160 }
|
jamie@267
|
161 }
|
jamie@267
|
162
|
jamie@267
|
163 WHEN( "white noise is added at 10%" ) // Only test noise for one case
|
jamie@267
|
164 {
|
jamie@267
|
165 double amplitude = 0.1;
|
jamie@267
|
166 double noise[blocksize];
|
jamie@267
|
167
|
jamie@267
|
168 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
169 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
170 xttest_add(table, noise, blocksize);
|
jamie@267
|
171 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
172
|
jamie@267
|
173 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
174 {
|
jamie@267
|
175 actual = xttest_ftom(result);
|
jamie@267
|
176 CAPTURE( actual );
|
jamie@267
|
177 REQUIRE(actual == expected);
|
jamie@267
|
178 }
|
jamie@267
|
179 }
|
jamie@267
|
180
|
jamie@267
|
181 WHEN( "white noise is added at 20%" )
|
jamie@267
|
182 {
|
jamie@267
|
183 double amplitude = 0.2;
|
jamie@267
|
184 double noise[blocksize];
|
jamie@267
|
185
|
jamie@267
|
186 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
187 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
188 xttest_add(table, noise, blocksize);
|
jamie@267
|
189 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
190
|
jamie@267
|
191 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
192 {
|
jamie@267
|
193 actual = xttest_ftom(result);
|
jamie@267
|
194 CAPTURE( actual );
|
jamie@267
|
195 REQUIRE(actual == expected);
|
jamie@267
|
196 }
|
jamie@267
|
197 }
|
jamie@267
|
198
|
jamie@267
|
199 WHEN( "white noise is added at 25%" )
|
jamie@267
|
200 {
|
jamie@267
|
201 double amplitude = 0.25;
|
jamie@267
|
202 double noise[blocksize];
|
jamie@267
|
203
|
jamie@267
|
204 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
205 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
206 xttest_add(table, noise, blocksize);
|
jamie@267
|
207 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
208
|
jamie@267
|
209 THEN( "the detected F0 is accurate to the nearest semitone" )
|
jamie@267
|
210 {
|
jamie@267
|
211 actual = xttest_ftom(result);
|
jamie@267
|
212 uint16_t min = expected - 100;
|
jamie@267
|
213 uint16_t max = expected + 100;
|
jamie@267
|
214 CAPTURE( actual );
|
jamie@267
|
215 REQUIRE( actual > min );
|
jamie@267
|
216 REQUIRE( actual < max );
|
jamie@267
|
217 }
|
jamie@267
|
218 }
|
jamie@267
|
219
|
jamie@267
|
220 WHEN( "white noise is added at 30%" )
|
jamie@267
|
221 {
|
jamie@267
|
222 double amplitude = 0.25;
|
jamie@267
|
223 double noise[blocksize];
|
jamie@267
|
224
|
jamie@267
|
225 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
226 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
227 xttest_add(table, noise, blocksize);
|
jamie@267
|
228 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
229
|
jamie@267
|
230 THEN( "the detected F0 is accurate to the nearest quarter-tone" )
|
jamie@267
|
231 {
|
jamie@267
|
232 actual = xttest_ftom(result);
|
jamie@267
|
233 uint16_t min = expected - 50;
|
jamie@267
|
234 uint16_t max = expected + 50;
|
jamie@267
|
235 CAPTURE( actual );
|
jamie@267
|
236 REQUIRE( actual > min );
|
jamie@267
|
237 REQUIRE( actual < max );
|
jamie@267
|
238 }
|
jamie@267
|
239 }
|
jamie@267
|
240
|
jamie@267
|
241 WHEN( "white noise is added at 35%" )
|
jamie@267
|
242 {
|
jamie@267
|
243 double amplitude = 0.35;
|
jamie@267
|
244 double noise[blocksize];
|
jamie@267
|
245
|
jamie@267
|
246 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
247 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
248 xttest_add(table, noise, blocksize);
|
jamie@267
|
249 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
250
|
jamie@267
|
251 THEN( "the detected F0 is inaccurate by more than one semitone" )
|
jamie@267
|
252 {
|
jamie@267
|
253 actual = xttest_ftom(result);
|
jamie@267
|
254 uint16_t difference = abs(expected - actual);
|
jamie@267
|
255 CAPTURE( actual );
|
jamie@267
|
256 REQUIRE( difference > 100 );
|
jamie@264
|
257 }
|
jamie@264
|
258 }
|
jamie@264
|
259 }
|
jamie@264
|
260 }
|
jamie@267
|
261
|
jamie@267
|
262 GIVEN( "a 1024 sample block with a sample rate of 11025" )
|
jamie@267
|
263 {
|
jamie@267
|
264 uint32_t blocksize = 1024;
|
jamie@267
|
265 double samplerate = 11025;
|
jamie@267
|
266 double result = -1.0;
|
jamie@267
|
267 double table[blocksize];
|
jamie@267
|
268
|
jamie@267
|
269 WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 2 cycles in the block
|
jamie@267
|
270 {
|
jamie@267
|
271 double frequency = 86.1328125;
|
jamie@267
|
272 double amplitude = 1.0;
|
jamie@267
|
273
|
jamie@267
|
274 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
275 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
276
|
jamie@267
|
277 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
278 {
|
jamie@267
|
279 actual = xttest_ftom(result);
|
jamie@267
|
280 expected = xttest_ftom(frequency);
|
jamie@267
|
281 CAPTURE( actual );
|
jamie@267
|
282 CAPTURE( expected );
|
jamie@267
|
283 REQUIRE(actual == expected);
|
jamie@267
|
284 }
|
jamie@267
|
285 }
|
jamie@267
|
286
|
jamie@267
|
287 WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 4 cycles in the block
|
jamie@267
|
288 {
|
jamie@267
|
289 double frequency = 172.265625;
|
jamie@267
|
290 double amplitude = 1.0;
|
jamie@267
|
291
|
jamie@267
|
292 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
293 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
294
|
jamie@267
|
295 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
296 {
|
jamie@267
|
297 actual = xttest_ftom(result);
|
jamie@267
|
298 expected = xttest_ftom(frequency);
|
jamie@267
|
299 CAPTURE( actual );
|
jamie@267
|
300 CAPTURE( expected );
|
jamie@267
|
301 REQUIRE(actual == expected);
|
jamie@267
|
302 }
|
jamie@267
|
303 }
|
jamie@267
|
304
|
jamie@267
|
305 WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 8 cycles in the block
|
jamie@267
|
306 {
|
jamie@267
|
307 double frequency = 344.53125;
|
jamie@267
|
308 expected = xttest_ftom(frequency);
|
jamie@267
|
309 CAPTURE( expected );
|
jamie@267
|
310
|
jamie@267
|
311 WHEN( "the amplitude is 1.0" )
|
jamie@267
|
312 {
|
jamie@267
|
313 double amplitude = 1.0;
|
jamie@267
|
314
|
jamie@267
|
315 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
316 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
317
|
jamie@267
|
318 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
319 {
|
jamie@267
|
320 actual = xttest_ftom(result);
|
jamie@267
|
321 CAPTURE( actual );
|
jamie@267
|
322 REQUIRE(actual == expected);
|
jamie@267
|
323 }
|
jamie@267
|
324 }
|
jamie@267
|
325
|
jamie@267
|
326 WHEN( "the amplitude is 0.01" ) // Only test a different amplitude for one case
|
jamie@267
|
327 {
|
jamie@267
|
328 double amplitude = 0.01;
|
jamie@267
|
329
|
jamie@267
|
330 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
331 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
332
|
jamie@267
|
333 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
334 {
|
jamie@267
|
335 actual = xttest_ftom(result);
|
jamie@267
|
336 CAPTURE( actual );
|
jamie@267
|
337 REQUIRE(actual == expected);
|
jamie@267
|
338 }
|
jamie@267
|
339 }
|
jamie@267
|
340
|
jamie@267
|
341 WHEN( "white noise is added at 20%" )
|
jamie@267
|
342 {
|
jamie@267
|
343 double amplitude = 0.2;
|
jamie@267
|
344 double noise[blocksize];
|
jamie@267
|
345
|
jamie@267
|
346 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
347 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
348 xttest_add(table, noise, blocksize);
|
jamie@267
|
349 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
350
|
jamie@267
|
351 THEN( "the detected F0 is accurate to the nearest quarter-tone" )
|
jamie@267
|
352 {
|
jamie@267
|
353 actual = xttest_ftom(result);
|
jamie@267
|
354 uint16_t min = expected - 50;
|
jamie@267
|
355 uint16_t max = expected + 50;
|
jamie@267
|
356 CAPTURE( actual );
|
jamie@267
|
357 REQUIRE( actual > min );
|
jamie@267
|
358 REQUIRE( actual < max );
|
jamie@267
|
359 }
|
jamie@267
|
360 }
|
jamie@267
|
361
|
jamie@267
|
362 WHEN( "white noise is added at 40%" )
|
jamie@267
|
363 {
|
jamie@267
|
364 double amplitude = 0.4;
|
jamie@267
|
365 double noise[blocksize];
|
jamie@267
|
366
|
jamie@267
|
367 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
368 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
369 xttest_add(table, noise, blocksize);
|
jamie@267
|
370 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
371
|
jamie@267
|
372 THEN( "the detected F0 is accurate to the nearest semi-tone" )
|
jamie@267
|
373 {
|
jamie@267
|
374 actual = xttest_ftom(result);
|
jamie@267
|
375 uint16_t min = expected - 100;
|
jamie@267
|
376 uint16_t max = expected + 100;
|
jamie@267
|
377 CAPTURE( actual );
|
jamie@267
|
378 REQUIRE( actual > min );
|
jamie@267
|
379 REQUIRE( actual < max );
|
jamie@267
|
380 }
|
jamie@267
|
381 }
|
jamie@267
|
382
|
jamie@267
|
383 WHEN( "white noise is added at 60%" )
|
jamie@267
|
384 {
|
jamie@267
|
385 double amplitude = 0.6;
|
jamie@267
|
386 double noise[blocksize];
|
jamie@267
|
387
|
jamie@267
|
388 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
389 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
390 xttest_add(table, noise, blocksize);
|
jamie@267
|
391 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
392
|
jamie@267
|
393 THEN( "the detected F0 is accurate to the nearest semi-tone" )
|
jamie@267
|
394 {
|
jamie@267
|
395 actual = xttest_ftom(result);
|
jamie@267
|
396 uint16_t min = expected - 100;
|
jamie@267
|
397 uint16_t max = expected + 100;
|
jamie@267
|
398 CAPTURE( actual );
|
jamie@267
|
399 REQUIRE( actual > min );
|
jamie@267
|
400 REQUIRE( actual < max );
|
jamie@267
|
401 }
|
jamie@267
|
402 }
|
jamie@267
|
403
|
jamie@267
|
404 WHEN( "white noise is added at 80%" )
|
jamie@267
|
405 {
|
jamie@267
|
406 double amplitude = 0.8;
|
jamie@267
|
407 double noise[blocksize];
|
jamie@267
|
408
|
jamie@267
|
409 xttest_gen_sine(table, blocksize, samplerate, frequency, 1.0 - amplitude);
|
jamie@267
|
410 xttest_gen_noise(noise, blocksize, amplitude);
|
jamie@267
|
411 xttest_add(table, noise, blocksize);
|
jamie@267
|
412 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
413
|
jamie@267
|
414 THEN( "the detected F0 is inaccurate by more than one semitone" )
|
jamie@267
|
415 {
|
jamie@267
|
416 actual = xttest_ftom(result);
|
jamie@267
|
417 uint16_t difference = abs(expected - actual);
|
jamie@267
|
418 CAPTURE( actual );
|
jamie@267
|
419 REQUIRE( difference > 100 );
|
jamie@267
|
420 }
|
jamie@267
|
421 }
|
jamie@267
|
422 }
|
jamie@267
|
423 }
|
jamie@267
|
424
|
jamie@267
|
425 GIVEN( "a 2048 sample block with a sample rate of 44100" )
|
jamie@267
|
426 {
|
jamie@267
|
427 uint32_t blocksize = 2048;
|
jamie@267
|
428 double samplerate = 44100;
|
jamie@267
|
429 double result = -1.0;
|
jamie@267
|
430 double table[blocksize];
|
jamie@267
|
431
|
jamie@267
|
432 WHEN( "the frequency is 43.06640625 Hz" ) // period of exactly 256 samples: 2 cycles in the block
|
jamie@267
|
433 {
|
jamie@267
|
434 double frequency = 43.06640625;
|
jamie@267
|
435 double amplitude = 1.0;
|
jamie@267
|
436
|
jamie@267
|
437 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
438 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
439
|
jamie@267
|
440 THEN( "frequency detection fails correctly (XTRACT_NO_RESULT is returned, result set to 0.0)" )
|
jamie@267
|
441 {
|
jamie@267
|
442 REQUIRE(rv == XTRACT_NO_RESULT);
|
jamie@267
|
443 REQUIRE(result == 0.0);
|
jamie@267
|
444 }
|
jamie@267
|
445 }
|
jamie@267
|
446
|
jamie@267
|
447 WHEN( "the frequency is 86.1328125 Hz" ) // period of exactly 512 samples: 4 cycles in the block
|
jamie@267
|
448 {
|
jamie@267
|
449 double frequency = 86.1328125;
|
jamie@267
|
450 double amplitude = 1.0;
|
jamie@267
|
451
|
jamie@267
|
452 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
453 int rv = xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
454
|
jamie@267
|
455 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
456 {
|
jamie@267
|
457 actual = xttest_ftom(result);
|
jamie@267
|
458 expected = xttest_ftom(frequency);
|
jamie@267
|
459 CAPTURE( actual );
|
jamie@267
|
460 CAPTURE( expected );
|
jamie@267
|
461 REQUIRE(actual == expected);
|
jamie@267
|
462 }
|
jamie@267
|
463 }
|
jamie@267
|
464
|
jamie@267
|
465 WHEN( "the frequency is 172.265625 Hz" ) // period of exactly 256 samples: 8 cycles in the block
|
jamie@267
|
466 {
|
jamie@267
|
467 double frequency = 172.265625;
|
jamie@267
|
468 double amplitude = 1.0;
|
jamie@267
|
469
|
jamie@267
|
470 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
471 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
472
|
jamie@267
|
473 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
474 {
|
jamie@267
|
475 actual = xttest_ftom(result);
|
jamie@267
|
476 expected = xttest_ftom(frequency);
|
jamie@267
|
477 CAPTURE( actual );
|
jamie@267
|
478 CAPTURE( expected );
|
jamie@267
|
479 REQUIRE(actual == expected);
|
jamie@267
|
480 }
|
jamie@267
|
481 }
|
jamie@267
|
482
|
jamie@267
|
483 WHEN( "the frequency is 344.53125 Hz" ) // period of exactly 128 samples: 16 cycles in the block
|
jamie@267
|
484 {
|
jamie@267
|
485 double frequency = 344.53125;
|
jamie@267
|
486
|
jamie@267
|
487 WHEN( "the amplitude is 1.0" )
|
jamie@267
|
488 {
|
jamie@267
|
489 double amplitude = 1.0;
|
jamie@267
|
490
|
jamie@267
|
491 xttest_gen_sine(table, blocksize, samplerate, frequency, amplitude);
|
jamie@267
|
492 xtract_f0(table, blocksize, &samplerate, &result);
|
jamie@267
|
493
|
jamie@267
|
494 THEN( "the detected F0 is accurate to the nearest MIDI cent" )
|
jamie@267
|
495 {
|
jamie@267
|
496 actual = xttest_ftom(result);
|
jamie@267
|
497 expected = xttest_ftom(frequency);
|
jamie@267
|
498 CAPTURE( actual );
|
jamie@267
|
499 CAPTURE( expected );
|
jamie@267
|
500 REQUIRE(actual == expected);
|
jamie@267
|
501 }
|
jamie@267
|
502 }
|
jamie@267
|
503 }
|
jamie@267
|
504 }
|
jamie@264
|
505 }
|