2019年12月17日火曜日

Fourier Transform in Python

先週末から触っていたフーリエ変換。結局、Python を使いました。

有限複素フーリエ係数Ck。Nで割る前の値が出ます。
Ck=np.fft.rfft(data)/N

周波数。ここまではいつも通り。
freq=np.fft.rfftfreq(N,d=1./fs)

躓いたのがランニングスペクトル(スペクトログラムという方が正解でしょうか)。scipyでの計算結果が EXCEL の計算結果と一致せず、最初は何の値が吐き出されているのかわかりませんでした。

from scipy import signal
freqs, length, Sx = signal.spectrogram(data, 
                                       fs=fs, 
                                       nperseg=segment,
                                       noverlap=segment-1,
                                   #raw-data
                                       window=('tukey', 0.), 
                                   # Remove linear trend along axis from data.
                                        detrend = False,
                                  # power spectral density(V**2/Hz)
                                  # or power spectrum (V**2) 
              scaling='spectrum', 
            #mode='magnitude'
                                    )

windowを削り、傾き補正を削り、スペクトルを指定すると、結果が一致。デフォルトではこれらが指定されていたため、明記しないと外れませんでした。

得られる値は Power。継続時間 T=ndt は乗じられていません。
この T や N が乗じられているか否かは式を見ないとわからないのですが、明記されていない場合があります(今回もそうでした)。
プロに聞けば、それぞれの流儀があるそうです。地震分野でも「私は乗じない」と言われる方がいらっしゃるそうで、決まりはないとのこと。ま、Nの場合は逆算する際に気を付けておけば良いだけですので、あまり気にする必要はないのでしょう。

EXCELでのミスも見つかりました。Power の最初と最後は2倍しない、など。数式を見直すと、確かにそのようになっていました。
初心者は手を動かさないと正解にたどり着けません。EXCEL で整理し、Python で答え合わせをしました。これで次は大丈夫でしょう。


0 件のコメント:

コメントを投稿