離散フーリエ変換のプログラムをC言語で書きました.
周波数スペクトルを得るときに,grは-3と3(Hz)で8,giは-1と1(Hz)でそれぞれ16,-16,そのほかの周波数では0の値を取るようにしたいのですが,そのようになりません.
どうすればそんな結果を得ることができるか教えていただきたいです.
よろしくお願いします。
以下,プログラム
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n, N = 32, k;
double t, *g, *r_data, *i_data, *s_data, gr, gi;
g = (double*)malloc(sizeof(double)*N);
r_data = (double*)malloc(sizeof(double)*N);
i_data = (double*)malloc(sizeof(double)*N);
s_data = (double*)malloc(sizeof(double)*N);
/*入力データ*/
for(n = 0; n < N; n++){
t = (double) (n * 3) / 32;
g[n] = sin(2 * (M_PI) * t) + 0.5 * cos(6 * (M_PI) * t);
printf("g[%d] = %lf\n", n, g[n]);
}
/*離散フーリエ変換と周波数スペクトル*/
for ( k = -(N/2); k < (N/2); k++ ){
gr = 0;
gi = 0;
for(n = 0; n < N; n++){
gr = gr + g[n] * cos(2 * (M_PI) * k * n / N);
gi = gi - g[n] * sin(2 * (M_PI) * k * n / N);
}
r_data[k] = gr;
i_data[k] = gi;
s_data[k] = sqrt(r_data[k] * r_data[k] + i_data[k] * i_data[k]);
}
/*結果の表示*/
for(k = -(N/2); k < (N/2); k++){
printf("gr[%d] = %lf, gi[%d] = %lf\n", k, r_data[k], k, i_data[k]);
}
for (k = -(N/2); k < (N/2); k++) {
printf("gs[%d] = %lf\n", k, s_data[k]);
}
free(g);
free(r_data);
free(i_data);
free(s_data);
return 0;
}
No.5
- 回答日時:
うん, その方が普通じゃないかな.
このプログラムだとフーリエ変換するときに使う三角関数の周期は N なので, m を整数としたとき
k=m と k=m+N では同じ結果になる
はずだよね. そして, k を 0 から回すようにすると配列の添え字とフーリエ係数とがそのまま対応するようになるので, 後の処理がわかりやすいはず. 例えば, フーリエ係数をいじってから逆変換するとかね.
あと, s_data を計算するところは, 可能なら hypot って関数を使うようにすると安全.
なるほど...
kの表示をどうしたいかで決めたのですが,他に何かやりたいことがあれば,kが負にならないほうが全体的にわかりやすくなる,という感じですね!
丁寧に説明していただいて本当にありがとうございます!
非常に助かりました!
No.4
- 回答日時:
ちなみに.
多くの場合「k は負にしない」んじゃないかな. その方が (ちょっとだけど) 簡単だし.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
stable diffusionのエラー
-
途中経過も表示するプログラム
-
エクセルVBA:日付データの変換...
-
2バイトの文字データの送信
-
ビットデータのチェック方法
-
エクセルシート名の制限を変更...
-
[VBScript][wsh]byte単位でのデ...
-
タグの不等号処理
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
EUSARTで通信
-
char str[256]の256の意味は?
-
C++ Builderで文字列をバイトに...
-
VBSでテキストファイルの文字列...
-
アルファベットもURLエンコード...
-
Sys::Syslogモジュールを利用し...
-
UTF-8で5~6バイトになる文字コ...
-
.netで、ibm漢字で書かれたテキ...
-
Excel 1セル当りの文字数が2...
-
コレって何が表示されたんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
C言語についてです! 同じ年の...
-
pythonでDBのカラム名で取得し...
-
PINVOKEで構造体配列をマーシャ...
-
MySQLに登録すると文字化け
-
C言語 ファイル内のデータと入...
-
CreateProcessでの環境変数の設...
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
Cのプログラムがどうしても動き...
-
POSTで配列のデータを渡す方法は?
-
マクロ登録したピボットが重い...
-
gnuplotの出力グラフ名を外部で...
-
離散フーリエ変換のプログラム...
おすすめ情報
すみません,負になるのはわかるのですが...
どこを変えるのかというのがピンと来なくて...
もう少し教えていただけたらありがたいです...