【FFT】MATLAB、Pythonで株価予測 その24【IFFT③】

【FFT】MATLAB、Pythonで株価予測 その24【IFFT③】 株価予測
【FFT】MATLAB、Pythonで株価予測 その24【IFFT③】

バックナンバーはこちら。
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)');

実行結果

フクさん
フクさん

そして実行結果だ。

MATLABでsin波をサンプリング期間を延ばした上でFFT&IFFT、f(t)、F(ω)、Fωexpansion、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周期とした周波数である点に注意。
      • 物理的な周波数とは異なる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました