void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept { const SpinLock::ScopedLockType sl (processLock); if (active) { const float c0 = coefficients.coefficients[0]; const float c1 = coefficients.coefficients[1]; const float c2 = coefficients.coefficients[2]; const float c3 = coefficients.coefficients[3]; const float c4 = coefficients.coefficients[4]; float lv1 = v1, lv2 = v2; for (int i = 0; i < numSamples; ++i) { const float in = samples[i]; const float out = c0 * in + lv1; samples[i] = out; lv1 = c1 * in - c3 * out + lv2; lv2 = c2 * in - c4 * out; } JUCE_SNAP_TO_ZERO (lv1); v1 = lv1; JUCE_SNAP_TO_ZERO (lv2); v2 = lv2; } }
void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept { const ScopedLock sl (processLock); if (active) { for (int i = 0; i < numSamples; ++i) { const float in = samples[i]; float out = coefficients[0] * in + coefficients[1] * x1 + coefficients[2] * x2 - coefficients[4] * y1 - coefficients[5] * y2; JUCE_SNAP_TO_ZERO (out); x2 = x1; x1 = in; y2 = y1; y1 = out; samples[i] = out; } } }
float IIRFilter::processSingleSampleRaw (const float in) noexcept { float out = coefficients.coefficients[0] * in + v1; JUCE_SNAP_TO_ZERO (out); v1 = coefficients.coefficients[1] * in - coefficients.coefficients[3] * out + v2; v2 = coefficients.coefficients[2] * in - coefficients.coefficients[4] * out; return out; }
float IIRFilter::processSingleSampleRaw (const float in) noexcept { float out = coefficients[0] * in + coefficients[1] * x1 + coefficients[2] * x2 - coefficients[4] * y1 - coefficients[5] * y2; JUCE_SNAP_TO_ZERO (out); x2 = x1; x1 = in; y2 = y1; y1 = out; return out; }
void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept { const ScopedLock sl (processLock); if (active) { for (int i = 0; i < numSamples; ++i) { const float in = samples[i]; float out = coefficients[0] * in + v1; JUCE_SNAP_TO_ZERO (out); v1 = coefficients[1] * in - coefficients[4] * out + v2; v2 = coefficients[2] * in - coefficients[5] * out; samples[i] = out; } } }
void SmoothIIRFilter::processSamples (float* const samples, const int numSamples) noexcept { const SpinLock::ScopedLockType sl (processLock); if (active) { if (!needInterpolation_) { const float c0 = coefficients.coefficients[0]; const float c1 = coefficients.coefficients[1]; const float c2 = coefficients.coefficients[2]; const float c3 = coefficients.coefficients[3]; const float c4 = coefficients.coefficients[4]; float lv1 = v1, lv2 = v2; for (int i = 0; i < numSamples; ++i) { const float in = samples[i]; const float out = c0 * in + lv1; samples[i] = out; lv1 = c1 * in - c3 * out + lv2; lv2 = c2 * in - c4 * out; } JUCE_SNAP_TO_ZERO (lv1); v1 = lv1; JUCE_SNAP_TO_ZERO (lv2); v2 = lv2; } else // do interpolation { const float d_c0 = dCoef_[0]; const float d_c1 = dCoef_[1]; const float d_c2 = dCoef_[2]; const float d_c3 = dCoef_[3]; const float d_c4 = dCoef_[4]; float *c0 = &coefficients_.coefficients[0]; float *c1 = &coefficients_.coefficients[1]; float *c2 = &coefficients_.coefficients[2]; float *c3 = &coefficients_.coefficients[3]; float *c4 = &coefficients_.coefficients[4]; float lv1 = v1, lv2 = v2; for (int i = 0; i < numSamples; ++i) { if (needInterpolation_) { (*c0) += d_c0; (*c1) += d_c1; (*c2) += d_c2; (*c3) += d_c3; (*c4) += d_c4; } const float in = samples[i]; const float out = (*c0) * in + lv1; samples[i] = out; lv1 = (*c1) * in - (*c3) * out + lv2; lv2 = (*c2) * in - (*c4) * out; if (++currentInterpolationSample_ >= numInterpolationSamples_) { coefficients_ = coefficients; needInterpolation_ = false; } } JUCE_SNAP_TO_ZERO (lv1); v1 = lv1; JUCE_SNAP_TO_ZERO (lv2); v2 = lv2; } } }