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.

127 lines
2.5KB

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