diff options
author | Chris Robinson <[email protected]> | 2018-12-04 20:35:23 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-12-04 20:35:23 -0800 |
commit | 2a30ae3807134be37cf79139e7e7943df5b1bf64 (patch) | |
tree | 777e5e002ae29781faf79adb26d951914c4acb72 /Alc/filters/splitter.cpp | |
parent | 3866c9f9414e91e760f397d0d01514a411c77bcd (diff) |
Avoid some more explicit loops in the filters
Diffstat (limited to 'Alc/filters/splitter.cpp')
-rw-r--r-- | Alc/filters/splitter.cpp | 66 |
1 files changed, 29 insertions, 37 deletions
diff --git a/Alc/filters/splitter.cpp b/Alc/filters/splitter.cpp index 6aed7493..570f5e2c 100644 --- a/Alc/filters/splitter.cpp +++ b/Alc/filters/splitter.cpp @@ -3,15 +3,18 @@ #include "splitter.h" +#include <cmath> +#include <algorithm> + #include "math_defs.h" void bandsplit_init(BandSplitter *splitter, ALfloat f0norm) { ALfloat w = f0norm * F_TAU; - ALfloat cw = cosf(w); + ALfloat cw = std::cos(w); if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; + splitter->coeff = (std::sin(w) - 1.0f) / cw; else splitter->coeff = cw * -0.5f; @@ -30,51 +33,46 @@ void bandsplit_clear(BandSplitter *splitter) void bandsplit_process(BandSplitter *splitter, ALfloat *RESTRICT hpout, ALfloat *RESTRICT lpout, const ALfloat *input, ALsizei count) { - ALfloat lp_coeff, hp_coeff, lp_y, hp_y, d; - ALfloat lp_z1, lp_z2, hp_z1; - ALsizei i; - ASSUME(count > 0); - hp_coeff = splitter->coeff; - lp_coeff = splitter->coeff*0.5f + 0.5f; - lp_z1 = splitter->lp_z1; - lp_z2 = splitter->lp_z2; - hp_z1 = splitter->hp_z1; - for(i = 0;i < count;i++) + const float ap_coeff{splitter->coeff}; + const float lp_coeff{splitter->coeff*0.5f + 0.5f}; + float lp_z1{splitter->lp_z1}; + float lp_z2{splitter->lp_z2}; + float ap_z1{splitter->hp_z1}; + auto proc_sample = [ap_coeff,lp_coeff,&lp_z1,&lp_z2,&ap_z1,&lpout](const float in) noexcept -> float { - ALfloat in = input[i]; - /* Low-pass sample processing. */ - d = (in - lp_z1) * lp_coeff; - lp_y = lp_z1 + d; + float d{(in - lp_z1) * lp_coeff}; + float lp_y{lp_z1 + d}; lp_z1 = lp_y + d; d = (lp_y - lp_z2) * lp_coeff; lp_y = lp_z2 + d; lp_z2 = lp_y + d; - lpout[i] = lp_y; + *(lpout++) = lp_y; /* All-pass sample processing. */ - hp_y = in*hp_coeff + hp_z1; - hp_z1 = in - hp_y*hp_coeff; + float ap_y{in*ap_coeff + ap_z1}; + ap_z1 = in - ap_y*ap_coeff; /* High-pass generated from removing low-passed output. */ - hpout[i] = hp_y - lp_y; - } + return ap_y - lp_y; + }; + std::transform<const float*RESTRICT>(input, input+count, hpout, proc_sample); splitter->lp_z1 = lp_z1; splitter->lp_z2 = lp_z2; - splitter->hp_z1 = hp_z1; + splitter->hp_z1 = ap_z1; } void splitterap_init(SplitterAllpass *splitter, ALfloat f0norm) { ALfloat w = f0norm * F_TAU; - ALfloat cw = cosf(w); + ALfloat cw = std::cos(w); if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; + splitter->coeff = (std::sin(w) - 1.0f) / cw; else splitter->coeff = cw * -0.5f; @@ -88,22 +86,16 @@ void splitterap_clear(SplitterAllpass *splitter) void splitterap_process(SplitterAllpass *splitter, ALfloat *RESTRICT samples, ALsizei count) { - ALfloat coeff, in, out; - ALfloat z1; - ALsizei i; - ASSUME(count > 0); - coeff = splitter->coeff; - z1 = splitter->z1; - for(i = 0;i < count;i++) + const float coeff{splitter->coeff}; + float z1{splitter->z1}; + auto proc_sample = [coeff,&z1](const float in) noexcept -> float { - in = samples[i]; - - out = in*coeff + z1; + float out{in*coeff + z1}; z1 = in - out*coeff; - - samples[i] = out; - } + return out; + }; + std::transform(samples, samples+count, samples, proc_sample); splitter->z1 = z1; } |