BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

signal_benchmark.cpp (4042B)


      1 
      2 #include <vector>
      3 
      4 #include <benchmark/benchmark.h>
      5 
      6 #include "dsp/noise.hpp"
      7 #include "dsp/oscillator.hpp"
      8 #include "dsp/signal.hpp"
      9 
     10 using namespace bogaudio::dsp;
     11 
     12 static void BM_Signal_DecibelsToAmplitude(benchmark::State& state) {
     13 	std::vector<float> buf = { 10.0f, 6.0f, 3.0f, 0.0f, -3.0f, -6.0f, -10.0f, -30.0f, -60.0f };
     14 	int i = 0;
     15 	for (auto _ : state) {
     16 		i = ++i % buf.size();
     17 		benchmark::DoNotOptimize(decibelsToAmplitude(buf.at(i)));
     18 	}
     19 }
     20 BENCHMARK(BM_Signal_DecibelsToAmplitude);
     21 
     22 static void BM_Signal_AmplitudeToDecibels(benchmark::State& state) {
     23 	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 };
     24 	int i = 0;
     25 	for (auto _ : state) {
     26 		i = ++i % buf.size();
     27 		benchmark::DoNotOptimize(amplitudeToDecibels(buf.at(i)));
     28 	}
     29 }
     30 BENCHMARK(BM_Signal_AmplitudeToDecibels);
     31 
     32 static void BM_Signal_Amplifier(benchmark::State& state) {
     33 	WhiteNoiseGenerator r;
     34 	const int n = 256;
     35 	float samples[n];
     36 	for (int i = 0; i < n; ++i) {
     37 		samples[i] = r.next();
     38 	}
     39 	std::vector<float> decibels = { 10.0f, 6.0f, 3.0f, 0.0f, -3.0f, -6.0f, -10.0f, -30.0f, -60.0f };
     40 
     41 	Amplifier a;
     42 	int i = 0, j = 0;
     43 	for (auto _ : state) {
     44 		i = ++i % decibels.size();
     45 		j = ++j % n;
     46 		a.setLevel(decibels.at(i));
     47 		benchmark::DoNotOptimize(a.next(samples[j]));
     48 	}
     49 }
     50 BENCHMARK(BM_Signal_Amplifier);
     51 
     52 static void BM_Signal_SlewLimiter(benchmark::State& state) {
     53 	WhiteNoiseGenerator r;
     54 	const int n = 256;
     55 	float buf[n];
     56 	for (int i = 0; i < n; ++i) {
     57 		buf[i] = r.next();
     58 	}
     59 	SlewLimiter sl(44100.0, 1.0f);
     60 	int i = 0;
     61 	for (auto _ : state) {
     62 		i = ++i % n;
     63 		benchmark::DoNotOptimize(sl.next(buf[i]));
     64 	}
     65 }
     66 BENCHMARK(BM_Signal_SlewLimiter);
     67 
     68 static void BM_Signal_ShapedSlewLimiter(benchmark::State& state) {
     69 	WhiteNoiseGenerator r;
     70 	const int n = 256;
     71 	float buf[n];
     72 	for (int i = 0; i < n; ++i) {
     73 		buf[i] = r.next();
     74 	}
     75 	ShapedSlewLimiter sl(44100.0, 1.0f, 0.5f);
     76 	int i = 0;
     77 	for (auto _ : state) {
     78 		i = ++i % n;
     79 		benchmark::DoNotOptimize(sl.next(buf[i]));
     80 	}
     81 }
     82 BENCHMARK(BM_Signal_ShapedSlewLimiter);
     83 
     84 static void BM_Signal_Panner(benchmark::State& state) {
     85 	SineOscillator o(500.0, 100.0);
     86 	const int n = 256;
     87 	float buf[n];
     88 	for (int i = 0; i < n; ++i) {
     89 		buf[i] = o.next() * 5.0f;
     90 	}
     91 	Panner p;
     92 	int i = 0;
     93 	float l, r;
     94 	for (auto _ : state) {
     95 		i = ++i % n;
     96 		p.next(buf[i], l, r);
     97 	}
     98 }
     99 BENCHMARK(BM_Signal_Panner);
    100 
    101 static void BM_Signal_Panner_Modulating(benchmark::State& state) {
    102 	SineOscillator o(500.0, 100.0);
    103 	const int n = 256;
    104 	float buf[n];
    105 	for (int i = 0; i < n; ++i) {
    106 		buf[i] = o.next() * 5.0f;
    107 	}
    108 	std::minstd_rand g;
    109 	std::uniform_real_distribution<float> r(-1.0f, 1.0f);
    110 	Panner p;
    111 	int i = 0;
    112 	float l, rr;
    113 	for (auto _ : state) {
    114 		i = ++i % n;
    115 		p.setPan(r(g));
    116 		p.next(buf[i], l, rr);
    117 	}
    118 }
    119 BENCHMARK(BM_Signal_Panner_Modulating);
    120 
    121 static void BM_Signal_DelayLine(benchmark::State& state) {
    122 	SineOscillator o(500.0, 100.0);
    123 	const int n = 256;
    124 	float buf[n];
    125 	for (int i = 0; i < n; ++i) {
    126 		buf[i] = o.next() * 5.0f;
    127 	}
    128 	DelayLine dl(44100.0, 1000.0, 1.0);
    129 	int i = 0;
    130 	for (auto _ : state) {
    131 		i = ++i % n;
    132 		benchmark::DoNotOptimize(dl.next(buf[i]));
    133 	}
    134 }
    135 BENCHMARK(BM_Signal_DelayLine);
    136 
    137 static void BM_Signal_Saturator(benchmark::State& state) {
    138 	SineOscillator o(500.0, 100.0);
    139 	const int n = 256;
    140 	float buf[n];
    141 	for (int i = 0; i < n; ++i) {
    142 		buf[i] = o.next() * 20.0f;
    143 	}
    144 	Saturator s;
    145 	int i = 0;
    146 	for (auto _ : state) {
    147 		i = ++i % n;
    148 		benchmark::DoNotOptimize(s.next(buf[i]));
    149 	}
    150 }
    151 BENCHMARK(BM_Signal_Saturator);
    152 
    153 static void BM_Signal_CompressorSoftKnee(benchmark::State& state) {
    154 	int i = 0;
    155 	Compressor c;
    156 	for (auto _ : state) {
    157 		i = ++i % 15;
    158 		benchmark::DoNotOptimize(c.compressionDb((float)(i + 5), 10.0f, 2.0f, true));
    159 	}
    160 }
    161 BENCHMARK(BM_Signal_CompressorSoftKnee);
    162 
    163 static void BM_Signal_NoiseGateSoftKnee(benchmark::State& state) {
    164 	int i = 0;
    165 	NoiseGate ng;
    166 	for (auto _ : state) {
    167 		i = ++i % 15;
    168 		benchmark::DoNotOptimize(ng.compressionDb(0.0f - (float)(i * 3), 0.0f, 2.0f, true));
    169 	}
    170 }
    171 BENCHMARK(BM_Signal_NoiseGateSoftKnee);