//---------------------------------------------- #ifndef sindoH #define sindoH //---------------------------------------------- #include "fft.h" #include "vecmath.h" //---------------------------------------------- /* 2006/02/13 計測震度が検出震度を超えているのなら 検出した外部で noise_cal を0に設定し続ける  そうすればノイズ成分は更新されない。 数理設計研究所 Hal.T 2005/03/05 計測震度の計算 注意: データ時系列は 添え字0が一番古いもの、 100個あるなら99が一番新しいもの データ投入 単位はgal 震度が更新されたら 1、無更新なら0で帰る。計測震度は呼び出すたびにゼロクリア されるので 帰り値が1なら必ず引き取ること。 30秒を1単位の地震とするなら、外部処理すべきだ。 ★設定パラメータ //可変すべき値リスト int LN; //データ点数の2^N表現 double dT; //0.01 計測インターバル 100サンプル/秒 int interval; //計測震度の計算間隔をサンプル数単位で表現する ★使い方 1:このクラスは静的に作ること 2:実験的には以下のように呼び出す いいかげんデータの作成 for(int n=0; n<200; n++) v3d[n].x = random(10000)*0.1; 呼び出して1なら震度データを引き取る if(sindo.set_gal(v3d,200)) { Label1->Caption = sindo.get_sindo(); } ★最後に計測震度を小数点一桁に四捨五入している //計算の実行 double Sindo::Calc(void) これの最終行一つ前で roundしているぞ */ //---------------------------------------------- //定数 const double taw = 0.3; //継続時間 //---------------------- class Sindo_Base { //---------------------- // Data public: //可変すべき値リスト int LN; //データ点数の2^N表現 double dT; //0.01 計測インターバル 100サンプル/秒 int interval; //計測震度の計算間隔をサンプル数単位で表現する /* 説明 普段は一時バッファに記憶するだけにして interval の個数ごとに計算しなおす 計算時間間隔は dT*interval 単位となる */ //---------------------- //ここから以下は内部設定する int AN; //データ点数 これはLNから計算される double KeisokuSindo; //計測震度 int KCal; //計算が終わっていれば1、計算が終わっていなければ0 int it; //計測震度の計算勘定 FFT *fft; //FFT double *Kfil; //計測震度フィルタ V3D *buf; //データバッファ V3D *vbuf; //フィルタ後の、ベクトルバッファ double *abuf; //絶対値バッファ V3D *mbuf; //未計算バッファ int mbufN; //未計算カウント数、intervalに達したら再計算する //---------------------- // Code Sindo_Base(); ~Sindo_Base(); /*データ投入 単位はgal 震度が更新されたら 1、無更新なら0で帰る。計測震度は呼び出すたびにゼロクリア されるので 帰り値が1なら必ず引き取ること。 30秒を1単位の地震とするなら、外部処理すべきだ。 */ int set_gal(V3D gal); int set_gal(V3D *gal, int n); //計測震度を得る、計算そのものは終わっている double get_sindo(void); //=================== //内部計算用 void Init(void); virtual double Calc(void); }; //---------------------------------------------- //---------------------- class Sindo : public Sindo_Base { //---------------------- // Data public: char fname[256]; int d_num; //データのカウンタ、AN個毎にノイズ評価をする int noise_cal; V3D *NoiseData; //自己雑音の集積用 //---------------------- // Code Sindo(); ~Sindo(); int set_gal(V3D *gal, int n); virtual double Calc(void); void reset_noise(void); }; //---------------------------------------------- #endif