最初に定義するのは全てのフィルターの先祖となる抽象クラスCFilterです。STKの全てのフィルターはこのクラスから派生させますので、基本となるコンストラクタとデストラクタをここで定義することで、派生クラスの定義を簡略化できます。また、フィルターメソッドrun()も純粋仮想メソッドとして定義しておき、派生クラスは全てこれをオーバーライドするようにします。
クラス宣言を以下に示します。STKのフィルターは全てVisualDSP++のライブラリを使うことにしますので、状態変数格納用の構造体もライブラリから拝借します。この構造体はFIRフィルター用とIIRフィルター用で異なりますが、IIRフィルタにかんしては後で考えることにします。おそらくは異なるコンストラクタを用意して対応することになります。
class CFilter{
protected:
fir_state_fr16 *s;
public:
CFilter(const short coeff[], unsigned int taps, unsigned int index);
// FIR 係数列、タップ数、補間/間引きインデックス.
virtual ~CFilter();
virtual void run ( short out[], const short in[], unsigned int count ) = 0;
};
CFilterはFIRフィルタ用の内部変数を持つほか、その初期化と廃棄処理を行います。FIRフィルタのほかデシメーターやインターポレーターもこの変数を使用します。
CFilter::CFilter(const short coeff[], unsigned int taps, unsigned int index)
{
this->s = new fir_state_fr16;
short * delay = new short[taps];
for ( int i=0; i<taps; i++ )
delay[i] = 0;
s->h = (fract16 *)coeff;
s->d = delay;
s->p = delay;
s->k = taps;
s->l = index;
}
CFilter::~CFilter()
{
delete this->s->d;
delete this->s;
}