flt.h

説明を見る。
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

IIR filter sample by wrapper classに対してMon Dec 18 17:29:47 2006に生成されました。  doxygen 1.5.1-p1