バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回はMATLABでsin波に対してFFT,IFFTを実施。
元に戻ることは確認できた。
特定周波数を取り出す際はFFT出力の後半部分の複素共役も一緒に取り出す必要がある。
引き続きsin波をベースにいろいろ試してみる。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
周期を伸ばしてみる
前回はsin波を\(-\pi~\pi\)のいわゆる三角関数の1周期で試した。
そうだね。
じゃー、この期間を\(-\pi~\pi\)を\(-2\pi~2\pi\)とした場合、
FFTの結果はどうなるだろうか?
んー?
元々のsin波は\(sin(x)\)のままなんだよね?
そうだよ。
じゃー、変わらないんじゃない?
不正解。
なんで?!
MATLABで周期を伸ばして実験
まぁ実際に試してみよう。
コードを提示するが、周期以外は前回と変化はない。
N=1024;
L=2*pi;
x=linspace(-L,L,N);
k=0:N-1;
ft=sin(x);
subplot(4,1,1);
plot(x,ft);
title('f(t)');
Fw=fft(ft);
subplot(4,1,2);
plot(k,abs(Fw));
title('F(\omega)');
subplot(4,1,3);
plot(k(1:10),abs(Fw(1:10)));
title('F(\omega) expansion');
fx=ifft(Fw);
subplot(4,1,4);
plot(x,fx);
title('f(x)');
実行結果
そして実行結果だ。
ほら!
周期が伸びた分、sinの山は増えたけど、FFTの結果は変わら・・・
あれ?
前回は1[Hz]だったけど、今回は2[Hz]ってことになってる?!
ここら辺はDFTの時にさらっと説明はしたと思うのだけど、
入力サンプリングを1周期と見なした上での周波数になるんだよね。
つまり、サンプリングの期間だけを伸ばして、元のsin関数が変わらなければ、
伸ばした分、元のsin関数の振動が増えたことと同義になり、
今回の結果で言えば、2倍の周波数として取得されることになる。
なんでこんな仕様に・・・。
まぁこれも複素フーリエ係数由来の仕様だねぇ。
特に畳み込み積分期間を\(2\pi\)から\(2L\)の拡張したタイプの複素フーリエ係数だけど。
というわけで、DFT、FFTに於ける周波数は物理的な周波数とは異なるってことに注意が必要だ。
まさかこんな罠があるとは・・・。
まとめ
まとめだよ。
- 引き続きsin波をFFTに入れる実験継続。
- 今回は入力期間を2πから4πに増やしてみた。
- これにより、結果的に期間内のsin(x)の振動は増える。
- よって、FFTの結果としてのsin(x)の周波数は1Hzではなく2Hzとなる。
- あくまで、入力サンプリングを1周期とした周波数である点に注意。
- 物理的な周波数とは異なる。
バックナンバーはこちら。
コメント