Rで常時微動解析

Rで 常時微動解析 を試みます。

1. 常時微動測定と常時微動解析の説明

常時微動とは?

私たちの足元の地面は、地震が起きていないときでも常に非常に小さく揺れています。この微小な揺れを「常時微動(じょうじびどう)」と呼びます。

この揺れの主な原因は、

  • 車の走行や工場の機械など、人間の社会活動による振動
  • 風が建物や樹木を揺らすことによる振動
  • 海の波が海岸に打ち寄せることによる振動

など、自然現象や人工的な要因が混ざり合ったものです。

常時微動測定とは?

常時微動測定とは、この地面の微小な揺れを、高感度の地震計(微動計)を使って数分から数十分程度、記録(測定)する作業のことです。

  • 目的: 地盤の「揺れやすさの個性」を調べることです。具体的には、その地盤が特に揺れやすい周期(卓越周期)を明らかにします。
  • 方法: 3成分(東西、南北、上下)の揺れを同時に記録できる微動計を調査したい地点の地面に設置し、データを収録します。
  • 利点:

    • 手軽で安価: 大掛かりな装置や人工的な振動源(ダイナマイトなど)が不要です。
    • 非破壊: 地面を掘削する必要がありません。
    • 場所を選ばない: 都市部など、騒音がある場所でも測定可能です。

常時微動解析とは?

常時微動解析とは、測定で得られたデータ(3成分の波形)を解析して、地盤の卓越周期を求める作業のことです。最も代表的な解析手法に「H/Vスペクトル比法」があります。

  • H/Vスペクトル比法の原理: 常時微動の揺れは、地下深くの硬い地盤(基盤)から伝わり、地表の柔らかい地盤(表層地盤)で特定の周期の揺れが増幅されると考えられています。H/Vスペクトル比法は、以下の仮説に基づいています。

    1. 水平動(H): 地表での水平方向の揺れ(東西・南北成分)は、柔らかい表層地盤によって特定の周期(卓越周期)が強く増幅されます。
    2. 鉛直動(V): 上下方向の揺れ(上下成分)は、表層地盤による増幅の影響が小さいと考えられています。
    3. 比率の計算(H/V): そこで、水平動の強さ(H)を鉛直動の強さ(V)で割り算します。これにより、震源や伝播経路の影響が打ち消され、表層地盤の増幅特性だけが際立って現れます。
  • 解析の流れ:

    1. 測定した3成分の波形データを、周波数ごとにどれくらいの強さを持つかという「スペクトル」に変換します(フーリエ変換)。
    2. 水平2成分(東西、南北)のスペクトルを合成して、水平動スペクトル(H)を求めます。
    3. 上下成分のスペクトルを、鉛直動スペクトル(V)とします。
    4. 周波数ごとにH/V比を計算します。
    5. 計算したH/V比をグラフにすると、特定の周波数でピーク(山)ができます。
    6. このピークが現れる周波数が「卓越振動数」であり、その逆数(1 / 卓越振動数)が「卓越周期」となります。

この卓越周期が短い地盤は硬く、長い地盤は軟弱であると評価できます。地震の際には、この卓越周期に近い周期を持つ揺れが来ると、共振して非常に大きく揺れる危険性があります。


2. Rコードによるシミュレーション

シナリオ: ある地盤の卓越周期が 0.5秒(卓越振動数は 1 / 0.5 = 2 Hz)であると仮定します。この地盤で常時微動測定を行った場合に得られるであろうデータを模擬的に作成し、H/Vスペクトル比法で解析して、仮定通りの卓越周期(0.5秒)が求まるかを確認します。

1. 常時微動データの模擬的な生成

library(ggplot2)

# シミュレーションのパラメータ設定
fs <- 100 # サンプリング周波数 (Hz)
duration <- 60 # データ長 (秒)
N <- fs * duration # データ点数
t <- seq(0, duration - 1 / fs, by = 1 / fs) # 時間軸

# 模擬する地盤の特性
f_peak <- 2.0 # 卓越振動数 (Hz)
T_peak <- 1 / f_peak # 卓越周期 (秒)

seed <- 20250625
set.seed(seed)


# 鉛直動 (UD) の生成: 単純なホワイトノイズ
ud_signal <- rnorm(N, mean = 0, sd = 1)

# 水平動 (NS, EW) の生成
# もとになるホワイトノイズを生成
base_noise_ns <- rnorm(N, mean = 0, sd = 1)
base_noise_ew <- rnorm(N, mean = 0, sd = 1)

# (2) 2Hzでピークを持つフィルタ(伝達関数)を周波数領域で作成
freq <- seq(0, fs, length.out = N) # 周波数軸

# ガウス型のフィルタを作成(まず正の周波数側のみ)
transfer_function <- exp(-(freq - f_peak)^2 / (2 * (f_peak * 0.2)^2))

# FFTの対称性を手動で構築します。
# 逆FFTした結果が実数になるためには、スペクトルが共役対称である必要があります。
# Nが偶数の場合、FFTの結果は次のような構成になっています。
# - index 1: DC成分 (0 Hz)
# - index 2 から N/2: 正の周波数成分
# - index N/2 + 1: ナイキスト周波数
# - index (N/2 + 2) から N: 負の周波数成分(正の成分の鏡像)
#
# 正の周波数成分 (index 2からN/2) を反転させて、負の周波数成分の位置にコピーします。
if (N %% 2 == 0) { # Nが偶数の場合
  transfer_function[(N / 2 + 2):N] <- rev(transfer_function[2:(N / 2)])
} else { # Nが奇数の場合(今回は該当しませんが、汎用性のために記述)
  transfer_function[((N + 1) / 2 + 1):N] <- rev(transfer_function[2:((N + 1) / 2)])
}

