diff --git a/modules/juce_audio_basics/effects/juce_IIRFilter.cpp b/modules/juce_audio_basics/effects/juce_IIRFilter.cpp index fa63aa0606..15c644c216 100644 --- a/modules/juce_audio_basics/effects/juce_IIRFilter.cpp +++ b/modules/juce_audio_basics/effects/juce_IIRFilter.cpp @@ -62,15 +62,16 @@ IIRCoefficients::IIRCoefficients (double c1, double c2, double c3, IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, const double frequency) noexcept { - return makeLowPass(sampleRate, frequency, 1.0 / std::sqrt(2.0)); + return makeLowPass (sampleRate, frequency, 1.0 / std::sqrt (2.0)); } IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, const double frequency, const double Q) noexcept { - jassert(sampleRate > 0); - jassert(Q > 0); + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); const double nSquared = n * n; @@ -87,15 +88,16 @@ IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, const double frequency) noexcept { - return makeHighPass(sampleRate, frequency, 1.0 / std::sqrt(2.0)); + return makeHighPass (sampleRate, frequency, 1.0 / std::sqrt(2.0)); } IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, const double frequency, const double Q) noexcept { - jassert(sampleRate > 0); - jassert(Q > 0); + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); const double n = std::tan (double_Pi * frequency / sampleRate); const double nSquared = n * n; @@ -109,29 +111,82 @@ IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, c1 * (1.0 - 1.0 / Q * n + nSquared)); } -IIRCoefficients IIRCoefficients::makeBandPass(const double sampleRate, +IIRCoefficients IIRCoefficients::makeBandPass (const double sampleRate, + const double frequency) noexcept +{ + return makeBandPass (sampleRate, frequency, 1.0 / std::sqrt (2.0)); +} + +IIRCoefficients IIRCoefficients::makeBandPass (const double sampleRate, + const double frequency, + const double Q) noexcept +{ + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); + + const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); + const double nSquared = n * n; + const double c1 = 1.0 / (1.0 + 1.0 / Q * n + nSquared); + + return IIRCoefficients (c1 * n / Q, + 0.0, + -c1 * n / Q, + 1.0, + c1 * 2.0 * (1.0 - nSquared), + c1 * (1.0 - 1.0 / Q * n + nSquared)); +} + +IIRCoefficients IIRCoefficients::makeNotchFilter (const double sampleRate, + const double frequency) noexcept +{ + return makeNotchFilter (sampleRate, frequency, 1.0 / std::sqrt (2.0)); +} + +IIRCoefficients IIRCoefficients::makeNotchFilter (const double sampleRate, + const double frequency, + const double Q) noexcept +{ + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); + + const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); + const double nSquared = n * n; + const double c1 = 1.0 / (1.0 + n / Q + nSquared); + + return IIRCoefficients (c1 * (1.0 + nSquared), + 2.0 * c1 * (1.0 - nSquared), + c1 * (1.0 + nSquared), + 1.0, + c1 * 2.0 * (1.0 - nSquared), + c1 * (1.0 - n / Q + nSquared)); +} + +IIRCoefficients IIRCoefficients::makeAllPass (const double sampleRate, const double frequency) noexcept { - return makeBandPass(sampleRate, frequency, 1.0 / std::sqrt(2.0)); + return makeAllPass (sampleRate, frequency, 1.0 / std::sqrt (2.0)); } -IIRCoefficients IIRCoefficients::makeBandPass(const double sampleRate, +IIRCoefficients IIRCoefficients::makeAllPass (const double sampleRate, const double frequency, const double Q) noexcept { - jassert(sampleRate > 0); - jassert(Q > 0); + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); - const double n = 1.0 / std::tan(double_Pi * frequency / sampleRate); + const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); const double nSquared = n * n; const double c1 = 1.0 / (1.0 + 1.0 / Q * n + nSquared); - return IIRCoefficients(c1 * n / Q, - 0.0, - -c1 * n / Q, - 1.0, - c1 * 2.0 * (1.0 - nSquared), - c1 * (1.0 - 1.0 / Q * n + nSquared)); + return IIRCoefficients (c1 * (1.0 - n / Q + nSquared), + c1 * 2.0 * (1.0 - nSquared), + 1.0, + 1.0, + c1 * 2.0 * (1.0 - nSquared), + c1 * (1.0 - n / Q + nSquared)); } IIRCoefficients IIRCoefficients::makeLowShelf (const double sampleRate, @@ -139,8 +194,9 @@ IIRCoefficients IIRCoefficients::makeLowShelf (const double sampleRate, const double Q, const float gainFactor) noexcept { - jassert (sampleRate > 0); - jassert (Q > 0); + jassert (sampleRate > 0.0); + jassert (cutOffFrequency > 0.0 && cutOffFrequency <= sampleRate * 0.5); + jassert (Q > 0.0); const double A = jmax (0.0f, std::sqrt (gainFactor)); const double aminus1 = A - 1.0; @@ -163,8 +219,9 @@ IIRCoefficients IIRCoefficients::makeHighShelf (const double sampleRate, const double Q, const float gainFactor) noexcept { - jassert (sampleRate > 0); - jassert (Q > 0); + jassert (sampleRate > 0.0); + jassert (cutOffFrequency > 0.0 && cutOffFrequency <= sampleRate * 0.5); + jassert (Q > 0.0); const double A = jmax (0.0f, std::sqrt (gainFactor)); const double aminus1 = A - 1.0; @@ -183,15 +240,16 @@ IIRCoefficients IIRCoefficients::makeHighShelf (const double sampleRate, } IIRCoefficients IIRCoefficients::makePeakFilter (const double sampleRate, - const double centreFrequency, + const double frequency, const double Q, const float gainFactor) noexcept { - jassert (sampleRate > 0); - jassert (Q > 0); + jassert (sampleRate > 0.0); + jassert (frequency > 0.0 && frequency <= sampleRate * 0.5); + jassert (Q > 0.0); const double A = jmax (0.0f, std::sqrt (gainFactor)); - const double omega = (double_Pi * 2.0 * jmax (centreFrequency, 2.0)) / sampleRate; + const double omega = (double_Pi * 2.0 * jmax (frequency, 2.0)) / sampleRate; const double alpha = 0.5 * std::sin (omega) / Q; const double c2 = -2.0 * std::cos (omega); const double alphaTimesA = alpha * A; @@ -207,12 +265,12 @@ IIRCoefficients IIRCoefficients::makePeakFilter (const double sampleRate, //============================================================================== IIRFilter::IIRFilter() noexcept - : v1 (0), v2 (0), active (false) + : v1 (0.0), v2 (0.0), active (false) { } IIRFilter::IIRFilter (const IIRFilter& other) noexcept - : v1 (0), v2 (0), active (other.active) + : v1 (0.0), v2 (0.0), active (other.active) { const SpinLock::ScopedLockType sl (other.processLock); coefficients = other.coefficients; @@ -241,7 +299,7 @@ void IIRFilter::setCoefficients (const IIRCoefficients& newCoefficients) noexcep void IIRFilter::reset() noexcept { const SpinLock::ScopedLockType sl (processLock); - v1 = v2 = 0; + v1 = v2 = 0.0; } float IIRFilter::processSingleSampleRaw (const float in) noexcept diff --git a/modules/juce_audio_basics/effects/juce_IIRFilter.h b/modules/juce_audio_basics/effects/juce_IIRFilter.h index c3f2910ab9..a715066736 100644 --- a/modules/juce_audio_basics/effects/juce_IIRFilter.h +++ b/modules/juce_audio_basics/effects/juce_IIRFilter.h @@ -77,10 +77,28 @@ public: //============================================================================== /** Returns the coefficients for a band-pass filter. */ - static IIRCoefficients makeBandPass(double sampleRate, double frequency) noexcept; + static IIRCoefficients makeBandPass (double sampleRate, double frequency) noexcept; /** Returns the coefficients for a band-pass filter with variable Q. */ - static IIRCoefficients makeBandPass(double sampleRate, + static IIRCoefficients makeBandPass (double sampleRate, + double frequency, + double Q) noexcept; + + //============================================================================== + /** Returns the coefficients for a notch filter. */ + static IIRCoefficients makeNotchFilter (double sampleRate, double frequency) noexcept; + + /** Returns the coefficients for a notch filter with variable Q. */ + static IIRCoefficients makeNotchFilter (double sampleRate, + double frequency, + double Q) noexcept; + + //============================================================================== + /** Returns the coefficients for an all-pass filter. */ + static IIRCoefficients makeAllPass (double sampleRate, double frequency) noexcept; + + /** Returns the coefficients for an all-pass filter with variable Q. */ + static IIRCoefficients makeAllPass (double sampleRate, double frequency, double Q) noexcept;