善始善终,给出巴特沃斯IIR滤波响应特性的头(部分)。注意有两个命名空间。
namespace Butterworth {
class AnalogLowPass : public LayoutBase
{
public:
AnalogLowPass ();
void design (const int numPoles);
private:
int m_numPoles;
};
class AnalogLowShelf : public LayoutBase
{
public:
AnalogLowShelf ();
void design (int numPoles, double gainDb);
private:
int m_numPoles;
double m_gainDb;
};
// 有针对性的(减少)类模板的实例化……
struct LowPassBase : PoleFilterBase <AnalogLowPass>
{
void setup (int order,
double sampleRate,
double cutoffFrequency);
};
struct HighPassBase : PoleFilterBase <AnalogLowPass>
{
void setup (int order,
double sampleRate,
double cutoffFrequency);
};
struct BandPassBase : PoleFilterBase <AnalogLowPass>
{
void setup (int order,
double sampleRate,
double centerFrequency,
double widthFrequency);
};
struct BandStopBase : PoleFilterBase <AnalogLowPass>
{
void setup (int order,
double sampleRate,
double centerFrequency,
double widthFrequency);
};
struct LowShelfBase : PoleFilterBase <AnalogLowShelf>
{
void setup (int order,
double sampleRate,
double cutoffFrequency,
double gainDb);
};
struct HighShelfBase : PoleFilterBase <AnalogLowShelf>
{
void setup (int order,
double sampleRate,
double cutoffFrequency,
double gainDb);
};
struct BandShelfBase : PoleFilterBase <AnalogLowShelf>
{
void setup (int order,
double sampleRate,
double centerFrequency,
double widthFrequency,
double gainDb);
};
// Raw滤波 -- 类模板
template <int MaxOrder>
struct LowPass : PoleFilter <LowPassBase, MaxOrder>
{
};
template <int MaxOrder>
struct HighPass : PoleFilter <HighPassBase, MaxOrder>
{
};
template <int MaxOrder>
struct BandPass : PoleFilter <BandPassBase, MaxOrder, MaxOrder*2>
{
};
template <int MaxOrder>
struct BandStop : PoleFilter <BandStopBase, MaxOrder, MaxOrder*2>
{
};
template <int MaxOrder>
struct LowShelf : PoleFilter <LowShelfBase, MaxOrder>
{
};
template <int MaxOrder>
struct HighShelf : PoleFilter <HighShelfBase, MaxOrder>
{
};
template <int MaxOrder>
struct BandShelf : PoleFilter <BandShelfBase, MaxOrder, MaxOrder*2>
{
};
// 第二个命名空间
namespace Design {
template <class FilterClass>
struct TypeI : DesignBase, FilterClass
{
TypeI ()
{
addBuiltinParamInfo (idOrder);
addBuiltinParamInfo (idFrequency);
}
void setParams (const Params& params)
{
FilterClass::setup (int(params[1]),
params[0],
params[2]);
}
};
template <class FilterClass>
struct TypeII : DesignBase, FilterClass
{
TypeII ()
{
addBuiltinParamInfo (idOrder);
addBuiltinParamInfo (idFrequency);
addBuiltinParamInfo (idGain);
}
void setParams (const Params& params)
{
FilterClass::setup (int(params[1]),
params[0],
params[2],
params[3]);
}
};
template <class FilterClass>
struct TypeIII : DesignBase, FilterClass
{
TypeIII ()
{
addBuiltinParamInfo (idOrder);
addBuiltinParamInfo (idFrequency);
addBuiltinParamInfo (idBandwidthHz);
}
void setParams (const Params& params)
{
FilterClass::setup (int(params[1]),
params[0],
params[2],
params[3]);
}
};
template <class FilterClass>
struct TypeIV : DesignBase, FilterClass
{
TypeIV ()
{
addBuiltinParamInfo (idOrder);
addBuiltinParamInfo (idFrequency);
addBuiltinParamInfo (idBandwidthHz);
addBuiltinParamInfo (idGain);
}
void setParams (const Params& params)
{
FilterClass::setup (int(params[1]),
params[0],
params[2],
params[3],
params[4]);
}
};