離散フーリエ変換のプログラムを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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
オセロゲーム 2次元配列で困...
-
【Excel VBA】10進数を2進数に...
-
10個の実数に対する降順ソート...
-
途中経過も表示するプログラム
-
HKEY_CLASSES_ROOT\\.avi
-
'dataType' 引数を Null にする...
-
マクロ登録したピボットが重い...
-
txtファイルを読み込んで表示関...
-
CreateProcessでの環境変数の設...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
プロシージャ名の変数にカウン...
-
UTF-8で5~6バイトになる文字コ...
-
Excel 1セル当りの文字数が2...
-
Excel VBA メール作成について ...
-
DataGridViewの特定列に入力さ...
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
sort関数でひらがなとカタカナ...
-
matlabでのRRI検出
おすすめ情報
すみません,負になるのはわかるのですが...
どこを変えるのかというのがピンと来なくて...
もう少し教えていただけたらありがたいです...