From 245345fba5f44b5c8562c826ca0053fa5bbd2ff3 Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Mon, 10 Dec 2012 16:58:47 +0000 Subject: Audaspace: Implemented forgotten Calculator classes from boost migration. --- intern/audaspace/CMakeLists.txt | 6 ++++ intern/audaspace/FX/AUD_BandpassCalculator.cpp | 5 +++ intern/audaspace/FX/AUD_BandpassCalculator.h | 10 ++++++ intern/audaspace/FX/AUD_ButterworthCalculator.cpp | 38 ++++++++++++++++++++++ intern/audaspace/FX/AUD_ButterworthCalculator.h | 20 ++++++++++++ intern/audaspace/FX/AUD_ButterworthFactory.cpp | 37 ++------------------- intern/audaspace/FX/AUD_ButterworthFactory.h | 9 ----- .../audaspace/FX/AUD_DynamicIIRFilterFactory.cpp | 6 ++-- intern/audaspace/FX/AUD_DynamicIIRFilterFactory.h | 3 +- intern/audaspace/FX/AUD_HighpassCalculator.cpp | 27 +++++++++++++++ intern/audaspace/FX/AUD_HighpassCalculator.h | 25 ++++++++++++++ intern/audaspace/FX/AUD_HighpassFactory.cpp | 26 ++------------- intern/audaspace/FX/AUD_HighpassFactory.h | 12 ------- .../audaspace/FX/AUD_IDynamicIIRFilterCalculator.h | 2 ++ intern/audaspace/FX/AUD_LowpassCalculator.cpp | 27 +++++++++++++++ intern/audaspace/FX/AUD_LowpassCalculator.h | 25 ++++++++++++++ intern/audaspace/FX/AUD_LowpassFactory.cpp | 27 ++------------- intern/audaspace/FX/AUD_LowpassFactory.h | 12 ------- 18 files changed, 197 insertions(+), 120 deletions(-) create mode 100644 intern/audaspace/FX/AUD_BandpassCalculator.cpp create mode 100644 intern/audaspace/FX/AUD_BandpassCalculator.h create mode 100644 intern/audaspace/FX/AUD_ButterworthCalculator.cpp create mode 100644 intern/audaspace/FX/AUD_ButterworthCalculator.h create mode 100644 intern/audaspace/FX/AUD_HighpassCalculator.cpp create mode 100644 intern/audaspace/FX/AUD_HighpassCalculator.h create mode 100644 intern/audaspace/FX/AUD_LowpassCalculator.cpp create mode 100644 intern/audaspace/FX/AUD_LowpassCalculator.h diff --git a/intern/audaspace/CMakeLists.txt b/intern/audaspace/CMakeLists.txt index 1617e520ac7..91b0549f742 100644 --- a/intern/audaspace/CMakeLists.txt +++ b/intern/audaspace/CMakeLists.txt @@ -34,6 +34,7 @@ set(INC_SYS set(SRC FX/AUD_AccumulatorFactory.cpp FX/AUD_BaseIIRFilterReader.cpp + FX/AUD_ButterworthCalculator.cpp FX/AUD_ButterworthFactory.cpp FX/AUD_CallbackIIRFilterReader.cpp FX/AUD_DelayFactory.cpp @@ -47,6 +48,7 @@ set(SRC FX/AUD_EnvelopeFactory.cpp FX/AUD_FaderFactory.cpp FX/AUD_FaderReader.cpp + FX/AUD_HighpassCalculator.cpp FX/AUD_HighpassFactory.cpp FX/AUD_IIRFilterFactory.cpp FX/AUD_IIRFilterReader.cpp @@ -54,6 +56,7 @@ set(SRC FX/AUD_LimiterReader.cpp FX/AUD_LoopFactory.cpp FX/AUD_LoopReader.cpp + FX/AUD_LowpassCalculator.cpp FX/AUD_LowpassFactory.cpp FX/AUD_PingPongFactory.cpp FX/AUD_PitchFactory.cpp @@ -145,6 +148,7 @@ set(SRC FX/AUD_AccumulatorFactory.h FX/AUD_BaseIIRFilterReader.h + FX/AUD_ButterworthCalculator.h FX/AUD_ButterworthFactory.h FX/AUD_CallbackIIRFilterReader.h FX/AUD_DelayFactory.h @@ -159,6 +163,7 @@ set(SRC FX/AUD_EnvelopeFactory.h FX/AUD_FaderFactory.h FX/AUD_FaderReader.h + FX/AUD_HighpassCalculator.h FX/AUD_HighpassFactory.h FX/AUD_IIRFilterFactory.h FX/AUD_IIRFilterReader.h @@ -166,6 +171,7 @@ set(SRC FX/AUD_LimiterReader.h FX/AUD_LoopFactory.h FX/AUD_LoopReader.h + FX/AUD_LowpassCalculator.h FX/AUD_LowpassFactory.h FX/AUD_PingPongFactory.h FX/AUD_PitchFactory.h diff --git a/intern/audaspace/FX/AUD_BandpassCalculator.cpp b/intern/audaspace/FX/AUD_BandpassCalculator.cpp new file mode 100644 index 00000000000..f5bbd63f81c --- /dev/null +++ b/intern/audaspace/FX/AUD_BandpassCalculator.cpp @@ -0,0 +1,5 @@ +#include "AUD_BandpassCalculator.h" + +AUD_BandpassCalculator::AUD_BandpassCalculator() +{ +} diff --git a/intern/audaspace/FX/AUD_BandpassCalculator.h b/intern/audaspace/FX/AUD_BandpassCalculator.h new file mode 100644 index 00000000000..b5b3cad17ca --- /dev/null +++ b/intern/audaspace/FX/AUD_BandpassCalculator.h @@ -0,0 +1,10 @@ +#ifndef AUD_BANDPASSCALCULATOR_H +#define AUD_BANDPASSCALCULATOR_H + +class AUD_BandpassCalculator +{ +public: + AUD_BandpassCalculator(); +}; + +#endif // AUD_BANDPASSCALCULATOR_H diff --git a/intern/audaspace/FX/AUD_ButterworthCalculator.cpp b/intern/audaspace/FX/AUD_ButterworthCalculator.cpp new file mode 100644 index 00000000000..7a3c6f71e15 --- /dev/null +++ b/intern/audaspace/FX/AUD_ButterworthCalculator.cpp @@ -0,0 +1,38 @@ +#include "AUD_ButterworthCalculator.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#define BWPB41 0.76536686473 +#define BWPB42 1.84775906502 + +AUD_ButterworthCalculator::AUD_ButterworthCalculator(float frequency) : + m_frequency(frequency) +{ +} + +void AUD_ButterworthCalculator::recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a) +{ + float omega = 2 * tan(m_frequency * M_PI / rate); + float o2 = omega * omega; + float o4 = o2 * o2; + float x1 = o2 + 2.0f * (float)BWPB41 * omega + 4.0f; + float x2 = o2 + 2.0f * (float)BWPB42 * omega + 4.0f; + float y1 = o2 - 2.0f * (float)BWPB41 * omega + 4.0f; + float y2 = o2 - 2.0f * (float)BWPB42 * omega + 4.0f; + float o228 = 2.0f * o2 - 8.0f; + float norm = x1 * x2; + a.push_back(1); + a.push_back((x1 + x2) * o228 / norm); + a.push_back((x1 * y2 + x2 * y1 + o228 * o228) / norm); + a.push_back((y1 + y2) * o228 / norm); + a.push_back(y1 * y2 / norm); + b.push_back(o4 / norm); + b.push_back(4 * o4 / norm); + b.push_back(6 * o4 / norm); + b.push_back(b[1]); + b.push_back(b[0]); +} diff --git a/intern/audaspace/FX/AUD_ButterworthCalculator.h b/intern/audaspace/FX/AUD_ButterworthCalculator.h new file mode 100644 index 00000000000..a7ae196afda --- /dev/null +++ b/intern/audaspace/FX/AUD_ButterworthCalculator.h @@ -0,0 +1,20 @@ +#ifndef AUD_BUTTERWORTHCALCULATOR_H +#define AUD_BUTTERWORTHCALCULATOR_H + +#include "AUD_IDynamicIIRFilterCalculator.h" + +class AUD_ButterworthCalculator : public AUD_IDynamicIIRFilterCalculator +{ +private: + /** + * The attack value in seconds. + */ + const float m_frequency; + +public: + AUD_ButterworthCalculator(float frequency); + + virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a); +}; + +#endif // AUD_BUTTERWORTHCALCULATOR_H diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.cpp b/intern/audaspace/FX/AUD_ButterworthFactory.cpp index 97d85c8122f..12c4306c2f7 100644 --- a/intern/audaspace/FX/AUD_ButterworthFactory.cpp +++ b/intern/audaspace/FX/AUD_ButterworthFactory.cpp @@ -29,44 +29,11 @@ #include "AUD_ButterworthFactory.h" #include "AUD_IIRFilterReader.h" - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#define BWPB41 0.76536686473 -#define BWPB42 1.84775906502 +#include "AUD_ButterworthCalculator.h" AUD_ButterworthFactory::AUD_ButterworthFactory(boost::shared_ptr factory, float frequency) : - AUD_DynamicIIRFilterFactory(factory), - m_frequency(frequency) + AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr(new AUD_ButterworthCalculator(frequency))) { } -void AUD_ButterworthFactory::recalculateCoefficients(AUD_SampleRate rate, - std::vector &b, - std::vector &a) -{ - float omega = 2 * tan(m_frequency * M_PI / rate); - float o2 = omega * omega; - float o4 = o2 * o2; - float x1 = o2 + 2.0f * (float)BWPB41 * omega + 4.0f; - float x2 = o2 + 2.0f * (float)BWPB42 * omega + 4.0f; - float y1 = o2 - 2.0f * (float)BWPB41 * omega + 4.0f; - float y2 = o2 - 2.0f * (float)BWPB42 * omega + 4.0f; - float o228 = 2.0f * o2 - 8.0f; - float norm = x1 * x2; - a.push_back(1); - a.push_back((x1 + x2) * o228 / norm); - a.push_back((x1 * y2 + x2 * y1 + o228 * o228) / norm); - a.push_back((y1 + y2) * o228 / norm); - a.push_back(y1 * y2 / norm); - b.push_back(o4 / norm); - b.push_back(4 * o4 / norm); - b.push_back(6 * o4 / norm); - b.push_back(b[1]); - b.push_back(b[0]); -} diff --git a/intern/audaspace/FX/AUD_ButterworthFactory.h b/intern/audaspace/FX/AUD_ButterworthFactory.h index e796f76aa29..3a86b14a7a6 100644 --- a/intern/audaspace/FX/AUD_ButterworthFactory.h +++ b/intern/audaspace/FX/AUD_ButterworthFactory.h @@ -38,11 +38,6 @@ class AUD_ButterworthFactory : public AUD_DynamicIIRFilterFactory { private: - /** - * The attack value in seconds. - */ - const float m_frequency; - // hide copy constructor and operator= AUD_ButterworthFactory(const AUD_ButterworthFactory&); AUD_ButterworthFactory& operator=(const AUD_ButterworthFactory&); @@ -54,10 +49,6 @@ public: * \param frequency The cutoff frequency. */ AUD_ButterworthFactory(boost::shared_ptr factory, float frequency); - - virtual void recalculateCoefficients(AUD_SampleRate rate, - std::vector& b, - std::vector& a); }; #endif //__AUD_BUTTERWORTHFACTORY_H__ diff --git a/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.cpp b/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.cpp index e8ea4323b2e..319a78cfedd 100644 --- a/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.cpp +++ b/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.cpp @@ -30,8 +30,10 @@ #include "AUD_DynamicIIRFilterReader.h" -AUD_DynamicIIRFilterFactory::AUD_DynamicIIRFilterFactory(boost::shared_ptr factory) : - AUD_EffectFactory(factory) +AUD_DynamicIIRFilterFactory::AUD_DynamicIIRFilterFactory(boost::shared_ptr factory, + boost::shared_ptr calculator) : + AUD_EffectFactory(factory), + m_calculator(calculator) { } diff --git a/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.h b/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.h index f36a37f44b4..aece7a8c2ef 100644 --- a/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.h +++ b/intern/audaspace/FX/AUD_DynamicIIRFilterFactory.h @@ -49,7 +49,8 @@ public: * Creates a new Dynmic IIR filter factory. * \param factory The input factory. */ - AUD_DynamicIIRFilterFactory(boost::shared_ptr factory); + AUD_DynamicIIRFilterFactory(boost::shared_ptr factory, + boost::shared_ptr calculator); virtual boost::shared_ptr createReader(); }; diff --git a/intern/audaspace/FX/AUD_HighpassCalculator.cpp b/intern/audaspace/FX/AUD_HighpassCalculator.cpp new file mode 100644 index 00000000000..573bba1c62b --- /dev/null +++ b/intern/audaspace/FX/AUD_HighpassCalculator.cpp @@ -0,0 +1,27 @@ +#include "AUD_HighpassCalculator.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +AUD_HighpassCalculator::AUD_HighpassCalculator(float frequency, float Q) : + m_frequency(frequency), + m_Q(Q) +{ +} + +void AUD_HighpassCalculator::recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a) +{ + float w0 = 2.0 * M_PI * (AUD_SampleRate)m_frequency / rate; + float alpha = (float)(sin(w0) / (2.0 * (double)m_Q)); + float norm = 1 + alpha; + float c = cos(w0); + a.push_back(1); + a.push_back(-2 * c / norm); + a.push_back((1 - alpha) / norm); + b.push_back((1 + c) / (2 * norm)); + b.push_back((-1 - c) / norm); + b.push_back(b[0]); +} diff --git a/intern/audaspace/FX/AUD_HighpassCalculator.h b/intern/audaspace/FX/AUD_HighpassCalculator.h new file mode 100644 index 00000000000..bad1c08f7c7 --- /dev/null +++ b/intern/audaspace/FX/AUD_HighpassCalculator.h @@ -0,0 +1,25 @@ +#ifndef AUD_HIGHPASSCALCULATOR_H +#define AUD_HIGHPASSCALCULATOR_H + +#include "AUD_IDynamicIIRFilterCalculator.h" + +class AUD_HighpassCalculator : public AUD_IDynamicIIRFilterCalculator +{ +private: + /** + * The cutoff frequency. + */ + const float m_frequency; + + /** + * The Q factor. + */ + const float m_Q; + +public: + AUD_HighpassCalculator(float frequency, float Q); + + virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a); +}; + +#endif // AUD_HIGHPASSCALCULATOR_H diff --git a/intern/audaspace/FX/AUD_HighpassFactory.cpp b/intern/audaspace/FX/AUD_HighpassFactory.cpp index ba5297d21ed..2456085a8a1 100644 --- a/intern/audaspace/FX/AUD_HighpassFactory.cpp +++ b/intern/audaspace/FX/AUD_HighpassFactory.cpp @@ -29,33 +29,11 @@ #include "AUD_HighpassFactory.h" #include "AUD_IIRFilterReader.h" - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif +#include "AUD_HighpassCalculator.h" AUD_HighpassFactory::AUD_HighpassFactory(boost::shared_ptr factory, float frequency, float Q) : - AUD_DynamicIIRFilterFactory(factory), - m_frequency(frequency), - m_Q(Q) + AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr(new AUD_HighpassCalculator(frequency, Q))) { } -void AUD_HighpassFactory::recalculateCoefficients(AUD_SampleRate rate, - std::vector &b, - std::vector &a) -{ - float w0 = 2.0 * M_PI * (AUD_SampleRate)m_frequency / rate; - float alpha = (float)(sin(w0) / (2.0 * (double)m_Q)); - float norm = 1 + alpha; - float c = cos(w0); - a.push_back(1); - a.push_back(-2 * c / norm); - a.push_back((1 - alpha) / norm); - b.push_back((1 + c) / (2 * norm)); - b.push_back((-1 - c) / norm); - b.push_back(b[0]); -} diff --git a/intern/audaspace/FX/AUD_HighpassFactory.h b/intern/audaspace/FX/AUD_HighpassFactory.h index ed7e9db44a4..56ced91c53c 100644 --- a/intern/audaspace/FX/AUD_HighpassFactory.h +++ b/intern/audaspace/FX/AUD_HighpassFactory.h @@ -38,16 +38,6 @@ class AUD_HighpassFactory : public AUD_DynamicIIRFilterFactory { private: - /** - * The cutoff frequency. - */ - const float m_frequency; - - /** - * The Q factor. - */ - const float m_Q; - // hide copy constructor and operator= AUD_HighpassFactory(const AUD_HighpassFactory&); AUD_HighpassFactory& operator=(const AUD_HighpassFactory&); @@ -60,8 +50,6 @@ public: * \param Q The Q factor. */ AUD_HighpassFactory(boost::shared_ptr factory, float frequency, float Q = 1.0f); - - virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a); }; #endif //__AUD_HIGHPASSFACTORY_H__ diff --git a/intern/audaspace/FX/AUD_IDynamicIIRFilterCalculator.h b/intern/audaspace/FX/AUD_IDynamicIIRFilterCalculator.h index 77d83360255..29b87e57ad0 100644 --- a/intern/audaspace/FX/AUD_IDynamicIIRFilterCalculator.h +++ b/intern/audaspace/FX/AUD_IDynamicIIRFilterCalculator.h @@ -29,6 +29,8 @@ #ifndef AUD_IDYNAMICIIRFILTERCALCULATOR_H #define AUD_IDYNAMICIIRFILTERCALCULATOR_H +#include "AUD_Space.h" + #include /** diff --git a/intern/audaspace/FX/AUD_LowpassCalculator.cpp b/intern/audaspace/FX/AUD_LowpassCalculator.cpp new file mode 100644 index 00000000000..57452f09038 --- /dev/null +++ b/intern/audaspace/FX/AUD_LowpassCalculator.cpp @@ -0,0 +1,27 @@ +#include "AUD_LowpassCalculator.h" + +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +AUD_LowpassCalculator::AUD_LowpassCalculator(float frequency, float Q) : + m_frequency(frequency), + m_Q(Q) +{ +} + +void AUD_LowpassCalculator::recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a) +{ + float w0 = 2 * M_PI * m_frequency / rate; + float alpha = sin(w0) / (2 * m_Q); + float norm = 1 + alpha; + float c = cos(w0); + a.push_back(1); + a.push_back(-2 * c / norm); + a.push_back((1 - alpha) / norm); + b.push_back((1 - c) / (2 * norm)); + b.push_back((1 - c) / norm); + b.push_back(b[0]); +} diff --git a/intern/audaspace/FX/AUD_LowpassCalculator.h b/intern/audaspace/FX/AUD_LowpassCalculator.h new file mode 100644 index 00000000000..18bb11feda7 --- /dev/null +++ b/intern/audaspace/FX/AUD_LowpassCalculator.h @@ -0,0 +1,25 @@ +#ifndef AUD_LOWPASSCALCULATOR_H +#define AUD_LOWPASSCALCULATOR_H + +#include "AUD_IDynamicIIRFilterCalculator.h" + +class AUD_LowpassCalculator : public AUD_IDynamicIIRFilterCalculator +{ +private: + /** + * The cutoff frequency. + */ + const float m_frequency; + + /** + * The Q factor. + */ + const float m_Q; + +public: + AUD_LowpassCalculator(float frequency, float Q); + + virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a); +}; + +#endif // AUD_LOWPASSCALCULATOR_H diff --git a/intern/audaspace/FX/AUD_LowpassFactory.cpp b/intern/audaspace/FX/AUD_LowpassFactory.cpp index e2faa241ac9..bd225998392 100644 --- a/intern/audaspace/FX/AUD_LowpassFactory.cpp +++ b/intern/audaspace/FX/AUD_LowpassFactory.cpp @@ -29,33 +29,10 @@ #include "AUD_LowpassFactory.h" #include "AUD_IIRFilterReader.h" - -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif +#include "AUD_LowpassCalculator.h" AUD_LowpassFactory::AUD_LowpassFactory(boost::shared_ptr factory, float frequency, float Q) : - AUD_DynamicIIRFilterFactory(factory), - m_frequency(frequency), - m_Q(Q) -{ -} - -void AUD_LowpassFactory::recalculateCoefficients(AUD_SampleRate rate, - std::vector &b, - std::vector &a) + AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr(new AUD_LowpassCalculator(frequency, Q))) { - float w0 = 2 * M_PI * m_frequency / rate; - float alpha = sin(w0) / (2 * m_Q); - float norm = 1 + alpha; - float c = cos(w0); - a.push_back(1); - a.push_back(-2 * c / norm); - a.push_back((1 - alpha) / norm); - b.push_back((1 - c) / (2 * norm)); - b.push_back((1 - c) / norm); - b.push_back(b[0]); } diff --git a/intern/audaspace/FX/AUD_LowpassFactory.h b/intern/audaspace/FX/AUD_LowpassFactory.h index fdbc6e5d91d..dfd8ab35521 100644 --- a/intern/audaspace/FX/AUD_LowpassFactory.h +++ b/intern/audaspace/FX/AUD_LowpassFactory.h @@ -38,16 +38,6 @@ class AUD_LowpassFactory : public AUD_DynamicIIRFilterFactory { private: - /** - * The cutoff frequency. - */ - const float m_frequency; - - /** - * The Q factor. - */ - const float m_Q; - // hide copy constructor and operator= AUD_LowpassFactory(const AUD_LowpassFactory&); AUD_LowpassFactory& operator=(const AUD_LowpassFactory&); @@ -60,8 +50,6 @@ public: * \param Q The Q factor. */ AUD_LowpassFactory(boost::shared_ptr factory, float frequency, float Q = 1.0f); - - virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector &b, std::vector &a); }; #endif //__AUD_LOWPASSFACTORY_H__ -- cgit v1.2.3