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.

267 lines
6.4KB

  1. #include <functional>
  2. #include <time.h>
  3. #include <cmath>
  4. #include <limits>
  5. #include "AudioMath.h"
  6. #include "BiquadParams.h"
  7. #include "BiquadFilter.h"
  8. #include "BiquadState.h"
  9. #include "ColoredNoise.h"
  10. #include "FrequencyShifter.h"
  11. #include "HilbertFilterDesigner.h"
  12. #include "LookupTableFactory.h"
  13. #include "TestComposite.h"
  14. #include "Tremolo.h"
  15. #include "VocalAnimator.h"
  16. #include "VocalFilter.h"
  17. using Shifter = FrequencyShifter<TestComposite>;
  18. using Animator = VocalAnimator<TestComposite>;
  19. using VocFilter = VocalFilter<TestComposite>;
  20. using Colors = ColoredNoise<TestComposite>;
  21. using Trem = Tremolo<TestComposite>;
  22. #include "MeasureTime.h"
  23. // There are many tests that are disabled with #if 0.
  24. // In most cases they still work, but don't need to be run regularly
  25. #if 0
  26. static void test1()
  27. {
  28. double d = .1;
  29. srand(57);
  30. const double scale = 1.0 / RAND_MAX;
  31. MeasureTime<float>::run("test1 (do nothing)", [&d, scale]() {
  32. return TestBuffers<float>::get();
  33. }, 1);
  34. MeasureTime<float>::run("test1 sin", []() {
  35. float x = std::sin(TestBuffers<float>::get());
  36. return x;
  37. }, 1);
  38. MeasureTime<double>::run("test1 sin double", []() {
  39. float x = std::sin(TestBuffers<float>::get());
  40. return x;
  41. }, 1);
  42. MeasureTime<float>::run("test1 sinx2 float", []() {
  43. float x = std::sin(TestBuffers<float>::get());
  44. x = std::sin(x);
  45. return x;
  46. }, 1);
  47. MeasureTime<float>::run("mult float-10", []() {
  48. float x = TestBuffers<float>::get();
  49. float y = TestBuffers<float>::get();
  50. return x * y;
  51. }, 10);
  52. MeasureTime<double>::run("mult dbl", []() {
  53. double x = TestBuffers<double>::get();
  54. double y = TestBuffers<double>::get();
  55. return x * y;
  56. }, 1);
  57. MeasureTime<float>::run("div float", []() {
  58. float x = TestBuffers<float>::get();
  59. float y = TestBuffers<float>::get();
  60. return x / y;
  61. }, 1);
  62. MeasureTime<double>::run("div dbl", []() {
  63. double x = TestBuffers<double>::get();
  64. double y = TestBuffers<double>::get();
  65. return x / y;
  66. }, 1);
  67. MeasureTime<float>::run("test1 (do nothing)", [&d, scale]() {
  68. return TestBuffers<float>::get();
  69. }, 1);
  70. MeasureTime<float>::run("test1 pow2 float", []() {
  71. float x = std::pow(2, TestBuffers<float>::get());
  72. return x;
  73. }, 1);
  74. MeasureTime<float>::run("test1 pow rnd float", []() {
  75. float x = std::pow(TestBuffers<float>::get(), TestBuffers<float>::get());
  76. return x;
  77. }, 1);
  78. MeasureTime<float>::run("test1 exp float", []() {
  79. float x = std::exp(TestBuffers<float>::get());
  80. return x;
  81. }, 1);
  82. }
  83. #endif
  84. template <typename T>
  85. static void testHilbert()
  86. {
  87. BiquadParams<T, 3> paramsSin;
  88. BiquadParams<T, 3> paramsCos;
  89. BiquadState<T, 3> state;
  90. HilbertFilterDesigner<T>::design(44100, paramsSin, paramsCos);
  91. MeasureTime<T>::run("hilbert", [&state, &paramsSin]() {
  92. T d = BiquadFilter<T>::run(TestBuffers<T>::get(), state, paramsSin);
  93. return d;
  94. }, 1);
  95. }
  96. #if 0
  97. static void testExpRange()
  98. {
  99. using T = float;
  100. LookupTableParams<T> table;
  101. LookupTableFactory<T>::makeExp2(table);
  102. MeasureTime<T>::run("exp lookup", [&table]() {
  103. T d = LookupTable<T>::lookup(table, TestBuffers<T>::get());
  104. return d;
  105. }, 1);
  106. }
  107. #endif
  108. static void testShifter()
  109. {
  110. Shifter fs;
  111. fs.setSampleRate(44100);
  112. fs.init();
  113. fs.inputs[Shifter::AUDIO_INPUT].value = 0;
  114. MeasureTime<float>::run("shifter", [&fs]() {
  115. fs.inputs[Shifter::AUDIO_INPUT].value = TestBuffers<float>::get();
  116. fs.step();
  117. return fs.outputs[Shifter::SIN_OUTPUT].value;
  118. }, 1);
  119. }
  120. static void testAnimator()
  121. {
  122. Animator an;
  123. an.setSampleRate(44100);
  124. an.init();
  125. an.inputs[Shifter::AUDIO_INPUT].value = 0;
  126. MeasureTime<float>::run("animator", [&an]() {
  127. an.inputs[Shifter::AUDIO_INPUT].value = TestBuffers<float>::get();
  128. an.step();
  129. return an.outputs[Shifter::SIN_OUTPUT].value;
  130. }, 1);
  131. }
  132. static void testVocalFilter()
  133. {
  134. VocFilter an;
  135. an.setSampleRate(44100);
  136. an.init();
  137. an.inputs[Shifter::AUDIO_INPUT].value = 0;
  138. MeasureTime<float>::run("vocal filter", [&an]() {
  139. an.inputs[Shifter::AUDIO_INPUT].value = TestBuffers<float>::get();
  140. an.step();
  141. return an.outputs[Shifter::SIN_OUTPUT].value;
  142. }, 1);
  143. }
  144. static void testColors()
  145. {
  146. Colors co;
  147. co.setSampleRate(44100);
  148. co.init();
  149. MeasureTime<float>::run("colors", [&co]() {
  150. co.step();
  151. return co.outputs[Colors::AUDIO_OUTPUT].value;
  152. }, 1);
  153. }
  154. static void testTremolo()
  155. {
  156. Trem tr;
  157. tr.setSampleRate(44100);
  158. tr.init();
  159. MeasureTime<float>::run("trem", [&tr]() {
  160. tr.inputs[Trem::AUDIO_INPUT].value = TestBuffers<float>::get();
  161. tr.step();
  162. return tr.outputs[Trem::AUDIO_OUTPUT].value;
  163. }, 1);
  164. }
  165. #if 0
  166. static void testAttenuverters()
  167. {
  168. auto scaler = AudioMath::makeLinearScaler<float>(-2, 2);
  169. MeasureTime<float>::run("linear scaler", [&scaler]() {
  170. float cv = TestBuffers<float>::get();
  171. float knob = TestBuffers<float>::get();
  172. float trim = TestBuffers<float>::get();
  173. return scaler(cv, knob, trim);
  174. }, 1);
  175. LookupTableParams<float> lookup;
  176. LookupTableFactory<float>::makeBipolarAudioTaper(lookup);
  177. MeasureTime<float>::run("bipolar lookup", [&lookup]() {
  178. float x = TestBuffers<float>::get();
  179. return LookupTable<float>::lookup(lookup, x);
  180. }, 1);
  181. // auto refFuncPos = AudioMath::makeFunc_AudioTaper(LookupTableFactory<T>::audioTaperKnee());
  182. {
  183. auto bipolarScaler = [&lookup, &scaler](float cv, float knob, float trim) {
  184. float scaledTrim = LookupTable<float>::lookup(lookup, cv);
  185. return scaler(cv, knob, scaledTrim);
  186. };
  187. MeasureTime<float>::run("bipolar scaler", [&bipolarScaler]() {
  188. float cv = TestBuffers<float>::get();
  189. float knob = TestBuffers<float>::get();
  190. float trim = TestBuffers<float>::get();
  191. return bipolarScaler(cv, knob, trim);
  192. }, 1);
  193. }
  194. }
  195. #endif
  196. void perfTest()
  197. {
  198. #if 0
  199. testAttenuverters();
  200. testExpRange();
  201. #endif
  202. testVocalFilter();
  203. testAnimator();
  204. testShifter();
  205. testColors();
  206. testTremolo();
  207. // test1();
  208. #if 0
  209. testHilbert<float>();
  210. testHilbert<double>();
  211. #endif
  212. }