STA/LTA 在微震检测上的实现
STA/LTA 是微震事件检测的经典算法。但阈值设多少?怎么避免漏掉小事件与误报大噪声?这是噪声监测里被反复调参的算法。
STA/LTA 的原理
- STA(Short-Term Average):短时窗能量平均,捕捉事件
- LTA(Long-Term Average):长时窗能量平均,反映背景噪声
比值 STA/LTA 反映"短期是否显著高于长期"——高于阈值则触发事件。
算法步骤
- 计算特征函数(如绝对值、能量、包络)
- STA = 特征函数在短时窗(如 0.5 s)内的平均
- LTA = 特征函数在长时窗(如 5 s)内的平均
- 比值 = STA / LTA
- 比值 > 阈值 → 触发事件
关键参数
STA 与 LTA 时窗
| 事件类型 | STA | LTA |
|---|---|---|
| 微震(10~100 Hz) | 0.1~0.5 s | 1~5 s |
| 区域地震(1~10 Hz) | 1~3 s | 10~30 s |
| 振动监测(10~1000 Hz) | 0.05~0.2 s | 0.5~2 s |
时窗选择原则:
- STA 时窗约等于事件持续时间(事件能量集中在此时窗内)
- LTA 时窗 ≥ 5 × STA(背景统计稳定)
阈值
| 阈值 | 行为 |
|---|---|
| 2.0 | 灵敏,误报多 |
| 3.0 | 平衡 |
| 4.0 | 保守,漏报多 |
| 5.0 | 只测大事件 |
噪声监测的典型阈值 3.0~4.0。
实战代码(Python)
```python import numpy as np
def sta_lta(data, fs, sta_len=0.5, lta_len=5.0, threshold=3.0): """STA/LTA 事件检测
data: 时间序列 fs: 采样率 sta_len, lta_len: 时窗长度(秒) threshold: 触发阈值 返回:触发时刻数组(样本索引) """ n_sta = int(sta_len * fs) n_lta = int(lta_len * fs)
# 特征函数:绝对值(也可用平方能量) char_func = np.abs(data)
# 累计和,加速计算 csum = np.cumsum(np.insert(char_func, 0, 0)) sta = (csum[n_sta:] - csum[:-n_sta]) / n_sta
# LTA(滞后 STA 一段,避免事件污染 LTA) csum_lta = csum[n_lta:] lta = (csum_lta[n_sta:] - csum_lta[:-n_sta]) / n_lta
# 比值 ratio = sta / (lta + 1e-10)
# 触发 triggers = np.where(ratio > threshold)[0] triggers = triggers[ratio[triggers] > threshold]
# 去抖:相邻触发合并为一个事件 events = [] if len(triggers) > 0: start = triggers[0] for i in range(1, len(triggers)): if triggers[i] - triggers[i-1] > n_sta: events.append(start) start = triggers[i] events.append(start)
return events
模拟:背景噪声 + 一个微震事件
fs = 100 t = np.arange(0, 30, 1/fs) signal = 0.1 * np.random.randn(len(t))
10 秒处加事件
event_start = 10 * fs event_len = int(0.3 * fs) signal[event_start:event_start+event_len] += 2 * np.sin(2 * np.pi * 30 * t[:event_len])
events = sta_lta(signal, fs, sta_len=0.5, lta_len=5.0, threshold=3.0) print(f"检测到 {len(events)} 个事件") for e in events: print(f" 事件时刻: {e/fs:.2f} s") ```
常见错
错一:LTA 时窗太短
LTA < 5 × STA 时,事件本身污染 LTA,比值降低,事件被"埋掉"。正确做法:LTA ≥ 5 × STA。
错二:阈值太低
阈值 2.0 时,背景噪声波动也会触发。误报率可高达 50 次/小时。
错三:特征函数选择不当
用"绝对值"特征对振动监测够用。但地震学常用"能量"(平方)或"包络"(Hilbert 变换),对低信噪比事件更敏感。
错四:不做去抖
连续多个时窗都超阈值,会被记为多个事件。要做去抖:相邻触发合并为一个事件。
高级改进
自适应阈值
固定阈值对噪声变化适应差。自适应阈值基于"近期触发率"调整:
- 触发率高(背景活跃):阈值上调
- 触发率低:阈值下调
多通道联合
单通道 STA/LTA 误报多。多通道联合:N 个通道同时超阈值才触发,提升准确率。
后处理滤波
触发后做事件识别:
- 频谱检查(是否含微震特征频率)
- 持续时间检查(事件 vs 噪声脉冲)
- 互相关检查(与已知事件模板相关)
结语
STA/LTA 是噪声监测事件检测的入门算法,简单但参数敏感。STA 时窗对应事件持续、LTA ≥ 5 × STA、阈值 3.0~4.0、多通道联合,是经过实战的稳定配置。但 STA/LTA 只是"检测",要做"识别"还要后续频谱与相关分析。