Browse Source

Added notch and all pass filters

tags/2021-05-28
hogliux 9 years ago
parent
commit
285635cdf0
2 changed files with 107 additions and 31 deletions
  1. +87
    -29
      modules/juce_audio_basics/effects/juce_IIRFilter.cpp
  2. +20
    -2
      modules/juce_audio_basics/effects/juce_IIRFilter.h

+ 87
- 29
modules/juce_audio_basics/effects/juce_IIRFilter.cpp View File

@@ -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


+ 20
- 2
modules/juce_audio_basics/effects/juce_IIRFilter.h View File

@@ -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;


Loading…
Cancel
Save