#ifndef __FFT_H #define __FFT_H //-------------------------------------------------------- /* FFT class library (C)Mathematical Assist Design Lab. (C)数理設計研究所 1999/3 Hal.T クラスライブラリ化 P5-150 1024point fft 50msec 2004/12/14 試験部分は test4fft を定義することによってアクティブとなる 逆FFTではSIN値を正負逆にする FFT(int fdir=1)はFFT、FFT(int fdir=-1)は逆FFT RevComp() FFT,逆FFTの規格化 変換速度 P4-2.8G 1Gメモリ 最適化無し最適化あり 1024 300usec 64k 40msec 37msec 1M 2sec 1.5sec */ //-------------------------------------------------------- //#define test4fft //試験SW //-------------------------------------------------------- #include #include "vecmath.h" //-------------------------------------------------------- //#define PI 3.1415926535897932384626433832795028841971 //-------------------------------------------------------- /* 説明:完全複素型のFFT 生成 1024点FFTは FFT(10) で作成する 256=8, 512=9, 1024=10, 2048=11, 4096=12, 8192=13, 16384=14 32768=15 fft_mode ビット割り当て bit0 0 srcバッファ(src)を自分で作り廃棄する 1 srcバッファ(src)は外部所有のポインタとして扱う  外部データは Vec2 *src; fft_modeのbit0=0のとき srcバッファはクラスが自己所有する、結果もここに書き出される fft_modeのbit0=1のとき srcバッファは外部所有としてこのクラスに与える。 連続して同じような処理をするときには高速となる。 しかし、ソフトとして完結性が無くなる。  整数形式へは void SetIntData(int *); 実数値としてsrcに書き込まれる void GetIntData(int *);  で変換される  FFT変換は void fft_cnv(void);  で実行できるが、ありとあらゆるMASKや規格化は事前や事後に別途すること 窓関数 void DoNothing(void); が規定値である。 */ //-------------------------------------------------------- //原理的でかなり低速バージョン class FFT { private: int mode_memo; //モードの記憶用、今はsrcの所有関係のみ int FFT_BIT; int FFT_N; // 2^Bit protected: void init(void); void bit_rev(void); double sinf(int n) { return sin_d[n]; } double cosf(int n) { return cos_d[n]; } double *sin_d, *cos_d, *Mask_d; public: //内部バッファ、このクラスが自分で作る、最終結果もここに上書き Vec2 *src; enum MaskTag { MDoNothing, MTriangle, MSine, MHunning, MHumming } Mask; //MDoNothing; //何もMASKしないのが規定値 FFT(int Bit, int fft_mode=0); //fft_mode=0 は内部メモリ確保 ~FFT(); int GetFFT_N(void) { return FFT_N; } void SetIntData(int *); //外部INTデータを内部データとして書き込む void GetIntData(int *); //fdir=1 はFFT fdir=-1は逆FFT ビットリバース void fft_cnv(int fdir=1); /* MASKの設定とパラメータ計算 FFTの使い方、産報出版 安居院 猛 p121 Window Mask 3dB帯域 側波帯最大値 DC harm @FFT_N=64 */ void DoNothing(void); // 0.89/T -13dB 矩形窓 64 32 void Triangle(void); // 1.25/T -26dB 32 16 void Sine(void); // 1.17/T -23dB 40.73 20.41 void Hunning(void); // 1.44/T -32dB 34.56 17.28 void Humming(void); // 1.36/T -42dB 32 16 void MaskExe(void); //マスクをかける //スペクトル計算のための規格化 前半分(0-FFT/N+1)が有効 //マスクに応じてDC,ACごとに規格化 void SpecComp(void); void RevComp(void); //FFT→逆FFTしたときの規格化 全部をFFT_Nで除する void GetDBCnv(int *p, int Dot10, int Zero=1000); //dB に変換して得る }; //-------------------------------------------------------- //固定小数点 32ビット幅のFFT、小数点位置は中心 /* class FFT_V2I { private: int mode_memo; //モードの記憶用、今はsrcの所有関係のみ int FFT_BIT; int FFT_N; // 2^Bit protected: void init(void); void bit_rev(void); int sinf(int n) { return sin_d[n]; } int cosf(int n) { return cos_d[n]; } int *sin_d, *cos_d, *Mask_d; public: //内部バッファ、このクラスが自分で作る、最終結果もここに上書き Vec2 *src; enum MaskTag { MDoNothing, MTriangle, MSine, MHunning, MHumming } Mask; //MDoNothing; //何もMASKしないのが規定値 FFT(int Bit, int fft_mode=0); //fft_mode=0 は内部メモリ確保 ~FFT(); int GetFFT_N(void) { return FFT_N; } void SetIntData(int *); //外部INTデータを内部データとして書き込む void GetIntData(int *); //fdir=1 はFFT fdir=-1は逆FFT ビットリバース void fft_cnv(int fdir=1); }; */ //-------------------------------------------------------- #ifdef test4fft //試験部分 void fft_test01(void); //スペクトル検査 void fft_test02(void); //FFT、逆FFTの検査 void fft_test03(void); //速度検査 #endif //#ifdef test4fft //-------------------------------------------------------- #endif //__FFT_H 再帰定義の抑制用