|  | 
#include <benchmark/benchmark.h>
#include "dsp/analyzer.hpp"
using namespace bogaudio::dsp;
static void BM_HanningWindowInit(benchmark::State& state) {
  for (auto _ : state) {
    delete new HanningWindow(1024);
  }
}
BENCHMARK(BM_HanningWindowInit);
static void BM_HanningWindowApply(benchmark::State& state) {
  const int n = 1024;
  HanningWindow w(n);
  float in[n];
  std::fill_n(in, n, 1.1);
  float out[n] {};
  for (auto _ : state) {
    w.apply(in, out);
    in[0] = out[0]; // prevents the call from being optimized away?
  }
}
BENCHMARK(BM_HanningWindowApply);
static void BM_RuntimeFFT1024(benchmark::State& state) {
  const int n = 1024;
  ffft::FFTReal<float> fft(n);
  float in[n];
  std::fill_n(in, n, 1.1);
  float out[n] {};
  for (auto _ : state) {
    fft.do_fft(out, in);
  }
}
BENCHMARK(BM_RuntimeFFT1024);
static void BM_CompileTimeFFT1024(benchmark::State& state) {
  FFT1024 fft;
  const int n = 1024;
  float in[n];
  std::fill_n(in, n, 1.1);
  float out[n] {};
  for (auto _ : state) {
    fft.do_fft(out, in);
  }
}
BENCHMARK(BM_CompileTimeFFT1024);
static void BM_RuntimeFFT4096(benchmark::State& state) {
  const int n = 4096;
  ffft::FFTReal<float> fft(n);
  float in[n];
  std::fill_n(in, n, 1.1);
  float out[n] {};
  for (auto _ : state) {
    fft.do_fft(out, in);
  }
}
BENCHMARK(BM_RuntimeFFT4096);
static void BM_CompileTimeFFT4096(benchmark::State& state) {
  FFT4096 fft;
  const int n = 4096;
  float in[n];
  std::fill_n(in, n, 1.1);
  float out[n] {};
  for (auto _ : state) {
    fft.do_fft(out, in);
  }
}
BENCHMARK(BM_CompileTimeFFT4096);
static void BM_SpectrumAnalyzerStep(benchmark::State& state) {
  SpectrumAnalyzer sa(
    SpectrumAnalyzer::SIZE_1024,
    SpectrumAnalyzer::OVERLAP_1,
    SpectrumAnalyzer::WINDOW_HANNING,
    44100.0
  );
  float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  int i = 0;
  for (auto _ : state) {
    sa.step(in[i]);
    ++i;
    i %= 8;
  }
}
BENCHMARK(BM_SpectrumAnalyzerStep);
static void BM_SpectrumAnalyzerProcess(benchmark::State& state) {
  SpectrumAnalyzer sa(
    SpectrumAnalyzer::SIZE_1024,
    SpectrumAnalyzer::OVERLAP_1,
    SpectrumAnalyzer::WINDOW_HANNING,
    44100.0
  );
  float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  for (int i = 0; i < 1024; ++i) {
    sa.step(in[i % 8]);
  }
  for (auto _ : state) {
    sa.process(sa._samples);
  }
}
BENCHMARK(BM_SpectrumAnalyzerProcess);
static void BM_SpectrumAnalyzerGetMagnitudes(benchmark::State& state) {
  SpectrumAnalyzer sa(
    SpectrumAnalyzer::SIZE_1024,
    SpectrumAnalyzer::OVERLAP_1,
    SpectrumAnalyzer::WINDOW_HANNING,
    44100.0
  );
  const int nBins = 256;
  float bins[nBins];
  float in[8] = { 0.0, 0.7, 1.0, 0.7, 0.0, -0.7, -1.0, -0.7 };
  for (int i = 0; i < 1024; ++i) {
    sa.step(in[i % 8]);
  }
  for (auto _ : state) {
    sa.getMagnitudes(bins, nBins);
  }
}
BENCHMARK(BM_SpectrumAnalyzerGetMagnitudes);
 |