フーリエ変換をして、周波数成分を取り出したい
1次元フーリエ変換を理解中の者です。
サンプリングした電圧のデータ列を分析して、周波数成分を取り出したいのですが、
フーリエ変換の概念はわかります。
やりたいのは、よく見かける、横軸周波数、縦軸電圧を作りたいです。
探したサンプルプログラムを実行して出力を得ました
実は一般的なソースらしいのですが、意味はまだ理解していません
1Khzでサンプリングした電圧のデータ列
int samp[20] = {0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 0};
結果
0 0 0 0 0 0 0 100 100 100 100 100 100 0 0 0 0 0 0 0
0 12 30 15 -42 -99 -80 60 292 510 600 510 292 60 -80 -100 -42 15 30 12
0 0 0 0 0 0 0 100 100 100 100 100 100 0 0 0 0 0 0 0
ソースは最後に添付します
お聞きしたいのは、この結果は、どう見たら良いのでしょうか
欲しい結果は、
1kHz = 〇v
10kHz = 〇v
...
ソース
int test_1_main()
{
double re[20], im[20];
int i;
FILE *fo;
char *outfile="test.txt";
if ((fo = fopen(outfile, "w")) == NULL) {
printf("file open error!!\n");
return (-1);
}
for(i=0; i<20; i++){
re[i] = samp[i];
im[i] = 0;
}
for(i=0; i<20; i++){
fprintf(fo, "%d ", (int)re[i]);
}
dft_swap(re, im, 20);
fprintf(fo, "\n");
dft_idft(re, im, 20, DFT);
dft_swap(re, im, 20);
for(i=0; i<20; i++){
fprintf(fo, "%d ", (int)re[i]);
}
fprintf(fo, "\n");
dft_swap(re, im, 20);
dft_idft(re, im, 20, IDFT);
dft_swap(re, im, 20);
for(i=0; i<20; i++){
fprintf(fo, "%d ", (int)re[i]);
}
fprintf(fo, "\n");
fclose(fo);
return 0;
}
call関数は書けないので抜粋以下
int dft_idft(double *re, double *im, int num, int flag)
{
略
for(i=0; i<num; i++){
temp_re[i] = temp_im[i] = 0.0;
}
if(flag==IDFT)coefficient=num;
else coefficient=1;
for(i=0; i<num; i++){
for(j=0; j<num; j++){
temp_re[i] += re[j]*cos(2*PI*i*j/num) + flag*im[j]*sin(2*PI*i*j/num);
temp_im[i] += -flag*re[j]*sin(2*PI*i*j/num) + im[j]*cos(2*PI*i*j/num);
}
temp_re[i] /= coefficient;
temp_im[i] /= coefficient;
}
for(i=0; i<num; i++){
re[i] = temp_re[i];
im[i] = temp_im[i];
}
略
}
お礼
KENZOUさん。わざわざありがとうございます。 やっぱりそうなりますよねぇ。