前回の続き。
これはpsd関数のオプションというわけではないが、Welch法ではなく、得られたスペクトル密度を畳込みによって平滑化してみる。
平滑化にはscipyのcookbookの例にあるsmooth関数を用いる。
平滑化にはスペクトルの周波数の解像度を下げるかわりに統計的自由度を上げる働きがある(見延、2001; Hartmann 2008)。
平滑化には1-2-1フィルタを用いる。numpyでは5点bartlett関数を使うと良い(両端が0)。
import numpy as np print np.bartlett(5)[ 0. 0.5 1. 0.5 0. ]
以下がプログラム例。
黒線がもとのスペクトル密度。
赤線が平滑化したスペクトル密度。
(れいによって2年目と7年目の周期に当たるところに縦の点線)
from read_NINO import read_NINO import matplotlib.mlab as mlab import matplotlib.pyplot as plt import numpy as np data=read_NINO() x=data["NINO3 ANOM"] #original Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12) # Smooth by 1-2-1 filter from cookb_signalsmooth import smooth # from Scipy cookbook Pxx2=smooth(Pxx[:,0],5,'bartlett') #plot plt.figure() plt.loglog(f,Pxx,'k-o') plt.loglog(f,Pxx2,'r-+') plt.loglog([1./2.,1./2.],[1.E-6,1.E1],'k--') #vertical line for 2 years plt.loglog([1./7.,1./7.],[1.E-6,1.E1],'k--') #vertical line for 7 years plt.savefig("NINO_psd_smooth.png") plt.show()
参考文献
見延 2001:大 気海洋物理学特論4 大気海洋統計データ解析 第3章
Hartmann 2008:ATM552 講義ノート第6a章
0 件のコメント:
コメントを投稿