diff options
author | Damien Zammit <damien@zamaudio.com> | 2019-06-29 16:04:10 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2019-06-29 16:09:49 +1000 |
commit | e55da597442a617b7ac91d2a4f093d429d5762b6 (patch) | |
tree | eeaee122b14bcee91acd6ffbab95f9672bda179f | |
parent | 82b18110e5c625732c13500cf5fd2ba4a64a1d3f (diff) |
ZaMultiCompX2: 15% Speed up - remove averaging every cycle
-rw-r--r-- | plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp | 23 | ||||
-rw-r--r-- | plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp | 2 |
2 files changed, 9 insertions, 16 deletions
diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp index 6c54a8f..3c9b447 100644 --- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp +++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp @@ -894,22 +894,15 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo void ZaMultiCompX2Plugin::pushsample(float samples[], float sample, int k) { + float l1norm = 0.f; + + l1norm += fabsf(sample); ++pos[k]; if (pos[k] >= MAX_SAMPLES) pos[k] = 0; + l1norm -= fabsf(samples[pos[k]]); samples[pos[k]] = sample; -} - -float ZaMultiCompX2Plugin::averageabs(float samples[]) -{ - int i; - float average = 0.f; - - for (i = 0; i < MAX_SAMPLES; i++) { - average += fabsf(samples[i]); - } - average /= (float) MAX_SAMPLES; - return average; + average[k] += l1norm / (float) MAX_SAMPLES; } void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames) @@ -957,7 +950,7 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr run_lr4(3, fil2[1], &fil3[1], &fil4[1]); pushsample(outlevelold[0], std::max(fil1[0], fil1[1]), 0); - outlevel[0] = averageabs(outlevelold[0]); + outlevel[0] = average[0]; outlevel[0] = (outlevel[0] == 0.f) ? -45.0 : to_dB(outlevel[0]); if (tog1) run_comp(0, fil1[0], fil1[1], &outL[0], &outR[0]); @@ -966,7 +959,7 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr tmp1[1] = tog1 ? outR[0] * from_dB(makeup[0]) : fil1[1]; pushsample(outlevelold[1], std::max(fil3[0], fil3[1]), 1); - outlevel[1] = averageabs(outlevelold[1]); + outlevel[1] = average[1]; outlevel[1] = (outlevel[1] == 0.f) ? -45.0 : to_dB(outlevel[1]); if (tog2) run_comp(1, fil3[0], fil3[1], &outL[1], &outR[1]); @@ -975,7 +968,7 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr tmp2[1] = tog2 ? outR[1] * from_dB(makeup[1]) : fil3[1]; pushsample(outlevelold[2], std::max(fil4[0], fil4[1]), 2); - outlevel[2] = averageabs(outlevelold[2]); + outlevel[2] = average[2]; outlevel[2] = (outlevel[2] == 0.f) ? -45.0 : to_dB(outlevel[2]); if (tog3) run_comp(2, fil4[0], fil4[1], &outL[2], &outR[2]); diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp index 535a7ff..059180a 100644 --- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp +++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp @@ -171,7 +171,6 @@ Stereo version of ZaMultiComp, with individual threshold controls for each band void run(const float** inputs, float** outputs, uint32_t frames) override; void pushsample(float samples[], float sample, int k); - float averageabs(float samples[]); struct linear_svf { double k; @@ -192,6 +191,7 @@ private: float old_yl[2][MAX_COMP], old_y1[2][MAX_COMP], old_yg[2][MAX_COMP]; float old_ll[2], old_l1[2]; float outlevel[3]; + float average[3]; int pos[3]; float outlevelold[3][MAX_SAMPLES]; float oldxover1, oldxover2; |