#include #include #include "AudioMath.h" #include "TestSignal.h" /** * Test that sin generates a signal +-1 */ template static void test1() { const int size = 20000; T buffer[size]; TestSignal::generateSin(buffer, size, T(.01)); T min = 1, max = -1; for (int i = 0; i < size; ++i) { const T x = buffer[i]; assert(x <= 1); assert(x >= -1); if (min > x) { min = x; } if (max < x) { max = x; } } const T delta = T(.0000001); assert(AudioMath::closeTo(min, T(-1), delta)); assert(AudioMath::closeTo(max, T(1), delta)); } /** * Test the period of sin is correct */ template static void test2() { const int size = 20000; T buffer[size]; TestSignal::generateSin(buffer, size, T(.001)); const T delta = T(.0000001); assert(AudioMath::closeTo(buffer[0], 0, delta)); T last = -1; int period = 0; for (int i = 0; i < size; ++i) { const T x = buffer[i]; if (x <= last) { period = (i - 1) * 4; break; } last = x; } assert(period == 1000); } template static void test3() { const int size = 20000; T buffer[size]; buffer[0] = 1; assert(TestSignal::getRMS(buffer, 1) == 1); buffer[0] = -1; assert(TestSignal::getRMS(buffer, 1) == 1); for (int i = 0; i < 5; ++i) { buffer[i] = 1; } assert(TestSignal::getRMS(buffer, 1) == 1); for (int i = 0; i < 5; ++i) { buffer[i] = -2; } assert(TestSignal::getRMS(buffer, 1) == 2); TestSignal::generateSin(buffer, size, T(.001)); const double amplitude = TestSignal::getRMS(buffer, size); assert(AudioMath::closeTo(amplitude, std::sqrt(2.0) / 2, .00001)); } template static void testUnityGain() { const T gl = TestSignal::measureGain(T(.001), [](T input) { return input; }); assert(gl == 1); } template static void test4() { double amp = TestSignal::measureOutput(5, []() { return T(-3); }); assert(amp == 3); } template static void test() { test1(); test2(); test3(); testUnityGain(); test4(); } void testTestSignal() { test(); test(); }