processdata.cpp

説明を見る。
00001 #include "afw.h"
00002 #include <filter.h> 
00003 /** \file processdata.cpp
00004  *  \brief オーディオコールバック関数
00005  *  \author アナログ・デバイセズ株式会社
00006  *
00007  * このファイルは、オーディオ処理のコールバック関数を含む。
00008  */
00009 namespace afw{
00010 /** タップ数
00011 * インパルス応答列の長さを与える
00012 */
00013     const int taps = 63;    
00014 /** インパルス応答
00015 * FIRフィルタに持たせるインパルス応答(伝達関数の時間表現)を格納する。
00016 * SciLab 4.0で、以下のコマンドにより生成
00017 *
00018 * - hn = eqfir(63, [0 0.1042; 0.125 0.5], [1 0], [1,0.1]); 
00019 * - int( hn'*32768+0.5 )
00020 *
00021 */
00022     short coeff[taps] = {
00023             277,
00024           - 1263,
00025             398,
00026             534,
00027             324,
00028             50,
00029           - 196,
00030           - 343,
00031           - 330,
00032           - 152,
00033             121,
00034             365,
00035             446,
00036             295,
00037           - 42,
00038           - 411,
00039           - 611,
00040           - 505,
00041           - 91,
00042             459,
00043             862,
00044             862,
00045             357,
00046           - 495,
00047           - 1316,
00048           - 1624,
00049           - 1042,
00050             521,
00051             2788,
00052             5177,
00053             6988,
00054             7663,
00055             6988,
00056             5177,
00057             2788,
00058             521,
00059           - 1042,
00060           - 1624,
00061           - 1316,
00062           - 495,
00063             357,
00064             862,
00065             862,
00066             459,
00067           - 91,
00068           - 505,
00069           - 611,
00070           - 411,
00071           - 42,
00072             295,
00073             446,
00074             365,
00075             121,
00076           - 152,
00077           - 330,
00078           - 343,
00079           - 196,
00080             50,
00081             324,
00082             534,
00083             398,
00084           - 1263,
00085             277
00086     };
00087 /** ディレイライン
00088 * FIRフィルタ内部で使うディレイライン(状態変数)
00089 */
00090     short delayline[taps];
00091 /** 内部変数
00092 * FIRフィルタ内部で使う変数
00093 */
00094     fir_state_fr16 state;
00095     
00096 /** コールバック関数の処理化
00097     *
00098     * afw::processData()関数を呼ぶ前に、fir_fr16()が必要とする内部変数の初期化を行う。
00099 */
00100     void initProcessData(void)
00101     {
00102         // firフィルタ用変数の初期化
00103         state.h = coeff;        // インパルス応答列
00104         state.d = delayline;    // 内部ディレイライン
00105         state.p = delayline;    // ポインタの初期化
00106         state.k = taps;         // タップ数(インパルス応答列の長さ)
00107         state.l = 0;
00108         
00109         for ( int i=0; i < taps; i ++ )
00110             delayline[i] = 0;
00111     }
00112 /** オーディオ・コールバック関数
00113    *
00114    * @param leftIn 左チャンネルの入力データバッファ
00115    * @param rightIn 右チャンネルの入力データバッファ
00116    * @param leftOut 左チャンネルの出力データバッファ
00117    * @param rightOut 右チャンネルの出力データバッファ
00118    * @param count 各バッファに格納されているオーディオデータの数
00119    *
00120    * この関数はDMAが受信バッファをいっぱいにするたびに割り込み経由で呼ばれる。
00121    * 引数として渡されるのは受信データを含む入力バッファのほか、送信データを
00122    * 格納するために使う出力バッファとデータ個数である。
00123    *
00124    * fir_fr16()関数は、16ビットのFIRフィルタ関数である。あらかじめ用意した
00125    * afw::state 変数にしたがってフィルタ処理を進める。 afw::stateの初期化は
00126    * afw::initProcessDataで行う。
00127    * 
00128    * 割り込みソースのクリアなどは、この関数の呼び出し側で行うので、関数内で
00129    * 処理する必要はない。
00130    */
00131 
00132     void processData( 
00133                       const shortfract leftIn[], 
00134                       const shortfract rightIn[], 
00135                       shortfract leftOut[], 
00136                       shortfract rightOut[],
00137                       int count
00138                      )
00139     {    
00140             // 注意:左チャンネルしか処理していない
00141         fir_fr16( (fract16*)leftIn, (fract16*)leftOut, count, &state ); 
00142 
00143             // 参照用に未処理の信号を右チャンネルに出力している
00144         for( int i=0; i<count; i++ )
00145             rightOut[i] = leftIn[i];
00146     }   // processData
00147 
00148 };  // namespace afw

FIR filter sample by Library functionに対してTue Nov 21 14:11:45 2006に生成されました。  doxygen 1.5.1-p1