00001 #pragma once 00002 #include <filter.h> 00003 #include <shortfract> 00004 /** フィルター・クラス・ヘッダーファイル 00005 * \file flt.h 00006 * fltクラス・ライブラリの宣言を行うヘッダ。フィルタ・クラスを使う場合には必ず見込む。名前空間はflt。 00007 */ 00008 00009 /** フィルター・クラスの名前空間 00010 * IIRフィルタ、FIRフィルタなどのクラスを提供する名前空間。 00011 */ 00012 namespace flt{ 00013 /** フィルタクラス 00014 * 00015 */ 00016 class CFilter{ 00017 protected: 00018 /** ディレイライン割付フラグ 00019 * 外部からディレイ・ラインが割り付けられたときに1にしておく。 00020 */ 00021 short givenDelayLine; 00022 public: 00023 /** 便宜上のデストラクタ 00024 * 00025 * このデストラクタは何もしない。しかし、すべての子孫のクラスのデストラクタを 00026 * 仮想デストラクタにするために、ここで便宜上virtual宣言を行う。 00027 */ 00028 virtual ~CFilter(){}; 00029 /** 純粋抽象メソッド 00030 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00031 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00032 * \param count input引数の要素数 00033 * 00034 * このメソッドは何もしない。しかし、すべての子孫のクラスに実装を強制するため、 00035 * ここで宣言を行う。 00036 */ 00037 virtual void run( const shortfract input[], shortfract output[], int count )=0; 00038 00039 }; 00040 00041 00042 /** FIRフィルタクラス 00043 * 00044 * CFirFilterは、16bit固定小数点によるFIRフィルタのクラスである。VisauDSP++の 00045 * fir_fr16()関数のラッパーとして働く。 00046 */ 00047 class CFIRFilter : public CFilter{ 00048 protected: 00049 /** 内部変数 00050 * 00051 * この変数はVisualDSP++に用意されている関数、fir_fr16用の内部変数である。 00052 * 構造体になっており、係数配列へのポインタ、タップ数、ディレイラインへの 00053 * ポインタなどを収める。 00054 */ 00055 fir_state_fr16 state; 00056 public: 00057 /** 内部変数を初期化 00058 * @param h 伝達関数H(係数配列)を与える。 00059 * @param tap フィルタのタップ数を与える 00060 * @param d ディレイラインへのポインタを与える。 00061 * 00062 * このコンストラクタは内部変数stateの初期化を行う。 00063 * 00064 * 伝達関数である係数配列とディレイラインには外部から与えられるポインタをそのまま使う。 00065 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00066 */ 00067 CFIRFilter( const shortfract h[], int tap, shortfract d[] = 0 ); 00068 /** デストラクタ 00069 * 00070 * コンストラクタが確保した*(state.d)の領域を開放する。 00071 */ 00072 virtual ~CFIRFilter(); 00073 /** フィルタ実行メソッド 00074 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00075 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00076 * \param count input引数の要素数 00077 * 00078 * VisualDSP++のfir_fr16のラッパーメソッドとして働く。 00079 */ 00080 virtual void run( const shortfract input[], shortfract output[], int count ); 00081 00082 }; 00083 00084 /** バイクワッドIIRフィルタクラス 00085 * 00086 * CIIRFilterは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00087 * iir_fr16()関数のラッパーとして働く。VisualDSP++ 4.0 ( July 2006 update )の 00088 * iir_fr16()関数は、転置直接型IIのバイクワッドIIRフィルタである。コンストラクタ 00089 * の引数によって、何段のバイクワッド・フィルタを縦続接続するのか指定できる。 00090 */ 00091 class CIIRFilter : public CFilter{ 00092 protected: 00093 /** 内部変数 00094 * 00095 * この変数はVisualDSP++に用意されている関数、iir_fr16用の内部変数である。 00096 * 構造体になっており、係数配列へのポインタ、ステージ数、ディレイラインへの 00097 * ポインタなどを収める。 00098 */ 00099 iir_state_fr16 state; 00100 public: 00101 /** 内部変数を初期化 00102 * @param coeff 伝達関数Hの係数列(係数配列)を与える。 00103 * @param stage バイクワッド・フィルタの縦続段数を与える 00104 * @param d ディレイラインへのポインタを与える。 00105 * 00106 * このコンストラクタは内部変数stateの初期化を行う。 00107 * 00108 * 伝達関数である係数配列とディレイラインには外部から与えられるポインタをそのまま使う。 00109 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00110 * 00111 * バイクワッド・フィルタの伝達関数H(z)は次の形式である。 00112 * 00113 * H(z) = B0 + B1*z^-1 + B1*z^-2 / A0 + A1*z^-1 + A2*z^-2 00114 * 00115 * ここでcoeff[]には、先頭からA2,A1,B2,B1,B0の順で格納する。A0は常に 00116 * 1であると仮定しており、不要である。2段のバイクワッド・フィルタの 00117 * 場合には続けて二段目の係数を格納する。 00118 * 00119 * 伝達関数の式およびA,Bの符号の表現方法は文献により異なる。 00120 * くれぐれも注意すること。 00121 */ 00122 CIIRFilter( const shortfract coeff[], int stage, shortfract d[] = 0 ); 00123 /** デストラクタ 00124 * 00125 * コンストラクタが確保した*(state.d)の領域を開放する。 00126 */ 00127 virtual ~CIIRFilter(); 00128 /** フィルタ実行メソッド 00129 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00130 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00131 * \param count input引数の要素数 00132 * 00133 * VisualDSP++のiir_fr16のラッパーメソッドとして働く。 00134 */ 00135 virtual void run( const shortfract input[], shortfract output[], int count ); 00136 }; 00137 00138 /** バイクワッドIIRフィルタクラス 00139 * 00140 * CIIRFilterExは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00141 * iir_fr16_ex()関数のラッパーとして働く。VisualDSP++ 4.0 ( July 2006 update )の 00142 * iir_fr16_ex()関数は、転置直接型IIのバイクワッドIIRフィルタである。コンストラクタ 00143 * の引数によって、何段のバイクワッド・フィルタを縦続接続するのか指定できる。 00144 */ 00145 class CIIRFilterEx : public CIIRFilter{ 00146 protected: 00147 /** スケールファクタへのポインタ 00148 * 外部から与えられるスケールファクターの配列へのポインタを格納する。 00149 */ 00150 const short * scaleFactor; 00151 public: 00152 /** 内部変数を初期化 00153 * @param coeff 伝達関数Hの係数列(係数配列)を与える。 00154 * @param stage バイクワッド・フィルタの縦続段数を与える 00155 * @param scale 係数の補正量を与える配列 00156 * @param d ディレイラインへのポインタを与える。 00157 * 00158 * このコンストラクタは内部変数stateの初期化を行う。 00159 * 00160 * 伝達関数である係数配列とディレイラインには外部から与えられるポインタをそのまま使う。 00161 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00162 * 00163 * バイクワッド・フィルタの伝達関数H(z)は次のようにあらわす 00164 * 00165 * H(z) = B0 + B1*z^-1 + B1*z^-2 / A0 + A1*z^-1 + A2*z^-2 00166 * 00167 * ここでcoeff[]には、先頭からA02/k0,A01/k0,B02/k0,B01/k0,B00/k0, 00168 * A12/k1,A11/k1,B12/k1,B11/k1,B10/k1,の順で格納する。An0は常に 00169 * 1であると仮定しており、不要である。 00170 * 00171 * 上記の伝達関数に於いてkは係数の補正を行う係数である。バイクワッド 00172 * の各段は固有の係数kを持つことができる。n段目のバイクワッドの係数 00173 * knは次の式でもとめる。 kn=2^pn。ここでpnは、引数scaleに与える 00174 * n番目の値である。たとえば、scaleが { 0, 2 }であれば、2段の 00175 * バイクワッドの係数補正量kは初段が0、次段が4である。 00176 * 00177 * 伝達関数の式およびA,Bの符号の表現方法は文献により異なる。 00178 * くれぐれも注意すること。 00179 */ 00180 CIIRFilterEx( const shortfract coeff[], const short scale[], int stage, shortfract d[] = 0 ) 00181 : CIIRFilter( coeff, stage, d ){ scaleFactor = scale;} 00182 /** フィルタ実行メソッド 00183 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00184 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00185 * \param count input引数の要素数 00186 * 00187 * iir_fr16_exのラッパーメソッドとして働く。 00188 */ 00189 virtual void run( const shortfract input[], shortfract output[], int count ); 00190 }; 00191 00192 00193 00194 /** デシメーター・クラス 00195 * 00196 * CDecimatorは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00197 * fir_decima_fr16()関数のラッパーとして働く。 00198 */ 00199 class CDecimator : public CFIRFilter{ 00200 public: 00201 /** 内部変数を初期化 00202 * @param h 伝達関数H(係数配列)を与える。 00203 * @param tap フィルタのタップ数を与える 00204 * @param ratio デシメーション比を与える 00205 * @param d 内部ディレイライン 00206 * 00207 * このコンストラクタは内部変数stateの初期化を行う。ただし、 00208 * 多くの初期化をCFIRFilter::CFIRFilterから継承しているので 00209 * 実際にはデシメーション比を内部変数に格納しているだけである。 00210 * 00211 * 伝達関数である係数配列とディレイラインには外部から与えられる 00212 * ポインタhをそのまま使う。ディレイラインの長さはtapである。 00213 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00214 */ 00215 CDecimator( const shortfract h[], int tap, int ratio, shortfract d[] = 0 ); 00216 /** フィルタ実行メソッド 00217 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00218 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00219 * サイズはcount/デシメーション比。 00220 * \param count input引数の要素数。この値はCDecimator::CDecimatorで与えたデシメーション比の 00221 * 整数倍でなければならない 00222 * 00223 * VisualDSP++のfir_decima_fr16のラッパーメソッドとして働く。 00224 */ 00225 virtual void run( const shortfract input[], shortfract output[], int count ); 00226 }; 00227 00228 /** インターポレーター・クラス 00229 * 00230 * CDecimatorは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00231 * fir_interp_fr16()関数のラッパーとして働く。 00232 */ 00233 00234 class CInterpolator : public CFIRFilter{ 00235 public: 00236 /** 内部変数を初期化 00237 * @param h 伝達関数H(係数配列)を与える。 00238 * @param tap フィルタのタップ数を与える。インターポレーション比の整数倍でなければならない。 00239 * @param ratio インターポレーション比を与える 00240 * @param d 内部ディレイライン 00241 * 00242 * このコンストラクタは内部変数stateの初期化を行う。ただし、 00243 * 多くの初期化をCFIRFilter::CFIRFilterから継承している。 00244 * ディレイラインとして与える配列の長さはtap/ratioにする。 00245 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00246 * 00247 * 00248 */ 00249 CInterpolator( const shortfract h[], int tap, int ratio, shortfract d[] = 0 ); 00250 /** フィルタ実行メソッド 00251 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00252 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00253 * サイズはcount*インターポレーション比。 00254 * \param count input引数の要素数。 00255 * 00256 * VisualDSP++のfir_interp_fr16のラッパーメソッドとして働く。 00257 */ 00258 virtual void run( const shortfract input[], shortfract output[], int count ); 00259 }; 00260 }; // namespace flt