Audaspace:

Implemented forgotten Calculator classes from boost migration.
This commit is contained in:
Joerg Mueller 2012-12-10 16:58:47 +00:00
parent e1100cb655
commit 245345fba5
18 changed files with 197 additions and 120 deletions

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

@ -0,0 +1,5 @@
#include "AUD_BandpassCalculator.h"
AUD_BandpassCalculator::AUD_BandpassCalculator()
{
}

@ -0,0 +1,10 @@
#ifndef AUD_BANDPASSCALCULATOR_H
#define AUD_BANDPASSCALCULATOR_H
class AUD_BandpassCalculator
{
public:
AUD_BandpassCalculator();
};
#endif // AUD_BANDPASSCALCULATOR_H

@ -0,0 +1,38 @@
#include "AUD_ButterworthCalculator.h"
#include <cmath>
#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<float> &b, std::vector<float> &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]);
}

@ -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<float> &b, std::vector<float> &a);
};
#endif // AUD_BUTTERWORTHCALCULATOR_H

@ -29,44 +29,11 @@
#include "AUD_ButterworthFactory.h"
#include "AUD_IIRFilterReader.h"
#include <cmath>
#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<AUD_IFactory> factory,
float frequency) :
AUD_DynamicIIRFilterFactory(factory),
m_frequency(frequency)
AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr<AUD_IDynamicIIRFilterCalculator>(new AUD_ButterworthCalculator(frequency)))
{
}
void AUD_ButterworthFactory::recalculateCoefficients(AUD_SampleRate rate,
std::vector<float> &b,
std::vector<float> &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]);
}

@ -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<AUD_IFactory> factory, float frequency);
virtual void recalculateCoefficients(AUD_SampleRate rate,
std::vector<float>& b,
std::vector<float>& a);
};
#endif //__AUD_BUTTERWORTHFACTORY_H__

@ -30,8 +30,10 @@
#include "AUD_DynamicIIRFilterReader.h"
AUD_DynamicIIRFilterFactory::AUD_DynamicIIRFilterFactory(boost::shared_ptr<AUD_IFactory> factory) :
AUD_EffectFactory(factory)
AUD_DynamicIIRFilterFactory::AUD_DynamicIIRFilterFactory(boost::shared_ptr<AUD_IFactory> factory,
boost::shared_ptr<AUD_IDynamicIIRFilterCalculator> calculator) :
AUD_EffectFactory(factory),
m_calculator(calculator)
{
}

@ -49,7 +49,8 @@ public:
* Creates a new Dynmic IIR filter factory.
* \param factory The input factory.
*/
AUD_DynamicIIRFilterFactory(boost::shared_ptr<AUD_IFactory> factory);
AUD_DynamicIIRFilterFactory(boost::shared_ptr<AUD_IFactory> factory,
boost::shared_ptr<AUD_IDynamicIIRFilterCalculator> calculator);
virtual boost::shared_ptr<AUD_IReader> createReader();
};

@ -0,0 +1,27 @@
#include "AUD_HighpassCalculator.h"
#include <cmath>
#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<float> &b, std::vector<float> &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]);
}

@ -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<float> &b, std::vector<float> &a);
};
#endif // AUD_HIGHPASSCALCULATOR_H

@ -29,33 +29,11 @@
#include "AUD_HighpassFactory.h"
#include "AUD_IIRFilterReader.h"
#include <cmath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include "AUD_HighpassCalculator.h"
AUD_HighpassFactory::AUD_HighpassFactory(boost::shared_ptr<AUD_IFactory> factory, float frequency,
float Q) :
AUD_DynamicIIRFilterFactory(factory),
m_frequency(frequency),
m_Q(Q)
AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr<AUD_IDynamicIIRFilterCalculator>(new AUD_HighpassCalculator(frequency, Q)))
{
}
void AUD_HighpassFactory::recalculateCoefficients(AUD_SampleRate rate,
std::vector<float> &b,
std::vector<float> &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]);
}

@ -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<AUD_IFactory> factory, float frequency, float Q = 1.0f);
virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector<float> &b, std::vector<float> &a);
};
#endif //__AUD_HIGHPASSFACTORY_H__

@ -29,6 +29,8 @@
#ifndef AUD_IDYNAMICIIRFILTERCALCULATOR_H
#define AUD_IDYNAMICIIRFILTERCALCULATOR_H
#include "AUD_Space.h"
#include <vector>
/**

@ -0,0 +1,27 @@
#include "AUD_LowpassCalculator.h"
#include <cmath>
#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<float> &b, std::vector<float> &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]);
}

@ -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<float> &b, std::vector<float> &a);
};
#endif // AUD_LOWPASSCALCULATOR_H

@ -29,33 +29,10 @@
#include "AUD_LowpassFactory.h"
#include "AUD_IIRFilterReader.h"
#include <cmath>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include "AUD_LowpassCalculator.h"
AUD_LowpassFactory::AUD_LowpassFactory(boost::shared_ptr<AUD_IFactory> factory, float frequency,
float Q) :
AUD_DynamicIIRFilterFactory(factory),
m_frequency(frequency),
m_Q(Q)
AUD_DynamicIIRFilterFactory(factory, boost::shared_ptr<AUD_IDynamicIIRFilterCalculator>(new AUD_LowpassCalculator(frequency, Q)))
{
}
void AUD_LowpassFactory::recalculateCoefficients(AUD_SampleRate rate,
std::vector<float> &b,
std::vector<float> &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]);
}

@ -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<AUD_IFactory> factory, float frequency, float Q = 1.0f);
virtual void recalculateCoefficients(AUD_SampleRate rate, std::vector<float> &b, std::vector<float> &a);
};
#endif //__AUD_LOWPASSFACTORY_H__