annotate tests/TestPhaseVocoder.cpp @ 113:3cb359d043f0 pvoc

Add another frame
author Chris Cannam
date Tue, 01 Oct 2013 15:38:56 +0100
parents 55b86acdc740
children f3c69325cca2
rev   line source
Chris@112 1
Chris@112 2 #include "dsp/phasevocoder/PhaseVocoder.h"
Chris@112 3
Chris@112 4 #include "base/Window.h"
Chris@112 5
Chris@112 6 #define BOOST_TEST_DYN_LINK
Chris@112 7 #define BOOST_TEST_MAIN
Chris@112 8
Chris@112 9 #include <boost/test/unit_test.hpp>
Chris@112 10
Chris@112 11 BOOST_AUTO_TEST_SUITE(TestFFT)
Chris@112 12
Chris@112 13 #define COMPARE_CONST(a, n) \
Chris@112 14 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
Chris@112 15 BOOST_CHECK_SMALL(a[cmp_i] - n, 1e-14); \
Chris@112 16 }
Chris@112 17
Chris@112 18 #define COMPARE_ARRAY(a, b) \
Chris@112 19 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
Chris@112 20 BOOST_CHECK_SMALL(a[cmp_i] - b[cmp_i], 1e-14); \
Chris@112 21 }
Chris@112 22
Chris@112 23 #define COMPARE_ARRAY_EXACT(a, b) \
Chris@112 24 for (int cmp_i = 0; cmp_i < (int)(sizeof(a)/sizeof(a[0])); ++cmp_i) { \
Chris@112 25 BOOST_CHECK_EQUAL(a[cmp_i], b[cmp_i]); \
Chris@112 26 }
Chris@112 27
Chris@112 28 BOOST_AUTO_TEST_CASE(fullcycle)
Chris@112 29 {
Chris@112 30 // Cosine with one cycle exactly equal to pvoc hopsize. We aren't
Chris@112 31 // windowing the input frame because (for once) it actually *is*
Chris@112 32 // just a short part of a continuous infinite sinusoid.
Chris@112 33
Chris@112 34 double frame[] = { 1, 0, -1, 0, 1, 0, -1, 0 };
Chris@112 35
Chris@112 36 PhaseVocoder pvoc(8);
Chris@112 37
Chris@112 38 // Make these arrays one element too long at each end, so as to
Chris@112 39 // test for overruns. For frame size 8, we expect 8/2+1 = 5
Chris@112 40 // mag/phase pairs.
Chris@112 41 double mag[] = { 999, 999, 999, 999, 999, 999, 999 };
Chris@112 42 double phase[] = { 999, 999, 999, 999, 999, 999, 999 };
Chris@112 43
Chris@112 44 pvoc.process(frame, mag + 1, phase + 1);
Chris@112 45
Chris@112 46 double magExpected0[] = { 999, 0, 0, 4, 0, 0, 999 };
Chris@112 47 COMPARE_ARRAY_EXACT(mag, magExpected0);
Chris@112 48
Chris@112 49 double phaseExpected0[] = { 999, 0, 0, 0, 0, 0, 999 };
Chris@112 50 COMPARE_ARRAY_EXACT(phase, phaseExpected0);
Chris@112 51
Chris@112 52 pvoc.process(frame, mag + 1, phase + 1);
Chris@112 53
Chris@112 54 double magExpected1[] = { 999, 0, 0, 4, 0, 0, 999 };
Chris@112 55 COMPARE_ARRAY_EXACT(mag, magExpected1);
Chris@112 56
Chris@112 57 double phaseExpected1[] = { 999, 0, 0, 2 * M_PI, 0, 0, 999 };
Chris@112 58 COMPARE_ARRAY(phase, phaseExpected1);
Chris@113 59
Chris@113 60 pvoc.process(frame, mag + 1, phase + 1);
Chris@113 61
Chris@113 62 double magExpected2[] = { 999, 0, 0, 4, 0, 0, 999 };
Chris@113 63 COMPARE_ARRAY_EXACT(mag, magExpected2);
Chris@113 64
Chris@113 65 double phaseExpected2[] = { 999, 0, 0, 4 * M_PI, 0, 0, 999 };
Chris@113 66 COMPARE_ARRAY(phase, phaseExpected2);
Chris@112 67 }
Chris@112 68
Chris@112 69 BOOST_AUTO_TEST_SUITE_END()
Chris@112 70