バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回はPythonPython(Numpy)によるベクトルのローテーションを実験。
特に問題なくできた。
が、Numpyのベクトル仕様については注意が必要。
以下3種類のベクトルの概念があり、無印のベクトルは行列由来の転置等の演算が効かない。
- ベクトル
- 行ベクトル
- 列ベクトル
今回は実際にFFT出力の周波数分布をローテーションしてみる。
登場人物
博識フクロウのフクさん
イラスト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
Python(Numpy)でFFT出力の周波数分布をローテーション
太郎くん
じゃ、サクっとよろしく。
フクさん
(私がやるのか…。まぁ作って来たけど)
フクさん
コードはこんな感じだ。
import numpy as np
import matplotlib.pyplot as plt
N=1024
L=np.pi
x=np.linspace(-L,L,N)
k=np.arange(-N/2,N/2)
ft=np.sin(x)+np.sin(3*x)+np.sin(7*x)
fig = plt.figure()
# 変換前波形
ax1 = fig.add_subplot(2, 1, 1)
ax1.plot(x,ft)
ax1.set_title('f(t)')
# FFT後にローテーション
Fw=np.fft.fft(ft)
Fw_tmp = np.roll(Fw,int(N/2))
ax2 = fig.add_subplot(2, 1, 2)
mask = (-10<=k) & (k<=10)
ax2.plot(k[mask],np.abs(Fw_tmp[mask]))
ax2.set_title(r'$F(\omega)$')
plt.show()
太郎くん
当然と言えば当然だけど、MATLABと流れは一緒だね。
フクさん
そうだね。
まぁローテーションの値とか明確に整数型としないといけないとかちょっとした差はあるけどね。
太郎くん
あ、ホントだ。
整数型でキャストしてる。
結果
フクさん
そして結果がこれだ。
太郎くん
MATLABの時と同じく、負の周波数側に複素共役を持ってこれたね。
ちゃんと
1[Hz]、-1[Hz]
3[Hz]、-3[Hz]
7[Hz]、-7[Hz]
になってる。
フクさん
これで超簡易バンドパスフィルタの事前準備が整ったことになる。
まとめ
フクさん
まとめだよ。
- Python(Numpy)でFFT出力の周波数分布をローテーションするコードを作成。
- 上記の動作確認。
- MATLABの結果と同じく、負の周波数側に複素共役を持ってこれた。
- これで超簡易バンドパスフィルタの事前準備が整った。
バックナンバーはこちら。
コメント