#include "Globals.h" #include #include "gsl/gsl-lite.hpp" template class OnePoleFilter { public: OnePoleFilter() = default; // Normalized cutoff with respect to the sampling rate template static Type normalizedGain(Type cutoff, C sampleRate) { return std::tan( cutoff / static_cast(sampleRate) * M_PIf32 ); } OnePoleFilter(Type gain) { setGain(gain); } void setGain(Type gain) { this->gain = gain; G = gain / ( 1 + gain); } Type getGain() const { return gain; } int processLowpass(gsl::span input, gsl::span lowpass) { for (auto [in, out] = std::pair(input.begin(), lowpass.begin()); in < input.end() && out < lowpass.end(); in++, out++) { oneLowpass(in, out); } return std::min(input.size(), lowpass.size()); } int processHighpass(gsl::span input, gsl::span highpass) { for (auto [in, out] = std::pair(input.begin(), highpass.begin()); in < input.end() && out < highpass.end(); in++, out++) { oneHighpass(in, out); } return std::min(input.size(), highpass.size()); } int processLowpassVariableGain(gsl::span input, gsl::span lowpass, gsl::span gain) { for (auto [in, out, g] = std::tuple(input.begin(), lowpass.begin(), gain.begin()); in < input.end() && out < lowpass.end() && g < gain.end(); in++, out++, g++) { setGain(*g); oneLowpass(in, out); } return std::min({ input.size(), lowpass.size(), gain.size() }); } int processHighpassVariableGain(gsl::span input, gsl::span highpass, gsl::span gain) { for (auto [in, out, g] = std::tuple(input.begin(), highpass.begin(), gain.begin()); in < input.end() && out < highpass.end() && g < gain.end(); in++, out++, g++) { setGain(*g); oneHighpass(in, out); } return std::min({ input.size(), highpass.size(), gain.size() }); } void reset() { state = 0.0; } private: Type state { 0.0 }; Type gain { 0.25 }; Type intermediate { 0.0 }; Type G { gain / (1 + gain) }; inline void oneLowpass(const Type* in, Type* out) { intermediate = G * (*in - state); *out = intermediate + state; state = *out + intermediate; } inline void oneHighpass(const Type* in, Type* out) { intermediate = G * (*in - state); *out = *in - intermediate - state; state += 2*intermediate; } };