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);