summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-30 12:13:38 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-30 12:13:38 +1000
commit67e7d886d28890071ca1dbba440c3dd239140b0e (patch)
treee617a733383103bfa5c7171f6723835b71f707c3
parent5dc6f88dfcac4b27ce15c42f107fb20b726454af (diff)
Use LPF instead of accumulating errors
-rw-r--r--plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp30
-rw-r--r--plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp2
2 files changed, 11 insertions, 21 deletions
diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
index d752e46..d2d1053 100644
--- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
+++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp
@@ -892,22 +892,12 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo
old_yg[1][k] = Ryg;
}
-void ZaMultiCompX2Plugin::pushsample(float samples[], float sample, int k)
+void ZaMultiCompX2Plugin::pushsample(float sample, int k)
{
- int idx0, idx1, idx2;
+ const float rate = 2. * M_PI * 5.;
+ float lpf = rate / (rate + getSampleRate());
- idx1 = pos[k];
- ++pos[k];
- if (pos[k] >= MAX_SAMPLES) {
- pos[k] = 0;
- }
- idx2 = pos[k];
- idx0 = pos[k] + 1;
- if (idx0 >= MAX_SAMPLES) {
- idx0 = 0;
- }
- samples[idx2] = samples[idx1] + fabsf(sample);
- average[k] = ( samples[idx2] - samples[idx0] ) / (float) MAX_SAMPLES;
+ average[k] += lpf * (sample*sample - average[k]);
}
void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames)
@@ -954,8 +944,8 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr
run_lr4(2, fil2[0], &fil3[0], &fil4[0]);
run_lr4(3, fil2[1], &fil3[1], &fil4[1]);
- pushsample(outlevelold[0], std::max(fil1[0], fil1[1]), 0);
- outlevel[0] = average[0];
+ pushsample(std::max(fil1[0], fil1[1]), 0);
+ outlevel[0] = sqrt(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]);
@@ -963,8 +953,8 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr
tmp1[0] = tog1 ? outL[0] * from_dB(makeup[0]) : fil1[0];
tmp1[1] = tog1 ? outR[0] * from_dB(makeup[0]) : fil1[1];
- pushsample(outlevelold[1], std::max(fil3[0], fil3[1]), 1);
- outlevel[1] = average[1];
+ pushsample(std::max(fil3[0], fil3[1]), 1);
+ outlevel[1] = sqrt(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]);
@@ -972,8 +962,8 @@ void ZaMultiCompX2Plugin::run(const float** inputs, float** outputs, uint32_t fr
tmp2[0] = tog2 ? outL[1] * from_dB(makeup[1]) : fil3[0];
tmp2[1] = tog2 ? outR[1] * from_dB(makeup[1]) : fil3[1];
- pushsample(outlevelold[2], std::max(fil4[0], fil4[1]), 2);
- outlevel[2] = average[2];
+ pushsample(std::max(fil4[0], fil4[1]), 2);
+ outlevel[2] = sqrt(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 58b323d..0993811 100644
--- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp
+++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.hpp
@@ -170,7 +170,7 @@ Stereo version of ZaMultiComp, with individual threshold controls for each band
void activate() override;
void run(const float** inputs, float** outputs, uint32_t frames) override;
- void pushsample(float samples[], float sample, int k);
+ void pushsample(float sample, int k);
struct linear_svf {
double k;