掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
高速フーリエ変換からパワースペクトルを求める (ID:52787)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> エラーはありませんでした。 今のままでは、 実行時にファイル名を指定しないと、致命的エラーになる予定です。 (^^;; main() の static double x1[N], y1[N], x2[N], y2[N], x3[N], y3[N]; を static double x1[N], y1[N], x2[N], y2[N], x3[N], y3[N]; if( argc < 2 ) { fprintf( stderr, "入力ファイルを指定してください" ); return( 0 ); } にしてください。 # 入力ファイル指定を忘れないならそのままで問題なしですが。 C:>fftpower input.txt ^^^^^^^^ <-- あなたの作成したプログラム名と仮定。 ですかね。 >> 家にVCがないのですが無料でインストールできるサイトがあるというの >> を聞いたことがあります。 そんな違法なことは Microsoft が許さないと思います。 あったとしても、私は知りませんし、知っていても、このような ところで公表するわけにもいかないでしょう。 もし、学生さんなら、今のうちにアカデミック版を購入したらよいのでは。 あるいは、Linux にしてしまうとか。 今までのソースコードの範囲なら、無料で手に入る gcc (GNU C Compiler) でそのまま使えるはずですが。(Linux も基本は無料です) Excel はありませんが..... >> あと窓関数の適応も教えてもらいたいです。 タイトル「オーディオ信号のパワースペクトルを求めるには?」の タケさんが示していますね。 入力 s(n) に窓関数 h(n) をかけています。 下に示した中から、好みの窓関数を選んで、あるいは全部を、 make_bitrev() 関数の上に貼り付けてください。 そして、main() の fclose(fp); の下で呼び出してください。 do_hanning_window( N, x1, x2 ); x1 から窓かけを行いつつ x2 にコピーしますので fscanf(fp, "%f", &x1[i])の次の行、 x2[i] = x1[i] ; が不要になりますね。 もし、 error C2065: 'memcpy' : 定義されていない識別子です。 が出たら、 #include <memory.h> を #include <math.h> の次にいれてください。 なお、下のルーチンは cos テーブルを使用していないので、 「遅い」です。cos テーブルを追加するのは課題にしましょう。 窓関数: http://www.viste.com/MeasuringSystem/DSP/windows.html ↑式中 T はフレーム長 N, t はフレーム位置 n と考えられます。 下の窓関数ルーチンははテストしていません。 結果を見て(バグがないかどうか)判断してください。 ローゼンフィールド窓はあなたが作成してください。 今のプログラムは1フレームを処理するだけだから、「遅い」ことは おそらく気になりません。 フレームシフトしながら音楽再生と同時にスペクトル表示したいなら 追加する必要があります。でも、この目的ならメディアプレイヤーを 使う方がいいですね。 ここまででは、最初に指摘した全てを修正したわけで ありませんが、とりあえずあなたの目的を達成できているとは 思われます。 「下のルーチン」はここから //------------------------------------------------------ // q_pi は π/4 static double q_pi = atan(1.0); // 方形窓 // 支配的な周波数成分が明確であって、そのピークレベルの正確さを希望する分析。 // 設定した周波数範囲内で高周波数成分が多い騒音を分析する場合。 // static void do_rectangle_window( int n, double * rp_in, double * rp_out ) { memcpy( rp_out, rp_in, n * sizeof( double )); } // ハニング窓 // 空調設備の音のように低周波音が支配的だが高周波数成分まで分析する場合。 // また風切り音のようにピーク成分が不明で広帯域周波数の場合。 // static void do_hanning_window( int n, double * rp_in, double * rp_out ) { int c; for( c = 0; c < n; c ++ ) { *rp_out ++ = *rp_in * ( 0.5 - 0.5 * cos( q_pi * 8 * c / n )); } } // ハミング窓 // エンジン音のように複数のピーク成分が予想され、スペクトルの裾 // の部分の形状よりもピークの値に精度を求める場合。 // static void do_hamming_window( int n, double * rp_in, double * rp_out ) { int c; for( c = 0; c < n; c ++ ) { *rp_out ++ = *rp_in * ( 0.54 - 0.46 * cos( q_pi * 8 * c / n )); } } static void do_blackmann_hariss_window( int n, double * rp_in, double * rp_out ) { int c; for( c = 0; c < n; c ++ ) { *rp_out ++ = *rp_in * ( 0.3875 - 0.48829 * cos( q_pi * 8 * c / n ) + 0.35875 * cos( q_pi * 16 * c / n ) - 0.001168 * cos( q_pi * 24 * c / n )); } } //--------------------------------------------------------------- ここまで
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.