前提・実現したいこと
先月からpythonを勉強し始めた者です.今までプログラムのプの字も触れてこなかったので,おかしな点がありましたらご指摘お願いいたします.
気象庁の強震観測データから,フーリエスペクトルの図を再現したいです.
様々な方のFFTに関するの記事を拝見・拝借させていただき,少しでも再現できるように努力したのですが,図の概形は再現できても細かい値,特にフーリエスペクトルの軸がどうしても再現することができません.(エラーは発生していません)
以下に自分が再現したい気象庁の図と,様々な方の記事を参考に作成したソースコード・その実行結果を乗せるので,どこを直せば再現できるかのアドバイスをいただきたいです.
図の説明
図1:自分が再現したい図(右上の図です) 引用①
図2:一枚目の各図の説明 再現したいのは,この図でいう8です 引用②
図3:実行した結果
図2 一枚目の各図の説明 再現したいのは,この図でいう8です
【補足】
複数のサイトを参考に作成したものなので,変な書き方になっているかもしれないです
(引用①:
https://www.data.jma.go.jp/svd/eqev/data/kyoshin/jishin/2102132307_fukushima-oki/wave/wav20210213000157015.png
引用②:
https://www.data.jma.go.jp/svd/eqev/data/kyoshin/jishin/kaisetsu.html)
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
python
1 2import numpy as np 3import matplotlib.pyplot as plt 4import pandas as pd 5%matplotlib inline 6 7# 簡単な信号の作成 8N = 30000 # サンプル数 9dt = 0.01 # サンプリング周期(sec):100ms =>サンプリング周波数100Hz 10 11t = np.arange(0, N*dt, dt) # 時間軸 12fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数) 13 14# CSVのロード 15df = pd.read_csv("/content/drive/MyDrive/spe-ana/quake-CSV/2021-0213-NIHONMATSU.csv",skiprows=6) 16 17# 1列目の加速度データを参照 18freq = df.iloc[:,0] 19 20# 高速フーリエ変換(FFT) 21F = np.fft.fft(freq) 22 23# FFTの複素数結果を絶対に変換 24F_abs = np.abs(F) 25 26# 振幅をもとの信号に揃える 27F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍 28F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要 29 30#単位のつじつま合わせ 縦軸(フーリエスペクトル gal・sec) 31FS = (F_abs_amp) * t 32 33#周波数(freq.)を周期(period)に変換 34peri = 1/fq 35 36# グラフ表示 37fig = plt.figure(figsize=(12, 4)) 38 39# 信号のグラフ(時間軸) 40ax2 = fig.add_subplot(121) 41plt.xlabel('time(sec)', fontsize=14) 42plt.ylabel('Gal(cm/s^2)', fontsize=14) 43plt.plot(t, freq) 44plt.xlim(10,100) 45plt.ylim(-650,650) 46plt.grid() 47 48# FFTのグラフ(周期軸) 49ax2 = fig.add_subplot(122) 50plt.xlabel('period(sec)', fontsize=14) 51plt.ylabel('Fourier Spectrum(Gal sec)', fontsize=14) 52plt.plot(peri[:int(N/2)+1], FS[:int(N/2)+1]) # ナイキスト定数まで表示 53plt.grid() 54 55#両対数表示 範囲指定 56plt.yscale("log") 57plt.xscale("log") 58plt.xlim(0.01,100) 59plt.ylim(0.01,1000) 60
試したこと
29行目
単位のつじつま合わせ 縦軸(フーリエスペクトル gal・sec)
FS = (F_abs_amp) * t
で,F_abs_ampを2乗したり(F_abs_amp → F_abs_amp ** 2),そもそもtをかけないパターンも試したのですが,特に目標に近づくことはありませんでした.
補足情報(FW/ツールのバージョンなど)
pythonは先月時点で入れたので,当時の最新バージョンだと思います.
また,Google colab.で作成・実行すべてを行っています.
知り合いにおすすめされたもので,特にこだわりがあるわけではありません.
平滑化・カットオフ等のフィルター処理は省いております.
最初はどちらとも行っていたのですが,ややこしくなってとりあえず素の状態を確かめたくて無くしました.それが原因だったら申し訳ありません.
ひとえに自分の勉強不足によるところだと自覚しております.どうか初心者にもわかるご説明をお願いいたします.