掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
高速フーリエ変換からパワースペクトルを求める (ID:52785)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> 振幅スペクトルの2乗がパワースペクトルになるはずなんですよ・・ 通じてなかったかな? x2[i]*x2[i] + y2[i]*y2[i] 実部と虚部をそれぞれ2乗して加える。 複素数の2乗でなく、複素数のノルムの2乗です。 複素数の2乗(の実部)だと x*x - y*y になってしまうが、これは関係ない。 log(|fft|) ... 振幅スペクトル log(|fft|^2) ... パワースペクトル 結局 log() だから値は2倍になるだけだけどね。 ↓ここをクリック。 http://www.onosokki.co.jp/HP-WK/c_support/faq/cf5200/CF5200_time_spect.htm >> 得られた値をエクセルで書きたいです。 コンソールアプリを作成して、 データの出力をタブで区切ればいいということですね。 で出力を data.txt としたら、 これを1度ノートパッドで開き、 全選択=>エクセルに貼り付けです。 あなたのプログラムでは printf("%4d | %6.3f %6.3f | %6.3f %6.3f | %6.3f %6.3f\n", i, x1[i], y1[i], x2[i], y2[i],log10(x2[i]*x2[i]+y2[i]y2[i])); を printf("%4d\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\n", i, x1[i], y1[i], x2[i], y2[i],log10(x2[i]*x2[i]+y2[i]*y2[i])); と直せばよいですね。 ファイルに出力するなら FILE * fout; if( fout = fopen( "data.txt", "w" )) { for( i = 0; i < N; i ++ ) { fprintf( fout, "%4d\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\n", i, x1[i], y1[i], x2[i], y2[i],log10(x2[i]*x2[i]+y2[i]*y2[i])); } fclose( fout ); } とすればよい。 >> ソースを教えてもらうこと はできないこともないと思いますが、 あなた自身、どこまでできているのかな。 ...って、じゃあ、こうしよう。 一番最初のソースを作ったところまではできているとして、 まずは、[なーめ 2003/12/06(土) 04:42:49] のところで示した make_bitrev() の関数を static void make_sintbl(n, sintbl) の上に貼り付けてください。 次に /* #define PI 3.14159265358979323846 */ を #define PI 3.14159265358979323846 に直してください。 次にクラシックなスタイルのC言語を Visual C++ で使える ANSIスタイルにします。 static void make_sintbl(n, sintbl) int n; float *sintbl; { を static void make_sintbl( int n, float * sintbl) { に直してください。 int fft(n, x, y) int n; float *x; float *y; { を int fft( int n, float * x, float * y ) { に直してください。 int main(argc, argv) int argc; char *argv[]; { を int main( int argc, char ** argv ) { に直してください。 for (i = 0; i < N; i++) printf("%4d | %6.3f %6.3f | %6.3f %6.3f | %6.3f %6.3f\n", i, x1[i], y1[i], x2[i], y2[i],log10(x2[i]*x2[i]+y2[i]y2[i])); を FILE * fout; if( fout = fopen( "data.txt", "w" )) { for( i = 0; i < N; i ++ ) { fprintf( fout, "%4d\t%6.3f\t%6.3f\t%6.3f\t%6.3f\t%6.3f\n", i, x1[i], y1[i], x2[i], y2[i],log10(x2[i]*x2[i]+y2[i]*y2[i])); } fclose( fout ); } に直してください。 次もクラシックCでは型チェックが甘かったものが ANSIで厳しくなったものです。 修正: sintbl = malloc((n + n4) * sizeof(double)); bitrev = malloc(n * sizeof(int)); を sintbl = (double *)malloc((n + n4) * sizeof(double)); bitrev = (int *)malloc(n * sizeof(int)); に直してください。 main() の中の if (fft(N, x2, y2)) return EXIT_FAILURE; を fclose( fp ); if (fft(N, x2, y2)) return EXIT_FAILURE; に直してください。 これでコンパイルすると、 'double' から 'float' に変換しました。 というメッセージがいっぱいでるので、 全ての float を double に直してください ソースコードで float を検索し、もれなく行ってください。 これでとりあえずコンパイルできます。 コンパイルは Visual C++ の標準的な設定では F7 キーを押します。 まだ、直すべきところはありますが、 とりあえずここまでやってください。 ここまでで、エラーが出たら、 --------------------構成: m04 - Win32 Debug-------------------- コンパイル中... m04.cpp A:\Projects\test\math\m04\m04.cpp(134) : error C2146: 構文エラー : ')' が、識別子 'y2' の前に必要です。 I:\Projects\test\math\m04\m04.cpp(134) : error C2059: 構文エラー : ')' cl.exe の実行エラー のように貼り付けてください。 では、また「後」で。(^^;;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.