12 using namespace swift::config;
14 namespace swift::sound::dsp
16 float BiQuadFilter::transform(
float inSample)
19 double result = m_a0 * inSample + m_a1 * m_x1 + m_a2 * m_x2 - m_a3 * m_y1 - m_a4 * m_y2;
27 m_y1 =
static_cast<float>(result);
32 void BiQuadFilter::setCoefficients(
double aa0,
double aa1,
double aa2,
double b0,
double b1,
double b2)
34 if (CBuildConfig::isLocalDeveloperDebugBuild()) {
SWIFT_VERIFY_X(qAbs(aa0) > 1E-06, Q_FUNC_INFO,
"Div by zero?"); }
44 void BiQuadFilter::setLowPassFilter(
float sampleRate,
float cutoffFrequency,
float q)
47 auto w0 = 2 * M_PI * cutoffFrequency / sampleRate;
48 auto cosw0 = qCos(w0);
49 auto alpha = qSin(w0) / (2 * q);
51 auto b0 = (1 - cosw0) / 2;
53 auto b2 = (1 - cosw0) / 2;
55 auto aa1 = -2 * cosw0;
57 setCoefficients(aa0, aa1, aa2, b0, b1, b2);
60 void BiQuadFilter::setPeakingEq(
float sampleRate,
float centreFrequency,
float q,
float dbGain)
63 auto w0 = 2 * M_PI * centreFrequency / sampleRate;
64 auto cosw0 = qCos(w0);
65 auto sinw0 = qSin(w0);
66 auto alpha = sinw0 / (2 * q);
67 auto a = qPow(10, dbGain / 40);
69 auto b0 = 1 + alpha * a;
71 auto b2 = 1 - alpha * a;
72 auto aa0 = 1 + alpha / a;
73 auto aa1 = -2 * cosw0;
74 auto aa2 = 1 - alpha / a;
75 setCoefficients(aa0, aa1, aa2, b0, b1, b2);
78 void BiQuadFilter::setHighPassFilter(
float sampleRate,
float cutoffFrequency,
float q)
81 auto w0 = 2 * M_PI * cutoffFrequency / sampleRate;
82 auto cosw0 = qCos(w0);
83 auto alpha = qSin(w0) / (2 * q);
85 auto b0 = (1 + cosw0) / 2;
86 auto b1 = -(1 + cosw0);
87 auto b2 = (1 + cosw0) / 2;
89 auto aa1 = -2 * cosw0;
91 setCoefficients(aa0, aa1, aa2, b0, b1, b2);
94 BiQuadFilter BiQuadFilter::lowPassFilter(
float sampleRate,
float cutoffFrequency,
float q)
97 filter.setLowPassFilter(sampleRate, cutoffFrequency, q);
101 BiQuadFilter BiQuadFilter::highPassFilter(
float sampleRate,
float cutoffFrequency,
float q)
104 filter.setHighPassFilter(sampleRate, cutoffFrequency, q);
108 BiQuadFilter BiQuadFilter::peakingEQ(
float sampleRate,
float centreFrequency,
float q,
float dbGain)
111 filter.setPeakingEq(sampleRate, centreFrequency, q, dbGain);
Free functions in swift::misc.
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.