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.

130 lines
2.9KB

  1. #include <benchmark/benchmark.h>
  2. #include "dsp/analyzer.hpp"
  3. using namespace bogaudio::dsp;
  4. static void BM_HanningWindowInit(benchmark::State& state) {
  5. for (auto _ : state) {
  6. delete new HanningWindow(1024);
  7. }
  8. }
  9. BENCHMARK(BM_HanningWindowInit);
  10. static void BM_HanningWindowApply(benchmark::State& state) {
  11. const int n = 1024;
  12. HanningWindow w(n);
  13. float in[n];
  14. std::fill_n(in, n, 1.1);
  15. float out[n] {};
  16. for (auto _ : state) {
  17. w.apply(in, out);
  18. in[0] = out[0]; // prevents the call from being optimized away?
  19. }
  20. }
  21. BENCHMARK(BM_HanningWindowApply);
  22. static void BM_RuntimeFFT1024(benchmark::State& state) {
  23. const int n = 1024;
  24. ffft::FFTReal<float> fft(n);
  25. float in[n];
  26. std::fill_n(in, n, 1.1);
  27. float out[n] {};
  28. for (auto _ : state) {
  29. fft.do_fft(out, in);
  30. }
  31. }
  32. BENCHMARK(BM_RuntimeFFT1024);
  33. static void BM_CompileTimeFFT1024(benchmark::State& state) {
  34. FFT1024 fft;
  35. const int n = 1024;
  36. float in[n];
  37. std::fill_n(in, n, 1.1);
  38. float out[n] {};
  39. for (auto _ : state) {
  40. fft.do_fft(out, in);
  41. }
  42. }
  43. BENCHMARK(BM_CompileTimeFFT1024);
  44. static void BM_RuntimeFFT4096(benchmark::State& state) {
  45. const int n = 4096;
  46. ffft::FFTReal<float> fft(n);
  47. float in[n];
  48. std::fill_n(in, n, 1.1);
  49. float out[n] {};
  50. for (auto _ : state) {
  51. fft.do_fft(out, in);
  52. }
  53. }
  54. BENCHMARK(BM_RuntimeFFT4096);
  55. static void BM_CompileTimeFFT4096(benchmark::State& state) {
  56. FFT4096 fft;
  57. const int n = 4096;
  58. float in[n];
  59. std::fill_n(in, n, 1.1);
  60. float out[n] {};
  61. for (auto _ : state) {
  62. fft.do_fft(out, in);
  63. }
  64. }
  65. BENCHMARK(BM_CompileTimeFFT4096);
  66. static void BM_SpectrumAnalyzerStep(benchmark::State& state) {
  67. SpectrumAnalyzer sa(
  68. SpectrumAnalyzer::SIZE_1024,
  69. SpectrumAnalyzer::OVERLAP_1,
  70. SpectrumAnalyzer::WINDOW_HANNING,
  71. 44100.0
  72. );
  73. float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  74. int i = 0;
  75. for (auto _ : state) {
  76. sa.step(in[i]);
  77. ++i;
  78. i %= 8;
  79. }
  80. }
  81. BENCHMARK(BM_SpectrumAnalyzerStep);
  82. static void BM_SpectrumAnalyzerProcess(benchmark::State& state) {
  83. SpectrumAnalyzer sa(
  84. SpectrumAnalyzer::SIZE_1024,
  85. SpectrumAnalyzer::OVERLAP_1,
  86. SpectrumAnalyzer::WINDOW_HANNING,
  87. 44100.0
  88. );
  89. float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  90. for (int i = 0; i < 1024; ++i) {
  91. sa.step(in[i % 8]);
  92. }
  93. for (auto _ : state) {
  94. sa.process(sa._samples);
  95. }
  96. }
  97. BENCHMARK(BM_SpectrumAnalyzerProcess);
  98. static void BM_SpectrumAnalyzerGetMagnitudes(benchmark::State& state) {
  99. SpectrumAnalyzer sa(
  100. SpectrumAnalyzer::SIZE_1024,
  101. SpectrumAnalyzer::OVERLAP_1,
  102. SpectrumAnalyzer::WINDOW_HANNING,
  103. 44100.0
  104. );
  105. const int nBins = 256;
  106. float bins[nBins];
  107. float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  108. for (int i = 0; i < 1024; ++i) {
  109. sa.step(in[i % 8]);
  110. }
  111. for (auto _ : state) {
  112. sa.getMagnitudes(bins, nBins);
  113. }
  114. }
  115. BENCHMARK(BM_SpectrumAnalyzerGetMagnitudes);