summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-29 16:04:10 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-29 16:09:49 +1000
commite55da597442a617b7ac91d2a4f093d429d5762b6 (patch)
treeeeaee122b14bcee91acd6ffbab95f9672bda179f
parent82b18110e5c625732c13500cf5fd2ba4a64a1d3f (diff)
ZaMultiCompX2: 15% Speed up - remove averaging every cycle
-rw-r--r--plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp23
-rw-r--r--plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp2
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;