前回の続き。
これは単なるテクニカルなオプションだが、メモのために記しておく。
*scale_by_freq*: boolean
Specifies whether the resulting density values should be scaled by the scaling frequency, which gives density in units of Hz^-1. This allows for integration over the returned frequency values. The default is True for MatLab compatibility.
今まで使ってきた下のような例では、もとは月単位のデータを年単位のデータにしたときに(Fs=12)、自動的に12で割っている(scale_by_freq=Trueがデフォルト)。
すなわち、周波数が(1/2,1/3,1/4, ......)(月単位)の時のスペクトル密度(Pxx2,scale_by_freq=False)の場合と、周波数が(6,4,3, ....)(年単位)の時のスペクトル密度Pxx(scale_by_freq=True)の積分が一致するように
Pxx=Pxx2/12
の関係がある。下のグラフのようにPxx(黒線)とPxx2/12(赤線)とは一致する。
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"]
Pxx,f=mlab.psd(x, NFFT=len(x),Fs=12)
Pxx2,f2=mlab.psd(x, NFFT=len(x),Fs=12,scale_by_freq=False)
plt.figure()
plt.loglog(f,Pxx,'k')
plt.loglog(f2,Pxx2/12.,'r--')
plt.loglog([1./7.,1./7.],[1.E-9,1.E2],'k--')
plt.loglog([1./2.,1./2.],[1.E-9,1.E2],'k--')
plt.savefig("NINO_psd_scale.png")
plt.show()

0 件のコメント:
コメントを投稿