1 #ifndef INCLUDE_AL_CROSSOVER_HPP
2 #define INCLUDE_AL_CROSSOVER_HPP
51 #include "al/math/al_Constants.hpp"
66 Crossover(T f = (T)600, T fs = (T)44100.) {
72 void next(
const T in, T *lo, T *hi);
82 T mC0, mC1, mZ0, mZ1, mZ2;
86 double rad = M_PI * 2. * f / fs;
87 double cosine = cos(rad);
88 double sine = sin(rad);
89 if (abs(c) > 0.0001) {
90 mC0 = (sine - 1.) / cosine;
94 mC1 = (1. + mC0) * 0.5;
99 static const double denorm_offset = DBL_EPSILON * 2.;
101 const double v0 = in - mC0 * mZ0;
102 const double x0 = mZ0 + mC0 * v0;
104 const double v1 = mC1 * (in - mZ1);
105 const double x1 = v1 + mZ1;
107 const double v2 = mC1 * (x1 - mZ2);
108 const double x2 = v2 + mZ2;
110 mZ0 = v0 + denorm_offset;
111 mZ1 = v1 + x1 + denorm_offset;
112 mZ2 = v2 + x2 + denorm_offset;
119 float rad = M_PI * 2.f * f / fs;
120 float cosine = cosf(rad);
121 float sine = sinf(rad);
122 if (fabs(cosine) > 0.0001f) {
123 mC0 = (sine - 1.f) / cosine;
127 mC1 = (1.f + mC0) * 0.5f;
132 static const float denorm_offset = FLT_EPSILON * 2.;
134 const float v0 = in - mC0 * mZ0;
135 const float x0 = mZ0 + mC0 * v0;
137 const float v1 = mC1 * (in - mZ1);
138 const float x1 = v1 + mZ1;
140 const float v2 = mC1 * (x1 - mZ2);
141 const float x2 = v2 + mZ2;
143 mZ0 = v0 + denorm_offset;
144 mZ1 = v1 + x1 + denorm_offset;
145 mZ2 = v2 + x2 + denorm_offset;
void freq(T f, T fs)
set the cross-over middle frequency
void next(const T in, T *lo, T *hi)
process one sample and return hi/lo shelf