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;
    }
}
Beispiel #2
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
        }
    }
}
Beispiel #6
0
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;
        }

    }
}