FIRフィルタークラスはCFilterから派生させます。
このクラスのコンストラクタは単に親のクラスのコンストラクタをそのまま呼び出すだけです。runメソッドはライブラリ関数fir_fr16()を呼び出します。この関数は自律的に条件を判断してデュアルMACを活用します。具体的にはrun()メソッドのcountが2以上であり、タップ数が偶数でインパルス応答配列が4バイト整列されているときにデュアルMACを使用します。デュアルMAC使用時には1サイクルで積和演算を2つ実行します。
ライブラリ関数を使うとこのように場合分けを自分で考えずに住みます。反面、あらゆる場合を考慮してかかれているのでサイズはやや大きくなります。生産性を考えれば、Blackfinではなるべくライブラリ関数を使うほうがいいでしょう。
class CFirFilter:CFilter{ public: CFirFilter( const short coeff[], unsigned int taps ) :CFilter::CFilter( coeff, taps, 1 ){}; virtual void run( short out[], const short in[], unsigned int count ); };
/***************************************************** * CFirFilter : Class Wrapper for fir_fr16 function *****************************************************/ void CFirFilter::run( short out[], const short in[], unsigned int count ) { fir_fr16(in, out, count, this->s); }