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 * input[]で受け取ったデータ列にフィルタ処理を施して、outpu[]に出力する。 00035 * 処理を行うデータ個数はcountで指定する。 00036 * 00037 * このメソッドは純粋仮想メソッドであるため実際には何も実装しない。 00038 * 実装は子孫のクラスが行う。 00039 */ 00040 virtual void run( const shortfract input[], shortfract output[], int count )=0; 00041 00042 }; 00043 00044 00045 /** FIRフィルタクラス 00046 * 00047 * CFirFilterは、16bit固定小数点によるFIRフィルタのクラスである。VisauDSP++の 00048 * fir_fr16()関数のラッパーとして働く。 00049 */ 00050 class CFIRFilter : public CFilter{ 00051 protected: 00052 /** 内部変数 00053 * 00054 * この変数はVisualDSP++に用意されている関数、fir_fr16用の内部変数である。 00055 * 構造体になっており、係数配列へのポインタ、タップ数、ディレイラインへの 00056 * ポインタなどを収める。 00057 */ 00058 fir_state_fr16 state; 00059 public: 00060 /** 内部変数を初期化 00061 * @param h 伝達関数H(係数配列)を与える。 00062 * @param tap フィルタのタップ数を与える 00063 * @param d ディレイラインへのポインタを与える。 00064 * 00065 * このコンストラクタは内部変数stateの初期化を行う。 00066 * 00067 * 伝達関数である係数配列とディレイラインには外部から与えられるポインタをそのまま使う。 00068 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00069 */ 00070 CFIRFilter( const shortfract h[], int tap, shortfract d[] = 0 ); 00071 /** デストラクタ 00072 * 00073 * コンストラクタが確保した*(state.d)の領域を開放する。 00074 */ 00075 virtual ~CFIRFilter(); 00076 /** フィルタ実行メソッド 00077 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00078 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00079 * \param count input引数の要素数 00080 * 00081 * VisualDSP++のfir_fr16のラッパーメソッドとして働く。 00082 */ 00083 virtual void run( const shortfract input[], shortfract output[], int count ); 00084 00085 }; 00086 00087 /** バイクワッドIIRフィルタクラス 00088 * 00089 * CIIRFilterは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00090 * iir_fr16()関数のラッパーとして働く。VisualDSP++ 4.0 ( July 2006 update )の 00091 * iir_fr16()関数は、転置直接型IIのバイクワッドIIRフィルタである。コンストラクタ 00092 * の引数によって、何段のバイクワッド・フィルタを縦続接続するのか指定できる。 00093 */ 00094 class CIIRFilter : public CFilter{ 00095 protected: 00096 /** 内部変数 00097 * 00098 * この変数はVisualDSP++に用意されている関数、iir_fr16用の内部変数である。 00099 * 構造体になっており、係数配列へのポインタ、ステージ数、ディレイラインへの 00100 * ポインタなどを収める。 00101 */ 00102 iir_state_fr16 state; 00103 public: 00104 /** 内部変数を初期化 00105 * @param coeff 伝達関数Hの係数列(係数配列)を与える。 00106 * @param stage バイクワッド・フィルタの縦続段数を与える 00107 * @param d ディレイラインへのポインタを与える。 00108 * 00109 * このコンストラクタは内部変数stateの初期化を行う。 00110 * 00111 * 伝達関数である係数配列とディレイラインには外部から与えられるポインタをそのまま使う。 00112 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00113 * 00114 * バイクワッド・フィルタの伝達関数H(z)は次のようにあらわす 00115 * 00116 * H(z) = B0 + B1*z^-1 + B1*z^-2 / A0 + A1*(z^-1) + A2*(z^-2) 00117 * 00118 * ここでcoeff[]には、先頭からA2,A1,B2,B1,B0の順で格納する。A0は常に 00119 * 1であると仮定しており、不要である。2段のバイクワッド・フィルタの 00120 * 場合には続けて二段目の係数を格納する。 00121 * 00122 * 伝達関数の式およびA,Bの符号の表現方法は文献により異なる。 00123 * くれぐれも注意すること。 00124 */ 00125 CIIRFilter( const shortfract coeff[], int stage, shortfract d[] = 0 ); 00126 /** デストラクタ 00127 * 00128 * コンストラクタが確保した*(state.d)の領域を開放する。 00129 */ 00130 virtual ~CIIRFilter(); 00131 /** フィルタ実行メソッド 00132 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00133 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00134 * \param count input引数の要素数 00135 * 00136 * VisualDSP++のiir_fr16のラッパーメソッドとして働く。 00137 */ 00138 virtual void run( const shortfract input[], shortfract output[], int count ); 00139 }; 00140 00141 /** デシメーター・クラス 00142 * 00143 * CDecimatorは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00144 * fir_decima_fr16()関数のラッパーとして働く。 00145 */ 00146 class CDecimator : public CFIRFilter{ 00147 public: 00148 /** 内部変数を初期化 00149 * @param h 伝達関数H(係数配列)を与える。 00150 * @param tap フィルタのタップ数を与える 00151 * @param ratio デシメーション比を与える 00152 * @param d 内部ディレイライン 00153 * 00154 * このコンストラクタは内部変数stateの初期化を行う。ただし、 00155 * 多くの初期化をCFIRFilter::CFIRFilterから継承しているので 00156 * 実際にはデシメーション比を内部変数に格納しているだけである。 00157 * 00158 * 伝達関数である係数配列とディレイラインには外部から与えられる 00159 * ポインタhをそのまま使う。ディレイラインの長さはtapである。 00160 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00161 */ 00162 CDecimator( const shortfract h[], int tap, int ratio, shortfract d[] = 0 ); 00163 /** フィルタ実行メソッド 00164 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00165 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00166 * サイズはcount/デシメーション比。 00167 * \param count input引数の要素数。この値はCDecimator::CDecimatorで与えたデシメーション比の 00168 * 整数倍でなければならない 00169 * 00170 * VisualDSP++のfir_decima_fr16のラッパーメソッドとして働く。 00171 */ 00172 virtual void run( const shortfract input[], shortfract output[], int count ); 00173 }; 00174 00175 /** インターポレーター・クラス 00176 * 00177 * CDecimatorは、16bit固定小数点によるIIRフィルタのクラスである。VisauDSP++の 00178 * fir_interp_fr16()関数のラッパーとして働く。 00179 */ 00180 00181 class CInterpolator : public CFIRFilter{ 00182 public: 00183 /** 内部変数を初期化 00184 * @param h 伝達関数H(係数配列)を与える。 00185 * @param tap フィルタのタップ数を与える。インターポレーション比の整数倍でなければならない。 00186 * @param ratio インターポレーション比を与える 00187 * @param d 内部ディレイライン 00188 * 00189 * このコンストラクタは内部変数stateの初期化を行う。ただし、 00190 * 多くの初期化をCFIRFilter::CFIRFilterから継承している。 00191 * ディレイラインとして与える配列の長さはtap/ratioにする。 00192 * ディレイラインを与える引数が省略された場合には、内部で割り付けて使う。 00193 * 00194 * 00195 */ 00196 CInterpolator( const shortfract h[], int tap, int ratio, shortfract d[] = 0 ); 00197 /** フィルタ実行メソッド 00198 * \param input shortfract型の入力配列。フィルタへの入力をここに与える。 00199 * \param output shortfract型の出力配列。フィルタの実行結果がここに格納される。 00200 * サイズはcount*インターポレーション比。 00201 * \param count input引数の要素数。 00202 * 00203 * VisualDSP++のfir_interp_fr16のラッパーメソッドとして働く。 00204 */ 00205 virtual void run( const shortfract input[], shortfract output[], int count ); 00206 }; 00207 }; // namespace flt
1.5.1-p1