ケースの作成
ゲインアンプ付きA/Dコンバータ(SX8725C)を用いた簡易地震計の製作 1(製作編)
ゲインアンプ付きA/Dコンバータ(SX8725C)を用いた簡易地震計の製作 2(ノイズ対策)
上記の記事で大体の形が出来てきたので、ケースに入れて使いやすくした。コモンモードコイルは1Hzのノイズに対して除去効果が無かったため取り外した。
長期観測試験
ケースも完成したところで、少し長い時間の測定を行ってみた。自然地震の観測にはロマンがあるが、むしろノイズでも原因の分かる振動が録れた方が好都合なので、そのまま自宅の床でテストする。日中と夜間ではノイズも大きく変わる事が予想されるので、24時間程度連続で稼働することにした。
波形のリアルタイムモニタは後回しとして、簡単なシリアルモニタを作成してデータを保存する。タイムスタンプはとりあえずPC時刻(JST)にした。
from datetime import datetime
import serial
dt_now=datetime.now()
fnb = dt_now.strftime('%Y%m%d%H%M%S')
fn = fnb + ".csv"
ser = serial.Serial("/dev/cu.usbmodemXXXXXX", 9600)
f = open(fn, 'a')
while True:
dtnow = datetime.now()
line = ser.readline().decode('utf-8').rstrip()
out = str(dtnow) + "+09:00, " + line + "\n"
print(out, end="")
f.write(out)
ser.close()
さすがにCSVでは地震記録として扱いにくいので、収録を終えた後にSAC形式とmseed形式に変換した。一応、ドラム記録や最新時刻のスペクトログラムなども吐き出すようにしてみた。
from obspy import read
from obspy import Stream, Trace
from obspy.core import UTCDateTime
import pandas as pd
import os
import matplotlib.pyplot as plt
import datetime as dt
import sys
outputdir='./'
args = sys.argv
inputfile = args[1]
outputdir = args[2]
dataFileLoc = "./" #location of the ascii file
basename = os.path.splitext(os.path.basename(inputfile))[0]
df1 = pd.read_csv(inputfile, header=None, names=('datetime','Z'),parse_dates=['datetime'])
df1 = df1.set_index('datetime', drop=True)
stnName = "HOM"
print(df1)
statsZ = {}
statsZ['network'] = "HOME" #fake network name
statsZ['station'] = stnName
statsZ['component'] = 'Z'
## Station location
statsZ['stla'] = 34
statsZ['stlo'] = 135
## Event location
statsZ['evla'] = 34
statsZ['evlo'] = 135
statsZ['evdp'] = 0
dt = UTCDateTime(df1.index[0])
sdt = dt
statsZ['starttime'] = sdt
statsZ['sampling_rate'] = 100.0
trZ = Trace(data=df1['Z'].values, header = statsZ)
st = Stream(traces=[trZ])
print(st)
## Write the stream to file
st.write(os.path.join(dataFileLoc, f"{basename}-Z-obspy.mseed"), format="MSEED")
st.write(os.path.join(dataFileLoc, f"{basename}-Z-obspy.sac"), format="SAC")
## Plot the stream
stFig = st.plot(show=False,
size=(1500,600), number_of_ticks=6,
type='relative', tick_rotation=60, handle=True,
linewidth = 0.3, starttime=sdt)
plt.savefig(os.path.join(outputdir, f"{basename}-Z-obspy.png"), dpi=300)
trZ.plot(type='dayplot', interval=60, color=['k'], vertical_scaling_range=1e2, outfile=(os.path.join(outputdir, f"{basename}_Z.png")))
st_et = UTCDateTime(df1.index[-1])
st_st = st_et - 60
st_r = st.trim(st_st, st_et)
print(st_st)
strFig = st_r.plot(show=False,
size=(1500,600), number_of_ticks=6,
type='relative', tick_rotation=60, handle=True,
linewidth = 0.3, starttime=st_st)
plt.savefig(os.path.join(outputdir, f"{basename}-Z-recent.png"), dpi=300)
st_r.spectrogram(log=True, per_lap=0.8, outfile=(os.path.join(outputdir, f"{basename}_Z_spec.png")))
自前のプロットも悪くないが、Swarmというソフトが便利だ。細切れに録ったデータも一度に扱えるので重宝する。Javaアプリケーションなのでクロスプラットフォームである点も良い。ドラム記録もこのような感じ。
さて記録の例を見てみると、意外にも家屋の振動がよく録れているようだ。夜間は振動が少なく、日中は定期的な振動と静穏の繰り返しとなっている。これは観測した場所が幹線道路沿いにあるため、信号機に制御された自動車交通の振動をモロに見ていると考えられる。
記録の簡単な分析
波形のスペクトルを見てみると、14-15[Hz]前後にピークがあるようだ。気になっていた発振は0.85[Hz]付近にスパイクが出ていて残念。
0.85[Hz]の波は静かな時間で非常に目立つ。やはり、自然地震の観測にはまだまだ低ノイズになるよう工夫が必要という事が分かった。
特性を見る限り、4.5[Hz]計ではなくもっと短周期向けのセンサーだった模様。ダンピング係数はシャント抵抗無しで測定したものから試行錯誤して0.7程度に持って行くことになりそう。