4. 时域分析与波形特征提取
水声脉冲信号进入处理链路后,最先接触到的往往是原始采样序列。在频域分析之前,时域特征能以极低的计算代价给出信号的幅度水平、能量强弱、起伏程度和变化快慢,是后续检测、分类与参数估计的基础。本节围绕均值、方差、峰值、有效值、包络和过零率六个基本量展开,并配合滑动平均与差分两种常用运算,最后用 Python 对一段仿真的水声脉冲信号完成特征提取与可视化。
一、六个基本时域特征的定义与物理含义
设离散信号为 x[n],n = 0, 1, …, N−1,采样率为 fs。各特征定义如下,并统一约定:信号以零为基线,幅度单位按水听器灵敏度折算为伏特(V),时间单位为秒。
- 均值 μ = (1/N)Σx[n],反映信号的直流偏置。水声接收链路中前置放大器或 ADC 常引入固定偏置,均值可用于判断是否需要去直流。
- 方差 σ² = (1/N)Σ(x[n]−μ)²,衡量信号围绕均值的起伏程度;对零均值噪声段,方差近似等于噪声功率。
- 峰值 x_pk = max|x[n]|,对脉冲类信号最敏感,常用于判断是否出现强回波或瞬态干扰。
- 有效值 RMS = sqrt((1/N)Σx[n]²),与信号能量直接相关,是衡量脉冲强度的稳健指标。
- 包络 用希尔伯特变换得到解析信号后取模,env[n] = |x[n] + j·H{x}[n]|,刻画脉冲的上升、平台与衰减轮廓,是脉冲宽度估计的主要依据。
- 过零率 ZCR = (1/(N−1))Σ|sgn(x[n])−sgn(x[n−1])|/2,反映信号在基线上穿行的频繁程度,可用于粗略区分低频连续噪声与高频脉冲成分。
需要强调,峰值与有效值之比(峰均比)对脉冲非常敏感:高斯噪声的峰均比通常在 3~4 之间,而一个干净的水声脉冲可达 6 以上,因此峰均比常被用作脉冲存在性的快速判据。
二、滑动平均与差分:两种互补的预处理
滑动平均是低通平滑,输出 y[n] = (1/M)Σ_{k=0}^{M−1} x[n−k],窗口长度 M 越大,噪声抑制越强,但脉冲边沿被展宽,时间分辨率下降。差分是一阶高通,d[n] = x[n]−x[n−1],能突出陡峭变化,对脉冲前沿定位有利,但同时放大高频噪声。二者方向相反,实际处理中常先用短窗滑动平均压制背景噪声,再用差分或包络检测确定脉冲边沿。
三、Python 实现:从仿真脉冲到特征表
下面构造一段示例信号:采样率 48 kHz,时长 0.5 s,在 0.20 s 处叠加一个宽度约 8 ms 的调制高斯脉冲,并加入零均值高斯白噪声,信噪比约 10 dB。所有数值均为教学示例的合理假设,不代表实测数据。
import numpy as np
from scipy.signal import hilbert
fs = 48000
t = np.arange(0, 0.5, 1/fs)
rng = np.random.default_rng(2024)
# 8 ms 调制高斯脉冲,中心 0.20 s
fc, tau = 3000.0, 0.002
pulse = np.exp(-((t - 0.20) / tau) ** 2) * np.sin(2 * np.pi * fc * (t - 0.20))
x = pulse + 0.05 * rng.standard_normal(t.size) # 叠加背景噪声
def features(sig):
mu = sig.mean()
var = sig.var()
pk = np.max(np.abs(sig))
rms = np.sqrt(np.mean(sig ** 2))
env = np.abs(hilbert(sig))
zcr = np.mean(np.abs(np.diff(np.sign(sig))) / 2)
return dict(mean=mu, var=var, peak=pk, rms=rms,
crest=pk / rms, zcr=zcr, env=env)
f_all = features(x)
f_bg = features(x[:8000]) # 取脉冲前的纯噪声段作对照
# 滑动平均与差分
M = 48
ma = np.convolve(x, np.ones(M) / M, mode="same")
diff = np.diff(x, prepend=x[0])
运行后可得到两组特征:整段信号与纯噪声段。示例中整段的峰值约为 1.0 V 量级,有效值约 0.1 V 量级,峰均比明显高于噪声段的 3~4;过零率在整段中因脉冲的高频载波而升高。这些量级关系是判断脉冲是否存在的直接依据,具体数值随随机种子和噪声强度变化,应以实际运行结果为准。
四、特征提取与判读的完整链路
下图把本节的处理关系组织为一条信号链:原始采样先分两路,一路直接计算统计特征,另一路经滑动平均、差分与希尔伯特包络得到波形形态特征,最终汇入特征表用于判读。
判读时建议按以下顺序观察:先看峰均比,若明显高于噪声段的 3~4,说明存在脉冲;再看包络峰值位置,确定脉冲到达时刻;最后用包络的半高宽估计脉冲宽度,并与差分过零点交叉验证边沿。若峰均比接近噪声水平,则更可能是背景起伏而非真实脉冲,应结合多帧统计再下结论。
五、可视化与结果检查
把原始波形、滑动平均结果、差分和包络画在同一张多子图里,能直观看出各运算对波形的影响。示例绘图代码如下:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(4, 1, figsize=(9, 8), sharex=True)
ax[0].plot(t, x, lw=0.6, color="#3d8fc4"); ax[0].set_ylabel("原始")
ax[1].plot(t, ma, lw=0.8, color="#e08a2e"); ax[1].set_ylabel("滑动平均")
ax[2].plot(t, diff, lw=0.6, color="#8a5cc4"); ax[2].set_ylabel("差分")
ax[3].plot(t, f_all["env"], lw=1.0, color="#3aa76d"); ax[3].set_ylabel("包络")
ax[3].set_xlabel("时间 / s")
plt.tight_layout(); plt.show()
检查要点有三:滑动平均后脉冲顶部应更平滑而位置不变;差分在脉冲前沿和后沿各出现一个明显尖峰,二者间距即脉冲宽度;包络应呈单峰且峰值时刻与脉冲中心一致。若包络出现多个峰,说明背景噪声较强或存在多途到达,需要调整窗口或改用更长的平滑。
本节给出的特征量计算简单、可解释性强,适合作为水声脉冲检测的第一道筛选。实际工程中通常把整段信号分帧,逐帧计算峰均比与过零率,再对超阈值的帧做包络细化,从而在低计算量下完成脉冲的粗定位与形态描述。