バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、フーリエ変換をプラグラム化するにあたって、
数式のどの部分がベクトルとするのかを明確にした。
ベクトル要素数はNで表現することでなんとか辻褄を合わせる予定。
今回は、それらの情報を元にプログラム化する数式を起こす。
登場人物
博識フクロウのフクさん
イラスト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
フーリエ変換のプログラム化は可能?
で、フーリエ変換のプログラム化はできた?
まだできん!
予想以上に頭がこんがらがって今なんとか整理が付いたところだ。
ということは、できそうな目途が立ったって感じか。
まぁそうかな。
とりあえず簡単に説明しよう。
プログラム化に向けての数式変換
まずは元のフーリエ変換と逆フーリエ変換を再掲
■ フーリエ変換
\(\displaystyle \color{red}{F(\omega)}=\int^{\pi}_{-\pi} \color{red}{f(t)}e^{-i\color{red}{\omega} t}dt\)
■ 逆フーリエ変換
\(\displaystyle \color{red}{f(x)}=\frac{1}{2\pi}\int^{\infty}_{-\infty}\color{red}{F(\omega)}e^{i\omega \color{red}{x}}d\omega\)
そしてプログラム向けに解釈を変えた版。
\(N\)は各ベクトルの要素数。(任意で設定可)
\(\displaystyle \Delta t=\frac{2\pi}{N}\)
\(\displaystyle \Delta \omega=\frac{\omega_{max}}{\frac{N}{2}} \)
\(\omega_{max}\)は最大周波数(任意で設定可)
\(x=t\)とする。
\(
\displaystyle
\left[\begin{array}{c}
F\left(x_{-N/2}\right) \\
\vdots \\
F\left(x_{N/2}\right)
\end{array}\right]^{T}=\left[\begin{array}{c}
f\left(x_{-N/2}\right) \\
\vdots \\
f\left(x_{N/2}\right)
\end{array}\right]^{T}\left[\begin{array}{ccc}
e^{-i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{-N / 2} t_{N / 2} \pi} \\
\vdots & \ddots & \vdots \\
e^{-i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{N / 2} t_{N / 2} \pi}
\end{array}\right] \Delta t
\)
\(
\displaystyle
\left[\begin{array}{c}
f\left(x_{-N/2}\right) \\
\vdots \\
f\left(x_{N/2}\right)
\end{array}\right]^{T}=\frac{1}{2 \pi}\left(\left[\begin{array}{c}
F\left(\omega_{-N/2}\right) \\
\vdots \\
F\left(\omega_{N/2}\right)
\end{array}\right]^{T}\left[\begin{array}{ccc}
e^{i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{-N / 2} t_{N / 2} \pi} \\
\vdots & \ddots & \vdots \\
e^{i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{N / 2} t_{N / 2} \pi}
\end{array}\right]\right) \Delta \omega
\)
数式を見て・・・。
ぎゃーーーーーー!!!
なんじゃこりゃーーーー!!!
プログラム化するにあたって、以下が必要なんだよね。
- 積分をΣで解決する。(リーマン積分)
- 関数をベクトルと解釈する。
- 畳み込み積分は内積で解決。
これらの結果が上の数式やつ。
これがプログラムになるのか?!
まぁ関数はベクトルと解釈するし、
それぞれの要素数も\(N\)で切りそろえてるから、十分可能だとは思うよ。
じゃー、頑張って!
(うーん。まぁいいんだけど・・・。)
まとめ
まとめだよ。
- フーリエ変換のプログラム化の前に数式レベルでいろいろ解決。
- 積分をΣで解決する。(リーマン積分)
- 関数をベクトルと解釈する。
- 畳み込み積分は内積で解決。
- ベクトルのそれぞれの要素数をNで切りそろえているのでそれほど複雑にはならないはず。
バックナンバーはこちら。
コメント