diff options
author | Chris Robinson <[email protected]> | 2019-06-04 17:50:36 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2019-06-04 17:50:36 -0700 |
commit | 9d861406c06d44f4b39e25f3a4deabdf11242ea1 (patch) | |
tree | b3c8328dface60cb14da460b211db146a88717f4 /Alc/filters | |
parent | 4522a51ea21813de9a59dd059c50f85d8a5116f1 (diff) |
Avoid a separate struct for the bandsplitter all-pass
Diffstat (limited to 'Alc/filters')
-rw-r--r-- | Alc/filters/splitter.cpp | 27 | ||||
-rw-r--r-- | Alc/filters/splitter.h | 27 |
2 files changed, 12 insertions, 42 deletions
diff --git a/Alc/filters/splitter.cpp b/Alc/filters/splitter.cpp index 8b1a4db4..09e7bfe8 100644 --- a/Alc/filters/splitter.cpp +++ b/Alc/filters/splitter.cpp @@ -94,30 +94,13 @@ void BandSplitterR<Real>::applyHfScale(Real *samples, const Real hfscale, const this->ap_z1 = ap_z1; } -template class BandSplitterR<float>; -template class BandSplitterR<double>; - - -template<typename Real> -void SplitterAllpassR<Real>::init(Real f0norm) -{ - const Real w{f0norm * al::MathDefs<Real>::Tau()}; - const Real cw{std::cos(w)}; - if(cw > std::numeric_limits<float>::epsilon()) - coeff = (std::sin(w) - 1.0f) / cw; - else - coeff = cw * -0.5f; - - z1 = 0.0f; -} - template<typename Real> -void SplitterAllpassR<Real>::process(Real *samples, int count) +void BandSplitterR<Real>::applyAllpass(Real *samples, const int count) const { ASSUME(count > 0); const Real coeff{this->coeff}; - Real z1{this->z1}; + Real z1{0.0f}; auto proc_sample = [coeff,&z1](const Real in) noexcept -> Real { const Real out{in*coeff + z1}; @@ -125,8 +108,8 @@ void SplitterAllpassR<Real>::process(Real *samples, int count) return out; }; std::transform(samples, samples+count, samples, proc_sample); - this->z1 = z1; } -template class SplitterAllpassR<float>; -template class SplitterAllpassR<double>; + +template class BandSplitterR<float>; +template class BandSplitterR<double>; diff --git a/Alc/filters/splitter.h b/Alc/filters/splitter.h index cd5fe864..70fddd9e 100644 --- a/Alc/filters/splitter.h +++ b/Alc/filters/splitter.h @@ -21,28 +21,16 @@ public: void init(Real f0norm); void clear() noexcept { lp_z1 = lp_z2 = ap_z1 = 0.0f; } void process(Real *hpout, Real *lpout, const Real *input, const int count); - void applyHfScale(Real *samples, const Real hfscale, const int count); -}; -using BandSplitter = BandSplitterR<float>; - -/* The all-pass portion of the band splitter. Applies the same phase shift - * without splitting the signal. - */ -template<typename Real> -class SplitterAllpassR { - Real coeff{0.0f}; - Real z1{0.0f}; -public: - SplitterAllpassR() = default; - SplitterAllpassR(const SplitterAllpassR&) = default; - SplitterAllpassR(Real f0norm) { init(f0norm); } + void applyHfScale(Real *samples, const Real hfscale, const int count); - void init(Real f0norm); - void clear() noexcept { z1 = 0.0f; } - void process(Real *samples, int count); + /* The all-pass portion of the band splitter. Applies the same phase shift + * without splitting the signal. Note that each use of this method is + * indepedent, it does not track history between calls. + */ + void applyAllpass(Real *samples, const int count) const; }; -using SplitterAllpass = SplitterAllpassR<float>; +using BandSplitter = BandSplitterR<float>; struct FrontStablizer { @@ -50,7 +38,6 @@ struct FrontStablizer { alignas(16) float DelayBuf[MAX_OUTPUT_CHANNELS][DelayLength]; - SplitterAllpass APFilter; BandSplitter LFilter, RFilter; alignas(16) float LSplit[2][BUFFERSIZE]; alignas(16) float RSplit[2][BUFFERSIZE]; |