フーリエ変換


院試に向けた物理数学の勉強をしている最近。


僕のブログの備忘録というか、独り言、しかもイキった記事が意外にアクセス集めている。まあアクセスを集めているだけで、しっかり読んでも得るものはないに等しいw


そんな物理数学、僕の使っている参考書の最後の章に出てくるのがフーリエ変換だ。

式とか定義は面倒だから(正確には今書いていて非常に眠いから)省略する。


フーリエ変換は信号処理関係でよく使われる。

まあ、パソコンでやる以上、物理数学の参考書で解くような連続の関数=アナログ信号ではなくて、デジタル信号だから離散フーリエ変換にあたる。


ということで、離散フーリエ変換をpythonで作ってみた。

import numpy


def dft(x):
    
    S = []
    
    for k in range(len(x)):
        
        s = 0
    
        for i in range(len(x)):
    
            s = s + x[i] * np.exp((-1j * 2 * np.pi / len(x)) * i * k)
 
    S = np.append(S,s)
    
    return S


蛇足かもしれないが、一応discrete fourier transformだからdftにしてある。


恐らくこれで合ってるはず。と偉そうに書いたが、離散フーリエ変換の式をpythonのnumpy を大いに利用して書き下しただけだ。


投稿場所については、はてなブログでも良かったんだけど、noteの方も少しずつ更新しておきたい気持ちがあり、そうは思っても旅行ネタで上げる写真もないから、汚いコードをさらしてしまうという見事なまでの悪循環w


離散フーリエ変換だとデータ数が多くなると計算時間が膨大にかかる。僕のコードじゃなくて行列をうまい感じに使えたりしたら、計算量のオーダーが減るかも。今はそこまで頭が回っていないw


逆変換についても気が向いたら載せる。

pythonのnumpyには高速フーリエ変換(FFT)のライブラリがあるから、けっきょくそっちを使う方が多いかもしれない。

とは言ってもFFTはFFTでデータ数が2の階乗だったり、高速化故に色々な弊害があるんだとか。

まあ、離散フーリエ変換した後にグラフに図示する場合、numpyのFFTにx軸周波数にするライブラリもある。




おまけで離散時間フーリエ変換の図示する関数。多分これであってるはず。


import numpy
import matplotlib.pyplot as plt

def dtft(x,w):

    S = 0

    for i in range(len(x)):

        S = S + x[i] * np.exp(-1j * w * i )

    plt.plot(w,np.abs(S))
    plt.show()






この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

1
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。