前のページから c言語の書き方例 |
am
=
(2/N) Σk=0N-1
{ fk
cos(2pmk/N) }
bm
=
(2/N) Σk=0N-1
{ fk
sin(2pmk/N) }
|
いろんなm |
m = 1, 2, 3, ... N/2 の場合についても
a1,
a2,
a3, ... をすべて求めたいので、
mについてもループにすればいいですね。
aも bも、角度の計算は同じなので、1回計算して ang に代入でいいよね。
これ以降、ベタにわかりやすいよう、個数N をKOSU と書いていきます。
for ( m=0; m<=KOSU/2; m++ ){
|
|
-
-
a = 0.0;
b = 0.0;
for ( k=0; k<KOSU; k++ ){
-
ang = 2 * PI * m * k /KOSU;     ←角度 (aとbに2回使うので)
a = a + f[k] * cos( ang );
b = b + f[k] * sin( ang );
}
-
a = a * 2 /KOSU;
b = b * 2 /KOSU;
|
|
-
-
if( m == 0 || m == KOSU/2){ ←m = 0 または m=KOSU/2の時は特別
-
a = a/2;
b = b/2;
}
p = a* a + b* b; ←振幅を2乗するとパワーが求められます
printf("m= %d a= %f b= %f power= %f \n", m, a, b, p ); ←得られた結果を出力
}
|
データ入力 (手動) |
これ以前に、あらかじめ
f[0],
f[2],
f[3], ...
f[KOSU-1] にデータを入力しておく必要がありますね。
キーボードからデータ入力するなら、scanfでできそうですね
|
準備いろいろ |
scanf を使うなら stdio.h を include,
sin や cos を使うなら math.h を include する必要があります。
プリプロセッサとして書きます。
pre(前)のprocessor(処理)という意味なので、main()より前に書きます。
プリプロセッサの書き方例
使う変数m, k, a, b, ang, p の型宣言も必要です。
main() の中の一番最初に書きます。
int m, k;
float f[KOSU], a, b, ang, p; /* --- f[0] to f[ KOSU-1 ] --- */
配列f[] のデータの個数KOSUは、変数ではなく、プリプロセッサによって数値に書き換えられます。
|
手動入力例 |
これらをまとめて、キーボードからデータを手入力してDFTするプログラムにした例です。
例
動きます。
だけど正直、データが多い時とか、やり直すたびに手入力ではやってられないです。
データファイルを開いて、そこから読めるようにならないと実際困ります。
|
データ入力 (ファイルから) |
ファイルからデータ入力するなら、
ファイル名を指定して、
そのファイルを openして、
fscanfで読み込みですね
|
|