【FFT】MATLAB、Pythonで株価予測 その33【IFFT⑫】

【FFT】MATLAB、Pythonで株価予測 その33【IFFT⑫】 株価予測
【FFT】MATLAB、Pythonで株価予測 その33【IFFT⑫】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/

はじめに

前回までで、MATLAB、Python(Numpy)による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

MATLABで超簡易バンドパスフィルタ

太郎くん
太郎くん

じゃ、ついにバンドパスフィルタをやるところだね。

フクさん
フクさん

そうそう。
前回までで、FFTと周波数分布のローテーションは終わってるから、
特定周波数の抽出とIFFTをやるだけだ。

太郎くん
太郎くん

まるで簡単なような言い方してるけど、あまり簡単だった試しが無いんだよなぁ。

フクさん
フクさん

そんなことは無いよ。
少なくともIFFTはすでにやってるものだし、
太郎くんから見て不明点は「特定周波数の抽出」の部分だけだと思うよ。

太郎くん
太郎くん

そうそう!そこそこ!

フクさん
フクさん

まぁこれもコードで見れば一行で終わるやつだから。

太郎くん
太郎くん

ということは、チョロいってことで良さそうか。

フクさん
フクさん

ちょっと通常の書き方とは違うかもいしれないけど。

太郎くん
太郎くん

(やっぱり罠がありそう・・・。)

MATALBコード

フクさん
フクさん

じゃ、作って来たコードだ。

N=1024;
L=pi;
x=linspace(-L,L,N)';
k=-N/2:N/2-1;
ft=sin(x)+sin(3*x)+sin(7*x);

% 変換前波形
subplot(4,1,1)
plot(x,ft)
title('f(t)');
grid();

% FFT後にローテーション
Fw=fft(ft);
Fw_tmp=circshift(Fw,N/2);
subplot(4,1,2);
mask = (-10<=k & k<=10);
plot(k(mask),abs(Fw_tmp(mask)));
title('F(\omega)');
grid();

% 特定周波数のみ抽出
Fw_Filter=Fw_tmp;
Hz = 3;
Low = Hz-0.1;
High = Hz+0.1;
Fw_Filter( k< -High | (-Low < k & k <= 0) | (0 <= k & k < Low) | High < k)=0;

subplot(4,1,3);
mask = (-10<=k & k<=10);
plot(k(mask),abs(Fw_Filter(mask)));
title('F(\omega) Filter');
grid();

% IFFT前にローテーション
Fx = (ifft(circshift(Fw_Filter,N/2)));
subplot(4,1,4);
plot(x,real(Fx));
title('f(x)');
grid();

結果

フクさん
フクさん

そして、結果だ。

MATLABでバンドパスフィルタ3Hzだけ取り出し、f(t)、F(ω)、f(x)
太郎くん
太郎くん

おー!
ちゃんと3Hzだけ取り出せてる!

フクさん
フクさん

というわけで、
無事、バンドパスフィルタができたというわけだ。

コードを見てると?

太郎くん
太郎くん

ちょっと疑問に思ったのだけど、
おそらく周波数分布で3[Hz]と-3[Hz]以外を0にしてる部分のコードが妙なことになってるように見える・・・。

Fw_Filter( k< -High | (-Low < k & k <= 0) | (0 <= k & k < Low) | High < k)=0;
フクさん
フクさん

あー、そこね。
論理インデックス検索って書き方だな。

太郎くん
太郎くん

なんだそれは?

フクさん
フクさん

やはりそこで引っかかったか。
じゃ、次回はそこは少し掘り下げよう。

太郎くん
太郎くん

(こうなることを知っててやりやがったな・・・。)

まとめ

フクさん
フクさん

まとめだよ。

  • MATLABで超簡易バンドパスフィルタ実施。
    • コード開示&結果確認。
    • 想定通り、3Hzだけ抽出で来た。
  • 3[Hz]と-3[Hz]以外を0にしてる部分のコードが妙。
    • 論理インデックス検索という手法を使っている。

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

コメント

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