aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/filters
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/filters')
-rw-r--r--Alc/filters/splitter.cpp27
-rw-r--r--Alc/filters/splitter.h27
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];