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.

221 lines
5.0KB

  1. #include <vector>
  2. #include <benchmark/benchmark.h>
  3. #include "dsp/oscillator.hpp"
  4. #include "dsp/noise.hpp"
  5. #include "dsp/signal.hpp"
  6. using namespace bogaudio::dsp;
  7. static void BM_DecibelsToAmplitude(benchmark::State& state) {
  8. std::vector<float> buf = { 10.0f, 6.0f, 3.0f, 0.0f, -3.0f, -6.0f, -10.0f, -30.0f, -60.0f };
  9. int i = 0;
  10. for (auto _ : state) {
  11. i = ++i % buf.size();
  12. benchmark::DoNotOptimize(decibelsToAmplitude(buf.at(i)));
  13. }
  14. }
  15. BENCHMARK(BM_DecibelsToAmplitude);
  16. static void BM_AmplitudeToDecibels(benchmark::State& state) {
  17. std::vector<float> buf = { 0.0001f, 0.0001f, 0.001f, 0.01, 0.1f, 0.3f, 0.5f, 0.8f, 1.0f, 1.5f, 2.0f, 5.0f, 10.0f };
  18. int i = 0;
  19. for (auto _ : state) {
  20. i = ++i % buf.size();
  21. benchmark::DoNotOptimize(amplitudeToDecibels(buf.at(i)));
  22. }
  23. }
  24. BENCHMARK(BM_AmplitudeToDecibels);
  25. static void BM_Amplifier(benchmark::State& state) {
  26. WhiteNoiseGenerator r;
  27. const int n = 256;
  28. float samples[n];
  29. for (int i = 0; i < n; ++i) {
  30. samples[i] = r.next();
  31. }
  32. std::vector<float> decibels = { 10.0f, 6.0f, 3.0f, 0.0f, -3.0f, -6.0f, -10.0f, -30.0f, -60.0f };
  33. Amplifier a;
  34. int i = 0, j = 0;
  35. for (auto _ : state) {
  36. i = ++i % decibels.size();
  37. j = ++j % n;
  38. a.setLevel(decibels.at(i));
  39. benchmark::DoNotOptimize(a.next(samples[j]));
  40. }
  41. }
  42. BENCHMARK(BM_Amplifier);
  43. static void BM_RMS_Short(benchmark::State& state) {
  44. SineOscillator o(500.0, 100.0);
  45. const int n = 256;
  46. float buf[n];
  47. for (int i = 0; i < n; ++i) {
  48. buf[i] = o.next() * 5.0f;
  49. }
  50. RootMeanSquare rms(44100.0, 0.05);
  51. int i = 0;
  52. for (auto _ : state) {
  53. i = ++i % n;
  54. benchmark::DoNotOptimize(rms.next(buf[i]));
  55. }
  56. }
  57. BENCHMARK(BM_RMS_Short);
  58. static void BM_RMS_Long(benchmark::State& state) {
  59. SineOscillator o(500.0, 100.0);
  60. const int n = 256;
  61. float buf[n];
  62. for (int i = 0; i < n; ++i) {
  63. buf[i] = o.next() * 5.0f;
  64. }
  65. RootMeanSquare rms(44100.0, 1.0);
  66. int i = 0;
  67. for (auto _ : state) {
  68. i = ++i % n;
  69. benchmark::DoNotOptimize(rms.next(buf[i]));
  70. }
  71. }
  72. BENCHMARK(BM_RMS_Long);
  73. static void BM_RMS_Modulating(benchmark::State& state) {
  74. SineOscillator o(500.0, 100.0);
  75. const int n = 256;
  76. float buf[n];
  77. for (int i = 0; i < n; ++i) {
  78. buf[i] = o.next() * 5.0f;
  79. }
  80. std::minstd_rand g;
  81. std::uniform_real_distribution<float> r(0.0f, 1.0f);
  82. RootMeanSquare rms(44100.0, 1.0);
  83. int i = 0;
  84. for (auto _ : state) {
  85. i = ++i % n;
  86. if (i % 50 == 0) {
  87. rms.setSensitivity(r(g));
  88. }
  89. benchmark::DoNotOptimize(rms.next(buf[i]));
  90. }
  91. }
  92. BENCHMARK(BM_RMS_Modulating);
  93. static void BM_PucketteEnvelopeFollower(benchmark::State& state) {
  94. SineOscillator o(500.0, 100.0);
  95. const int n = 256;
  96. float buf[n];
  97. for (int i = 0; i < n; ++i) {
  98. buf[i] = o.next() * 5.0f;
  99. }
  100. PucketteEnvelopeFollower pef;
  101. int i = 0;
  102. for (auto _ : state) {
  103. i = ++i % n;
  104. benchmark::DoNotOptimize(pef.next(buf[i]));
  105. }
  106. }
  107. BENCHMARK(BM_PucketteEnvelopeFollower);
  108. static void BM_SlewLimiter(benchmark::State& state) {
  109. WhiteNoiseGenerator r;
  110. const int n = 256;
  111. float buf[n];
  112. for (int i = 0; i < n; ++i) {
  113. buf[i] = r.next();
  114. }
  115. SlewLimiter sl(44100.0, 1.0f);
  116. int i = 0;
  117. for (auto _ : state) {
  118. i = ++i % n;
  119. benchmark::DoNotOptimize(sl.next(buf[i]));
  120. }
  121. }
  122. BENCHMARK(BM_SlewLimiter);
  123. static void BM_ShapedSlewLimiter(benchmark::State& state) {
  124. WhiteNoiseGenerator r;
  125. const int n = 256;
  126. float buf[n];
  127. for (int i = 0; i < n; ++i) {
  128. buf[i] = r.next();
  129. }
  130. ShapedSlewLimiter sl(44100.0, 1.0f, 0.5f);
  131. int i = 0;
  132. for (auto _ : state) {
  133. i = ++i % n;
  134. benchmark::DoNotOptimize(sl.next(buf[i]));
  135. }
  136. }
  137. BENCHMARK(BM_ShapedSlewLimiter);
  138. static void BM_Panner(benchmark::State& state) {
  139. SineOscillator o(500.0, 100.0);
  140. const int n = 256;
  141. float buf[n];
  142. for (int i = 0; i < n; ++i) {
  143. buf[i] = o.next() * 5.0f;
  144. }
  145. Panner p;
  146. int i = 0;
  147. float l, r;
  148. for (auto _ : state) {
  149. i = ++i % n;
  150. p.next(buf[i], l, r);
  151. }
  152. }
  153. BENCHMARK(BM_Panner);
  154. static void BM_Panner_Modulating(benchmark::State& state) {
  155. SineOscillator o(500.0, 100.0);
  156. const int n = 256;
  157. float buf[n];
  158. for (int i = 0; i < n; ++i) {
  159. buf[i] = o.next() * 5.0f;
  160. }
  161. std::minstd_rand g;
  162. std::uniform_real_distribution<float> r(-1.0f, 1.0f);
  163. Panner p;
  164. int i = 0;
  165. float l, rr;
  166. for (auto _ : state) {
  167. i = ++i % n;
  168. p.setPan(r(g));
  169. p.next(buf[i], l, rr);
  170. }
  171. }
  172. BENCHMARK(BM_Panner_Modulating);
  173. static void BM_DelayLine(benchmark::State& state) {
  174. SineOscillator o(500.0, 100.0);
  175. const int n = 256;
  176. float buf[n];
  177. for (int i = 0; i < n; ++i) {
  178. buf[i] = o.next() * 5.0f;
  179. }
  180. DelayLine dl(44100.0, 1000.0, 1.0);
  181. int i = 0;
  182. for (auto _ : state) {
  183. i = ++i % n;
  184. benchmark::DoNotOptimize(dl.next(buf[i]));
  185. }
  186. }
  187. BENCHMARK(BM_DelayLine);
  188. static void BM_Saturator(benchmark::State& state) {
  189. SineOscillator o(500.0, 100.0);
  190. const int n = 256;
  191. float buf[n];
  192. for (int i = 0; i < n; ++i) {
  193. buf[i] = o.next() * 20.0f;
  194. }
  195. Saturator s;
  196. int i = 0;
  197. for (auto _ : state) {
  198. i = ++i % n;
  199. benchmark::DoNotOptimize(s.next(buf[i]));
  200. }
  201. }
  202. BENCHMARK(BM_Saturator);