From e7b24dd7da9de84e218f7d7be623f0cf8b9d1b9c Mon Sep 17 00:00:00 2001 From: "N.N." Date: Mon, 17 Feb 2003 14:12:16 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r415, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/dfx/; revision=416 --- dfx-library/IIRfilter.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 dfx-library/IIRfilter.cpp (limited to 'dfx-library/IIRfilter.cpp') diff --git a/dfx-library/IIRfilter.cpp b/dfx-library/IIRfilter.cpp new file mode 100755 index 0000000..d78bf2f --- /dev/null +++ b/dfx-library/IIRfilter.cpp @@ -0,0 +1,61 @@ +#ifndef __IIRfilter +#include "IIRfilter.h" +#endif + +#include + + +//------------------------------------------------------------------------ +IIRfilter::IIRfilter() +{ + reset(); +} + +//------------------------------------------------------------------------ +IIRfilter::~IIRfilter() { } + +//------------------------------------------------------------------------ +void IIRfilter::calculateLowpassCoefficients(float cutoff, float samplerate) +{ + float twoPiFreqDivSR, cosTwoPiFreqDivSR, Q, slopeFactor, coeffScalar; + + Q = 0.5f; + twoPiFreqDivSR = 2.0f * PI * cutoff / samplerate; // ¹ ... 0 + cosTwoPiFreqDivSR = cosf(twoPiFreqDivSR); // 1 ... -1 + slopeFactor = sinf(twoPiFreqDivSR) / (Q * 2.0f); // 0 ... 1 ... 0 + coeffScalar = 1.0f / (1.0f + slopeFactor); // 1 ... 0.5 ... 1 + + // calculate filter coefficients + pInCoeff = (1.0f - cosTwoPiFreqDivSR) * coeffScalar; // 0 ... 2 + inCoeff = ppInCoeff = pInCoeff * 0.5f; // 0 ... 1 + pOutCoeff = (-2.0f * cosTwoPiFreqDivSR) * coeffScalar; // -2 ... 2 + ppOutCoeff = (1.0f - slopeFactor) * coeffScalar; // 1 ... 0 ... 1 +} + +//------------------------------------------------------------------------ +void IIRfilter::calculateHighpassCoefficients(float cutoff, float samplerate) +{ + float twoPiFreqDivSR, cosTwoPiFreqDivSR, Q, slopeFactor, coeffScalar; + + Q = 0.5f; + twoPiFreqDivSR = 2.0f * PI * cutoff / samplerate; // ¹ ... 0 + cosTwoPiFreqDivSR = cosf(twoPiFreqDivSR); // 1 ... -1 + slopeFactor = sinf(twoPiFreqDivSR) / (Q * 2.0f); // 0 ... 1 ... 0 + coeffScalar = 1.0f / (1.0f + slopeFactor); // 1 ... 0.5 ... 1 + + // calculate filter coefficients + pInCoeff = (-1.0f - cosTwoPiFreqDivSR) * coeffScalar; // 2 ... 0 + inCoeff = ppInCoeff = pInCoeff * (-0.5f); // -1 ... 0 + pOutCoeff = (-2.0f * cosTwoPiFreqDivSR) * coeffScalar; // -2 ... 2 + ppOutCoeff = (1.0f - slopeFactor) * coeffScalar; // 1 ... 0 ... 1 +} + +//------------------------------------------------------------------------ +void IIRfilter::copyCoefficients(IIRfilter *source) +{ + pOutCoeff = source->pOutCoeff; + ppOutCoeff = source->ppOutCoeff; + pInCoeff = source->pInCoeff; + ppInCoeff = source->ppInCoeff; + inCoeff = source->inCoeff; +} -- cgit v1.2.1