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.

152 lines
3.2KB

  1. #include <assert.h>
  2. #include <iostream>
  3. #include "SawOscillator.h"
  4. using namespace std;
  5. // do objects exist?
  6. template<typename T>
  7. void testSaw1()
  8. {
  9. SawOscillatorParams<T> params;
  10. SawOscillator<T, false>::setFrequency(params, (T(.1)));
  11. SawOscillatorState<T> state;
  12. SawOscillator<T, false>::run(state, params);
  13. }
  14. /**
  15. * Does parameter calculation do anything?
  16. */
  17. template<typename T>
  18. void testSaw2()
  19. {
  20. SawOscillatorParams<T> params;
  21. assert(params.phaseIncrement == 0);
  22. SawOscillator<T, false>::setFrequency(params, (T(.1)));
  23. assert(params.phaseIncrement > 0);
  24. }
  25. /**
  26. * Does something come out?
  27. */
  28. template<typename T>
  29. void testSaw3()
  30. {
  31. SawOscillatorParams<T> params;
  32. SawOscillator<T, true>::setFrequency(params, (T(.2)));
  33. SawOscillatorState<T> state;
  34. SawOscillator<T, true>::run(state, params);
  35. const T out = SawOscillator<T, true>::run(state, params);
  36. assert(out >= 0);
  37. assert(out < 1);
  38. }
  39. /**
  40. * Does it look like a saw?
  41. */
  42. template<typename T>
  43. void testSaw4()
  44. {
  45. const T freq = T(.01);
  46. const T freq_2 = freq / 2;
  47. const T delta = freq / 1000;
  48. SawOscillatorParams<T> params;
  49. SawOscillator<T, true>::setFrequency(params, (T(.01)));
  50. SawOscillatorState<T> state;
  51. T last = 0;
  52. for (int i = 0; i < 1000; ++i) {
  53. const T output = SawOscillator<T, true>::run(state, params);
  54. assert(output >= 0);
  55. assert(output < 1);
  56. if (output < last) {
  57. assert(last > .99);
  58. assert(output < .01);
  59. } else {
  60. assert(output < (last + freq + delta));
  61. }
  62. last = output;
  63. }
  64. }
  65. /**
  66. * is the quadrature really 90 out of phase?
  67. */
  68. template<typename T>
  69. void testSaw5()
  70. {
  71. const T freq = T(.01);
  72. const T freq_2 = freq / 2;
  73. const T delta = freq / 1000;
  74. SawOscillatorParams<T> params;
  75. SawOscillator<T, true>::setFrequency(params, (T(.01)));
  76. SawOscillatorState<T> state;
  77. T output;
  78. T quadratureOutput;
  79. for (int i = 0; i < 1000; ++i) {
  80. SawOscillator<T, true>::runQuadrature(output, quadratureOutput, state, params);
  81. // normalize output (unwrap)
  82. if (quadratureOutput < output) {
  83. quadratureOutput += 1;
  84. }
  85. assert(quadratureOutput = (output + T(.25)));
  86. }
  87. }
  88. /**
  89. * Does it look like a negative saw?
  90. */
  91. template<typename T>
  92. void testSaw6()
  93. {
  94. const T freq = T(-.01);
  95. const T delta = freq / 1000;
  96. SawOscillatorParams<T> params;
  97. SawOscillator<T, true>::setFrequency(params, freq);
  98. SawOscillatorState<T> state;
  99. T last = 0;
  100. for (int i = 0; i < 1000; ++i) {
  101. const T output = SawOscillator<T, true>::run(state, params);
  102. assert(output >= 0);
  103. assert(output < 1);
  104. if (output > last) {
  105. // wrap case - did we more or less wrap?
  106. assert(last < .01);
  107. assert(output > .98);
  108. } else {
  109. // no-wrap - are we decreasing
  110. assert(output > (last + freq + delta));
  111. }
  112. last = output;
  113. }
  114. }
  115. template <typename T>
  116. void testSawT()
  117. {
  118. testSaw1<T>();
  119. testSaw2<T>();
  120. testSaw3<T>();
  121. testSaw4<T>();
  122. testSaw5<T>();
  123. testSaw6<T>();
  124. }
  125. void testSaw()
  126. {
  127. testSawT<float>();
  128. testSawT<double>();
  129. }