// 高速フーリエ変換 // 参考文献:大崎順彦「新・地震動のスペクトル解析入門」鹿島出版会 void TForm1::fast ( struct complex x[], int nn, int ind ) { struct complex temp, theta; int i, j, k, m, kmax, istep; const double PI = 3.14159265358979 ; j = 0 ; for ( i=0; im ) { j = j - m ; m = m / 2 ; if ( m<2 ) break; } j = j + m ; } kmax = 1 ; while ( kmax < nn ) { istep = kmax * 2 ; for ( k=0; k( 0., PI * ind * k / kmax ) ; for ( i=k; i= 0.0001 ) { double udf = 280. / 151. / band * df ; if ( udf > 0.5 ) { Application->MessageBox("バンド幅が狭すぎます。", "エラー",MB_ICONEXCLAMATION | MB_OK ) ; return ( -1 ) ; } imax = (int)( 2.0 / udf ) + 1 ; if ( imax > 101 ) { Application->MessageBox("バンド幅が広すぎます。", "エラー",MB_ICONEXCLAMATION | MB_OK ) ; return ( -1 ) ; } // スペクトルウィンドウ w[0] = 3. / 4. * udf ; for ( i=1; i *comp ; const struct complex zero(0.,0.); int n, total, i, nn, nfold ; // ファイルのオープン if (( fpin=fopen(OpenDialog1->FileName.c_str(),"rt")) == NULL ){ Application->MessageBox("加速度波形ファイルを設定し直して下さい。", "入力ファイルエラー",MB_ICONEXCLAMATION | MB_OK ) ; return ; } if (( fpout=fopen(SaveDialog1->FileName.c_str(),"wt")) == NULL ){ Application->MessageBox("結果の出力ファイルを設定し直して下さい。", "出力ファイルエラー",MB_ICONEXCLAMATION | MB_OK ) ; return ; } dt = StrToFloat( Edit_dt->Text ); // 時間刻み total = StrToInt( Edit_number->Text ); // 地震波個数 if ( CheckBox_win->Checked ) band = StrToFloat( Edit_haba->Text ); // バンド幅 else band = 0. ; accr = new double[total]; i = 0; while( fscanf(fpin,"%f",&z ) != EOF ){ accr[i] = (double) z; i++ ; if ( i >= total ) break; } fclose(fpin); n = i; a = log( (double)(n-1) ) / log( 2. ) + 1.0 ; nn = pow ( 2., (int) a ) ; nfold = nn / 2 ; df = 1. / nn / dt ; time = new double[nn]; freq = new double[nn]; afft = new double[nn]; comp = new struct complex[nn]; pow_spec = new double[nn]; temp1 = new double[nn]; temp2 = new double[nn]; for ( i=0; i( accr[i], 0. ) ; for ( i=n; iMessageBox("計算が終了しました。", "スペクトル解析",MB_ICONEXCLAMATION | MB_OK ) ; }