You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
2.3KB

  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include "AudioMath.h"
  4. #include "TestSignal.h"
  5. /**
  6. * Test that sin generates a signal +-1
  7. */
  8. template <typename T>
  9. static void test1()
  10. {
  11. const int size = 20000;
  12. T buffer[size];
  13. TestSignal<T>::generateSin(buffer, size, T(.01));
  14. T min = 1, max = -1;
  15. for (int i = 0; i < size; ++i) {
  16. const T x = buffer[i];
  17. assert(x <= 1);
  18. assert(x >= -1);
  19. if (min > x) {
  20. min = x;
  21. }
  22. if (max < x) {
  23. max = x;
  24. }
  25. }
  26. const T delta = T(.0000001);
  27. assert(AudioMath::closeTo(min, T(-1), delta));
  28. assert(AudioMath::closeTo(max, T(1), delta));
  29. }
  30. /**
  31. * Test the period of sin is correct
  32. */
  33. template <typename T>
  34. static void test2()
  35. {
  36. const int size = 20000;
  37. T buffer[size];
  38. TestSignal<T>::generateSin(buffer, size, T(.001));
  39. const T delta = T(.0000001);
  40. assert(AudioMath::closeTo(buffer[0], 0, delta));
  41. T last = -1;
  42. int period = 0;
  43. for (int i = 0; i < size; ++i) {
  44. const T x = buffer[i];
  45. if (x <= last) {
  46. period = (i - 1) * 4;
  47. break;
  48. }
  49. last = x;
  50. }
  51. assert(period == 1000);
  52. }
  53. template <typename T>
  54. static void test3()
  55. {
  56. const int size = 20000;
  57. T buffer[size];
  58. buffer[0] = 1;
  59. assert(TestSignal<T>::getRMS(buffer, 1) == 1);
  60. buffer[0] = -1;
  61. assert(TestSignal<T>::getRMS(buffer, 1) == 1);
  62. for (int i = 0; i < 5; ++i) {
  63. buffer[i] = 1;
  64. }
  65. assert(TestSignal<T>::getRMS(buffer, 1) == 1);
  66. for (int i = 0; i < 5; ++i) {
  67. buffer[i] = -2;
  68. }
  69. assert(TestSignal<T>::getRMS(buffer, 1) == 2);
  70. TestSignal<T>::generateSin(buffer, size, T(.001));
  71. const double amplitude = TestSignal<T>::getRMS(buffer, size);
  72. assert(AudioMath::closeTo(amplitude, std::sqrt(2.0) / 2, .00001));
  73. }
  74. template <typename T>
  75. static void testUnityGain()
  76. {
  77. const T gl = TestSignal<T>::measureGain(T(.001), [](T input) {
  78. return input;
  79. });
  80. assert(gl == 1);
  81. }
  82. template <typename T>
  83. static void test4()
  84. {
  85. double amp = TestSignal<T>::measureOutput(5, []() {
  86. return T(-3);
  87. });
  88. assert(amp == 3);
  89. }
  90. template <typename T>
  91. static void test()
  92. {
  93. test1<T>();
  94. test2<T>();
  95. test3<T>();
  96. testUnityGain<T>();
  97. test4<T>();
  98. }
  99. void testTestSignal()
  100. {
  101. test<float>();
  102. test<double>();
  103. }