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.

115 lines
2.9KB

  1. #include <assert.h>
  2. #include <iostream>
  3. #include "SinOscillator.h"
  4. using namespace std;
  5. // test that it can be hooked up
  6. template<typename T>
  7. void test1()
  8. {
  9. SinOscillatorParams<T> p;
  10. SinOscillatorState<T> s;
  11. SinOscillator<T, true>::setFrequency(p, T(.1));
  12. T x = SinOscillator<T, true>::run(s, p);
  13. (void) x;
  14. }
  15. // test that it makes output
  16. template<typename T>
  17. void test2()
  18. {
  19. SinOscillatorParams<T> p;
  20. SinOscillatorState<T> s;
  21. SinOscillator<T, false>::setFrequency(p, T(.1));
  22. T x = SinOscillator<T, false>::run(s, p);
  23. assert(x == 0);
  24. x = SinOscillator<T, false>::run(s, p);
  25. assert(x > 0);
  26. }
  27. // test that sin lookup is correct
  28. template<typename T>
  29. void test3()
  30. {
  31. SinOscillatorParams<T> params;
  32. SinOscillatorState<T> s;
  33. SinOscillator<T, true>::setFrequency(params, T(.1));
  34. auto& lookup = params.lookupParams;
  35. const double delta = .00001;
  36. // sin(0) == 0;
  37. T y = LookupTable<T>::lookup(lookup, 0);
  38. assert(AudioMath::closeTo(y, 0, delta));
  39. // sin(2pi) == 0
  40. y = LookupTable<T>::lookup(lookup, 1);
  41. assert(AudioMath::closeTo(y, 0, delta));
  42. // sin(pi/2) == 1
  43. y = LookupTable<T>::lookup(lookup, .25);
  44. assert(AudioMath::closeTo(y, 1, delta));
  45. // sin(pi) == 0
  46. y = LookupTable<T>::lookup(lookup, .5);
  47. assert(AudioMath::closeTo(y, 0, delta));
  48. }
  49. // test that output is correct freq
  50. template<typename T>
  51. void test4()
  52. {
  53. const int clocksPerPeriod = 64;
  54. SinOscillatorParams<T> params;
  55. SinOscillatorState<T> state;
  56. SinOscillator<T, false>::setFrequency(params, T(1.0 / clocksPerPeriod));
  57. const double delta = .00001;
  58. T output, quadrature;
  59. for (int i = 0; i <= clocksPerPeriod; ++i) {
  60. SinOscillator<T, false>::runQuadrature(output, quadrature, state, params);
  61. if (i == 0) {
  62. // sin+cos(0) = 0 + 1
  63. assert(AudioMath::closeTo(output, 0, delta));
  64. assert(AudioMath::closeTo(quadrature, 1, delta));
  65. }
  66. if (i == 64) {
  67. // sin+cos(0) = 0 + 1
  68. assert(AudioMath::closeTo(output, 0, delta));
  69. assert(AudioMath::closeTo(quadrature, 1, delta));
  70. }
  71. if (i == 16) {
  72. // sin+cos(pi/2) = 1 0
  73. assert(AudioMath::closeTo(output, 1, delta));
  74. assert(AudioMath::closeTo(quadrature, 0, delta));
  75. }
  76. if (i == 32) {
  77. // sin+cos(pi) = 0 -1
  78. assert(AudioMath::closeTo(output, 0, delta));
  79. assert(AudioMath::closeTo(quadrature, -1, delta));
  80. }
  81. if (i == 48) {
  82. // sin+cos(3pi/2) = -1 0
  83. assert(AudioMath::closeTo(output, -1, delta));
  84. assert(AudioMath::closeTo(quadrature, 0, delta));
  85. }
  86. }
  87. }
  88. template<typename T>
  89. void test()
  90. {
  91. test1<T>();
  92. test2<T>();
  93. test3<T>();
  94. test4<T>();
  95. }
  96. void testSinOscillator()
  97. {
  98. test<double>();
  99. test<float>();
  100. }