バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回はやっとVTIチャートに対してFFT、IFFTをブチかましたところ。
問題無く周波数特性が取れ、そこから再度VTIチャートに逆変換できることもできた。
しかし、VTIチャートの周波数特性がちょっと今後の進め方に取って都合が悪いような・・・。
そこは兎も角として、前回のMATLABで実施したFFT、IFFTをPythonでも実施してみる。
登場人物
博識フクロウのフクさん
イラスト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
VTIチャートにFFT、IFFTをブチかます。(Python版)
なんか、前回は最後に意味深なこといってたけど、
その前に同様のことをPythonでも出来るようにしておくんだよね?
そうそう。
ちゃんと毎回Python側も確認していかないと、
MATLABだけで話が進みかねないからね。
(それはフクさんが勝手にMATLABでガシガシ進めちゃうからだな)
Pythonコード
そして、MATLABコードの流れを元に作って来たPythonコードがこれだ
import numpy as np
import matplotlib.pyplot as plt
VTI=np.loadtxt('VTI.csv',delimiter=',') # 変換用波形読み込み
N=len(VTI)
L=N/2
x=np.linspace(-L,L-1,N)
ft=VTI
fig = plt.figure()
# 変換前波形
ax1 = fig.add_subplot(4, 1, 1)
ax1.plot(x,ft)
ax1.set_title('f(t)')
ax1.grid()
# FFT後にローテーション
Fw=np.fft.fft(ft)
Fw_tmp = np.roll(Fw,int(L))
ax2 = fig.add_subplot(4, 1, 2)
mask = (-50<=x) & (x<=50)
ax2.plot(x[mask],np.abs(Fw_tmp[mask]))
ax2.set_title(r'$F(\omega)$')
ax2.grid()
# 拡大
ax3 = fig.add_subplot(4, 1, 3)
mask = (0<=x) & (x<=10)
ax3.plot(x[mask],np.abs(Fw_tmp[mask]))
ax3.set_title(r'$F(\omega)$')
ax3.grid()
# IFFT前にローテーション
fx=np.fft.ifft(np.roll(Fw_tmp,int(L)))
ax4 = fig.add_subplot(4, 1, 4)
ax4.plot(fx.real, 'r',lw=4 )
ax4.plot(ft,'b',lw=2 )
ax4.set_title('f(x)')
ax4.grid()
plt.show()
動作結果
で、動作結果がこれ。
当然と言えば当然だけど、MATLABの時と同じ結果だね。
これで、MATLAB、Python(Numpy)で同じレベルで実験を進めて行けそうだ。
あと、csv読み込みはNumpyで出来たんだね。
他にもcsv読み込みの手段はあるが、
今回はNumpyでやってみた。
ってところだ。
で、前回の謎の発言は?
それは次回改めて説明しよう。
まとめ
まとめだよ。
- Python(Numpy)でVTIチャートにFFT、IFFTをブチかます。
- MATLABと同一の結果が得られた。
- これによりMATLABとPython(Numpy)の両方で同じレベルで実験が進められる。
- Numpyにcsv読み込みの機能がある。
- 他にも手段はあるが、今回はNumpyで実施。
バックナンバーはこちら。
コメント