|
ひとつ前へ WWWルートへ mad@mail.wind.ne.jp 計測震度計算ソフトの解説 株式会社 数理設計研究所 Hal.T 2006/11/07 |
Index |
計測震度 気象庁が公開しているアルゴリズム(計算法)によって計算した値 ガル 加速度 1cm/s2 が 1ガル 重力加速度 地域によって少し異なりますが、国際標準では980.665cm/s2として扱います 京都大学地質学鉱物学教室重力室(国際其準点)におけるgの値=9.7970727m/s2
東京大学理学部化学館地下原点室におけるgの値=9.7978872m/s2(理科年表2000)
計測震度は、震度計内部で以下のようなディジタル処理によって計算されます。 気象庁の解説WEB URL
- ディジタル加速度記録3成分(水平動2成分、上下動1成分)のそれぞれに、フーリエ変換・フィルター処理・逆フーリエ変換の手順で、以下に示す特性のフィルターを掛ける。
- 計測震度の計算で使われているフィルター処理は、周波数 0.5 - 10Hzの範囲で地震動の加速度と速度の中間の波形を求めていることに相当します。つまり、両対数のグラフ上で見ると、このフィルターの特性曲線の傾きが上の周波数範囲で -1/2 となっています。また、1.0Hz で倍率が1となるよう定数が選ばれています。また、フィルターの式は、以下の3つの部分からなります。
- SQRT(1/F)
- 1/SQRT(1+0.694*X**2+0.241*X**4+0.0557*X**6+0.009664*X**8+0.00134*X**10+0.000155*X**12)
- SQRT(1-EXP(-(F/0.5)**3))
- ここで、Fは周波数(Hz)、XはF/10です。1は上で述べた加速度と速度の中間の特徴を表すフィルター、2はハイカットフィルター、3はローカットフィルターです。
- 従来から用いられてきた、最大加速度を震度に換算するいわゆる河角の式との違いは、加速度記録に低周波数側を強調する上記のようなフィルターを施したうえ、最大値そのものではなく0.3秒以上継続する値を使う点です。
- 得られたフィルター処理済みの記録3成分から、ベクトル波形を合成する。
- ベクトル波形の絶対値がある値 a 以上となる時間の合計を計算したとき、これがちょうど 0.3秒となるような a を求める。
- この a から I = 2 log a + 0.94 により計測震度 I を計算する。
「 震度を知る」 −知識とその活用− 気象庁監修 A5版・238ページ 定価3,000円
言語: C++のクラスライブラリとして提供します。他の言語への変換はご自分でしてください
コンパイラ: ボーランドのC++ビルダ Ver5
ライブラリ: 数理設計研究所の行列・ベクトル計算パッケージ(vecmath.h)をテンプレートとし、FFTパッケージも使います
sindo.h sindo.cpp
class Sindo_Base 基本クラス 気象庁の計測震度をそのまま実現している
class Sindo : public Sindo_Base 実用するクラス 周囲雑音を適当に排除するアルゴリズムを追加したもの
どちらを使っても計測震度としては問題ない。計測震度の実証試験は公表されている新潟中越地震と阪神大震災の地震波形で同じ値になることを確認した。
関数の使い方:
データ投入→100SPS観測してV3D(3元ベクトル)にgalの単位にしてひとつづつ、またはn個のパッケージにしてset_galを呼び出す。
帰り値が1なら必ず計測震度を引き取ること。。計測震度は呼び出すたびにゼロクリアされる。
int set_gal(V3D gal);
int set_gal(V3D *gal, int n);
上記の帰り引数が1ならば、計測震度を得ることができる、計算そのものは終わっている
double get_sindo(void);
class Sindo : public Sindo_Base には周囲環境の微細振動を差し引くことができるので、記憶をリセットする関数もある
void reset_noise(void);
既定値set_gal 内部アルゴリズム Sindo_Base判
- 100SPS 毎秒100サンプル
- 内部バッファのサイズ=FFT計算のサイズ=2048であり、100SPSならば20.48秒
- 計測震度の算出間隔=50サンプル単位=0.5秒毎に計算する
Calc には Sindo_Base判とSindo判の2種がある。上記解説はSindo_Base判である。Sindo判は周囲雑音をエネルギーとして蓄積し、これを差し引く操作が入っている。実用的には気象庁発表の震度情報に良くあった値を示すが、計測震度の計算としては標準ではない。しかし、気象庁の観測拠点のように静かな場所に置く事ができない一般向けの計測震度計算機として良い手法であるかもしれないと思って実験中である。
- 持ち込まれた観測値が算出間隔50個より小さければ、そのサイズ、大きければ50個、過去のバッファを動かして空きを作り、そこに新しい値をコピーする。残り数がなくなるまで以下の処理をする。X,Y,Zそれぞれのバッファを計算用にコピーしてCalcを呼び出す
- Calc内の処理 このCalc内で計測震度の計算をしている
- X,Y,ZそれぞれについてFFTして周波数軸に変換
- 気象庁ご推薦のフィルタ係数(あらかじめ初期化してある)を乗算
- X,Y,ZそれぞれについてIFFTして時間軸に戻す
- X,Y,Zの絶対値を作り、IFFTした際の規格係数を乗算
- 継続時間を考慮した振幅の決定 → 最大値を調べて、最大値をてがかりに分解能4000のヒストグラムを作成
- ヒストグラムの上位から探索し、0.3秒分=30個になるgal値を求め
- KeisokuSindo = 2.0 * log10(kg) + 0.94; で計測震度値を更新する
- round(KeisokuSindo, 1); これは小数点1位で四捨五入するテンプレートである。
小数点3位にしたいのなら round(KeisokuSindo, 3); と変更せよ- Calcで計算した計測震度が、set_galに入ってきたときより大きければ1を持ち帰る・・・・つまり新しい計測震度!
..end