#ifndef FILTER_SPLITTER_H #define FILTER_SPLITTER_H #include "alMain.h" #include "almalloc.h" /* Band splitter. Splits a signal into two phase-matching frequency bands. */ template class BandSplitterR { Real coeff{0.0f}; Real lp_z1{0.0f}; Real lp_z2{0.0f}; Real ap_z1{0.0f}; public: BandSplitterR() = default; BandSplitterR(const BandSplitterR&) = default; BandSplitterR(Real f0norm) { init(f0norm); } 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; /* The all-pass portion of the band splitter. Applies the same phase shift * without splitting the signal. */ template class SplitterAllpassR { Real coeff{0.0f}; Real z1{0.0f}; public: SplitterAllpassR() = default; SplitterAllpassR(const SplitterAllpassR&) = default; SplitterAllpassR(Real f0norm) { init(f0norm); } void init(Real f0norm); void clear() noexcept { z1 = 0.0f; } void process(Real *samples, int count); }; using SplitterAllpass = SplitterAllpassR; struct FrontStablizer { static constexpr size_t DelayLength{256u}; 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]; alignas(16) float TempBuf[BUFFERSIZE + DelayLength]; DEF_NEWDEL(FrontStablizer) }; #endif /* FILTER_SPLITTER_H */