有限複素フーリエ係数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 件のコメント:
コメントを投稿