diff options
author | Chris Robinson <chris.kcat@gmail.com> | 2020-05-08 01:24:14 -0700 |
---|---|---|
committer | Chris Robinson <chris.kcat@gmail.com> | 2020-05-08 01:24:14 -0700 |
commit | 301f8f5db5b9dd43ed2ef8c6628c2adf7ce4944c (patch) | |
tree | 14b7209959a579ceb1527d2a58355ab9a5e19636 /alc | |
parent | 0cfb8fee4488feedf915828cb442705ae2ba81a7 (diff) |
Use std::arrays for the UHJ filters
Diffstat (limited to 'alc')
-rw-r--r-- | alc/uhjfilter.cpp | 64 | ||||
-rw-r--r-- | alc/uhjfilter.h | 4 |
2 files changed, 24 insertions, 44 deletions
diff --git a/alc/uhjfilter.cpp b/alc/uhjfilter.cpp index 8870c421..13d44130 100644 --- a/alc/uhjfilter.cpp +++ b/alc/uhjfilter.cpp @@ -19,56 +19,34 @@ namespace { #define MAX_UPDATE_SAMPLES 128 -constexpr float Filter1CoeffSqr[4]{ +constexpr std::array<float,4> Filter1CoeffSqr{{ 0.479400865589f, 0.876218493539f, 0.976597589508f, 0.997499255936f -}; -constexpr float Filter2CoeffSqr[4]{ +}}; +constexpr std::array<float,4> Filter2CoeffSqr{{ 0.161758498368f, 0.733028932341f, 0.945349700329f, 0.990599156685f -}; +}}; -void allpass_process(AllPassState *state, float *dst, const float *src, const float *coeffs, - const size_t todo) +void allpass_process(al::span<AllPassState,4> state, float *dst, const float *src, + const std::array<float,4> &coeffs, const size_t todo) { - const float aa0{coeffs[0]}; - const float aa1{coeffs[1]}; - const float aa2{coeffs[2]}; - const float aa3{coeffs[3]}; - float z01{state[0].z[0]}; - float z02{state[0].z[1]}; - float z11{state[1].z[0]}; - float z12{state[1].z[1]}; - float z21{state[2].z[0]}; - float z22{state[2].z[1]}; - float z31{state[3].z[0]}; - float z32{state[3].z[1]}; - auto proc_sample = [aa0,aa1,aa2,aa3,&z01,&z02,&z11,&z12,&z21,&z22,&z31,&z32]( - float input) noexcept -> float + const std::array<float,4> aa{coeffs}; + std::array<std::array<float,2>,4> z{{state[0].z, state[1].z, state[2].z, state[3].z}}; + auto proc_sample = [aa,&z](float sample) noexcept -> float { - float output{input*aa0 + z01}; - z01 = z02; z02 = output*aa0 - input; - input = output; - - output = input*aa1 + z11; - z11 = z12; z12 = output*aa1 - input; - input = output; - - output = input*aa2 + z21; - z21 = z22; z22 = output*aa2 - input; - input = output; - - output = input*aa3 + z31; - z31 = z32; z32 = output*aa3 - input; - return output; + for(size_t i{0};i < 4;++i) + { + const float output{sample*aa[i] + z[i][0]}; + z[i][0] = z[i][1]; + z[i][1] = output*aa[i] - sample; + sample = output; + } + return sample; }; std::transform(src, src+todo, dst, proc_sample); - state[0].z[0] = z01; - state[0].z[1] = z02; - state[1].z[0] = z11; - state[1].z[1] = z12; - state[2].z[0] = z21; - state[2].z[1] = z22; - state[3].z[0] = z31; - state[3].z[1] = z32; + state[0].z = z[0]; + state[1].z = z[1]; + state[2].z = z[2]; + state[3].z = z[3]; } } // namespace diff --git a/alc/uhjfilter.h b/alc/uhjfilter.h index 09f577e4..0593cdb9 100644 --- a/alc/uhjfilter.h +++ b/alc/uhjfilter.h @@ -1,12 +1,14 @@ #ifndef UHJFILTER_H #define UHJFILTER_H +#include <array> + #include "alcmain.h" #include "almalloc.h" struct AllPassState { - float z[2]{0.0f, 0.0f}; + std::array<float,2> z{{0.0f, 0.0f}}; }; /* Encoding 2-channel UHJ from B-Format is done as: |