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];
}


}

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#1です。



> 結果は、(元データ単位がVだとして)
> 0Hz 900v 
> 50Hz 1332.5v
> ・・・
> でしょうか

違います。
0Hzは30V(3列目)です。

pow=(re/20)^2+(im/20) 

pow=(re/20)^2+(im/20)^2
の間違いでした。
オイラーの公式知っていますか?
reはreal
imはimaginary
を示しています。
re*cos(θ)+i*im*sin(θ)
のパワーがpowです。
大きさはパワーの平方根でmagです。

”折り返し部分を纏めて”は
08行目のパワーと10行目のパワーは同じ周波数のパワーを示しているので
足しているだけです。
((510/20)^2+(-80/20)^2)*2=1332.5
これはパワーなので大きさに直すと
√1332.5=36.5Vです。

最大100Vの信号なので900Vなんて出るわけありません。

また、分析周波数単位という言葉はわかりませんが、
今回のように
1kHzサンプリングで20サンプルの系列をFFTで20個の周波数の系列に変換した場合、
変換後の周波数分解能は50Hzです。
    • good
    • 0
この回答へのお礼

再度有難うございます
初心者ですみません
内容理解できました

お礼日時:2011/04/28 22:17

#1です。


スペースが全部消えてしまった・・・・。
全角スペースで張り直し。

    re   im   re/20   im/20
00   12   -80   0.6   -4
01   30   -95   1.5   -4.75
02   15   -30   0.75   -1.5
03   -42   58   -2.1   2.9
04   -99   100  -4.95   5
05   -80   58   -4    2.9
06   60   -30   3    -1.5
07   292   -95   14.6   -4.75
08   510   -80   25.5   -4
09   600   0    30    0
10   510   -80   25.5   -4
11   292   -95   14.6   -4.75
12   60   -30    3    -1.5
13   -80   58    -4    2.9
14   -99   100   -4.95   5
15   -42   58   -2.1    2.9
16   15   -30   0.75    -1.5
17   30   -95   1.5    -4.75
18   12   -80   0.6    -4
19   0    0    0     0

折り返し部分のパワーはまとめる。
   freq[Hz]   pow=(re/20)^2+(im/20)   mag=sqrt(pow)
00      
01            
02            
03            
04            
05            
06            
07            
08            
09   0    900    30 
10   50   1332.5   36.5
11   100   471.45   21.71
12   150   22.5    4.74
13   200   48.82   6.99
14   250   99.01   9.95
15   300   25.64   5.06
16   350   5.63    2.37 
17   400   49.63   7.04
18   450   32.72   5.72
19   500   0     0

この回答への補足

回答有難うございます

結果は、(元データ単位がVだとして)
0Hz 900v 
50Hz 1332.5v
・・・

でしょうか
pow=(re/20)^2+(im/20) から
00   12   -80   0.6   -4 のとき
0.6×0.6+(-4)=4.36
ここから”折り返し部分を纏めて”の何かをすると、900になるのでしょうか

また、サンプリング単位50Hzが分析周波数単位と考えてよろしいのでしょうか

すみません、初心者で、よろしかったら教えて下さい

補足日時:2011/04/27 17:17
    • good
    • 0

ソースが解らんところがあるから何とも言えんが・・・。


予想で言うと、re,imを全部20で割って、
更にそれを二乗和取ってパワーを求めて、
パワーの折り返し部分を纏めて、
平方根を取ったらVででると思います。
周波数は1kHzサンプリングで20個のサンプルなので、
50Hz分解能ですね。
下記のような感じ・・見難いかな?

reimre/20im/20
012-800.6-4
130-951.5-4.75
215-300.75-1.5
3-4258-2.12.9
4-99100-4.955
5-8058-42.9
660-303-1.5
7292-9514.6-4.75
8510-8025.5-4
96000300
10510-8025.5-4
11292-9514.6-4.75
1260-303-1.5
13-8058-42.9
14-99100-4.955
15-4258-2.12.9
1615-300.75-1.5
1730-951.5-4.75
1812-800.6-4
190000

折り返し部分のpowはまとめる。
freq[Hz]pow=(re/20)^2+(im/20)mag=sqrt(pow)
0
1
2
3
4
5
6
7
8
9090030
10501332.536.5
11100471.4521.71
1215022.54.74
1320048.826.99
1425099.019.95
1530025.645.06
163505.632.37
1740049.637.04
1845032.725.72
1950000
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q特定の周波数レベルだけ取り出したい

ある時間関数f(t)がありまして、その中から特定の周波数のレベルだけリアルタイムに取り出したいのですが、その処理をするCPUの処理能力に限界がありFFTなどという高級なことはできません。ある一つの周波数についてだけでよいので簡単に取り出す演算方法はないでしょうか。

Aベストアンサー

その周波数の振幅を乗算して、フィルタ関数で
一定周波数以下を抜きだして下さい。

フィルタ関数もめんどうなら、
単に平均化でも大丈夫です。

Q時間領域、周波数領域とはなにか

タイトルそのままですが時間領域、周波数領域について教えてください。
また、その違いについても

Aベストアンサー

時間的に変化する波は、周波数の異なる多数の正弦波の集合(和)として表すことが出来ます。

このためx軸に時間、y軸に波の高さを取ったものを時間領域。
x軸に周波数、y軸にその周波数の波の強さを取ったものを周波数領域と呼びます。

1つの波を時間的変化としてみるのが時間領域、周波数の集まりとしてみるのが周波数領域ということになります。

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)


人気Q&Aランキング

おすすめ情報