# (3) フィルタを適用
fft_ns <- fft(base_noise_ns)
fft_ew <- fft(base_noise_ew)

fft_ns_filtered <- fft_ns * transfer_function
fft_ew_filtered <- fft_ew * transfer_function

# (4) 逆フーリエ変換で時間領域の波形に戻す
ns_signal <- Re(fft(fft_ns_filtered, inverse = TRUE) / N)
ew_signal <- Re(fft(fft_ew_filtered, inverse = TRUE) / N)

# 生成した時系列データをデータフレームにまとめる
df_timeseries <- data.frame(
  time = t,
  NS = ns_signal,
  EW = ew_signal,
  UD = ud_signal
)

# 生成した波形の一部をプロットして確認
p1 <- ggplot(df_timeseries[1:(fs * 5), ], aes(x = time)) +
  geom_line(aes(y = NS, colour = "NS (水平)")) +
  geom_line(aes(y = EW, colour = "EW (水平)")) +
  geom_line(aes(y = UD, colour = "UD (鉛直)"), linetype = "dashed") +
  labs(
    title = "生成された常時微動データの波形 (最初の5秒間)",
    x = "時間 (秒)", y = "振幅", colour = "成分"
  ) +
  theme_minimal()
print(p1)
Figure 1

2. 常時微動分析 (H/Vスペクトル比法)

# 各成分をフーリエ変換してスペクトルを計算
spec_ns <- Mod(fft(ns_signal))
spec_ew <- Mod(fft(ew_signal))
spec_ud <- Mod(fft(ud_signal))

# 水平動スペクトル (H) を合成
spec_h <- sqrt(spec_ns^2 + spec_ew^2)

# 鉛直動スペクトル (V)
spec_v <- spec_ud

# H/Vスペクトル比を計算
hv_ratio <- spec_h / (spec_v + 1e-9)

# プロット用にデータフレームを作成 (片側スペクトルのみ)
df_hv <- data.frame(
  frequency = freq[1:(N / 2)],
  hv_ratio = hv_ratio[1:(N / 2)]
)

# H/Vスペクトル比をプロット
p2 <- ggplot(df_hv, aes(x = frequency, y = hv_ratio)) +
  geom_line() +
  geom_vline(xintercept = f_peak, color = "red", linetype = "dashed") +
  annotate("text",
    x = f_peak + 1, y = max(df_hv$hv_ratio) * 0.9,
    label = paste0("設定した卓越振動数 = ", f_peak, " Hz"), color = "red"
  ) +
  labs(
    title = "H/Vスペクトル比の計算結果",
    x = "周波数 (Hz)",
    y = "H/V比"
  ) +
  xlim(0, 10) + # 関心のある周波数範囲に絞る
  theme_minimal()
print(p2)
Figure 2

3. 結果の解釈

# H/V比が最大になる周波数を探す
peak_info <- df_hv[which.max(df_hv$hv_ratio), ]
calculated_f_peak <- peak_info$frequency
calculated_T_peak <- 1 / calculated_f_peak

cat("--- 解析結果 ---\n")
cat("シミュレーションで設定した卓越振動数:", f_peak, "Hz\n")
cat("H/Vスペクトル比のピークから計算された卓越振動数:", round(calculated_f_peak, 3), "Hz\n\n")
cat("シミュレーションで設定した卓越周期:", T_peak, "秒\n")
cat("H/Vスペクトル比のピークから計算された卓越周期:", round(calculated_T_peak, 3), "秒\n")
--- 解析結果 ---
シミュレーションで設定した卓越振動数: 2 Hz
H/Vスペクトル比のピークから計算された卓越振動数: 2.067 Hz

シミュレーションで設定した卓越周期: 0.5 秒
H/Vスペクトル比のピークから計算された卓越周期: 0.484 秒

3. シミュレーションの解説

  1. データの生成:

    • まず、この地盤の「揺れやすさの個性」として、卓越振動数を2Hzに設定します。
    • H/V法の仮説通り、鉛直動(UD)はランダムなノイズとして、水平動(NS, EW)は2Hzの成分が強調された波形として生成します。これにより、地表の柔らかい地盤で特定の揺れが増幅される様子を模擬しています。
    • Figure 1(時系列波形)を見ると、水平動(青と緑の線)には周期的な揺れが見られますが、鉛直動(破線)は不規則なままであることが確認できます。
  2. H/Vスペクトル比の計算とプロット:

    • 生成した3成分の波形をフーリエ変換し、それぞれの周波数スペクトルを求めます。
    • 水平動スペクトル(H)と鉛直動スペクトル(V)を計算し、その比(H/V比)を求めます。
    • Figure 2(H/Vスペクトル比)を見ると、最初に設定した 2Hz の位置の近くに、H/V比のピーク(山)が現れていることを確認できます。
  3. 結果の解釈:

    • H/V比のピークから計算された卓越振動数・卓越周期(2.1Hz, 0.48秒)が、最初に設定した値(2Hz, 0.5秒)とほぼ一致していることが確認できます。
    • 常時微動を測定し、H/Vスペクトル比法で解析することで、その土地の地盤が持つ固有の揺れやすい周期(卓越周期)を推定できていることが、シミュレーションを通じて確認できます。

以上です。