|  | #include <assert.h>
#include <stdio.h>
#include "AudioMath.h"
#include "TestSignal.h"
/**
 * Test that sin generates a signal +-1
 */
template <typename T>
static void test1()
{
    const int size = 20000;
    T buffer[size];
    TestSignal<T>::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 <typename T>
static void test2()
{
    const int size = 20000;
    T buffer[size];
    TestSignal<T>::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 <typename T>
static void test3()
{
    const int size = 20000;
    T buffer[size];
    buffer[0] = 1;
    assert(TestSignal<T>::getRMS(buffer, 1) == 1);
    buffer[0] = -1;
    assert(TestSignal<T>::getRMS(buffer, 1) == 1);
    for (int i = 0; i < 5; ++i) {
        buffer[i] = 1;
    }
    assert(TestSignal<T>::getRMS(buffer, 1) == 1);
    for (int i = 0; i < 5; ++i) {
        buffer[i] = -2;
    }
    assert(TestSignal<T>::getRMS(buffer, 1) == 2);
    TestSignal<T>::generateSin(buffer, size, T(.001));
    const double amplitude = TestSignal<T>::getRMS(buffer, size);
    assert(AudioMath::closeTo(amplitude, std::sqrt(2.0) / 2, .00001));
}
template <typename T>
static void testUnityGain()
{
    const T gl = TestSignal<T>::measureGain(T(.001), [](T input) {
        return input;
        });
    assert(gl == 1);
}
template <typename T>
static void test4()
{
    double amp = TestSignal<T>::measureOutput(5, []() {
        return T(-3);
        });
    assert(amp == 3);
}
template <typename T>
static void test()
{
    test1<T>();
    test2<T>();
    test3<T>();
    testUnityGain<T>();
    test4<T>();
}
void testTestSignal()
{
    test<float>();
    test<double>();
}
 |