2. 水声信号基础与Python表示
水声信号处理的第一步,不是急着做滤波或谱分析,而是把“声音”这件事用物理量和数字序列说清楚。水声信道中传播的是声压随时间的起伏,接收换能器把这种起伏转换为电压,再经采样变成离散序列。只有理解声压、声强、声压级、频率、波长、声速之间的换算关系,以及采样定理对水声信号采样率的约束,后续的波束形成、匹配滤波和检测才有可靠基础。
一、五个基本物理量及其换算关系
声压 p 是介质中因声波引起的压强偏离静压的量,单位帕斯卡(Pa)。水声工程中常用有效值声压 prms。声强 I 是单位面积通过的声功率,平面波近似下满足 I = prms2 / (ρc),其中 ρ 为海水密度(约 1025 kg/m³),c 为声速。声压级定义为 SPL = 20·log10(prms/pref),水声中的参考声压 pref = 1 μPa,这一点与空气中 20 μPa 不同,换算时务必注意。
频率 f、波长 λ 与声速 c 满足 λ = c/f。海水声速典型值约 1500 m/s,随温度、盐度和深度变化。举例来说,若 c = 1500 m/s,则 1 kHz 对应波长 1.5 m,10 kHz 对应 0.15 m。波长直接决定阵列孔径与阵元间距的设计:为避免空间混叠,阵元间距通常不超过半波长。
二、离散时间信号表示与采样定理
连续声压 p(t) 经采样后成为序列 x[n] = p(n/fs),n = 0, 1, …, N−1,采样间隔 Δt = 1/fs。采样定理要求 fs > 2fmax,否则高频分量会折叠到低频,形成无法事后消除的混叠。水声信号采样率的选择要同时考虑三个因素:信号最高频率、抗混叠滤波器过渡带、以及后续处理(如宽带匹配滤波、包络检波)所需的过采样余量。
例如被动声呐关注 50 Hz~8 kHz 的舰船辐射噪声,若取 fs = 20 kHz,则奈奎斯特频率为 10 kHz,给 8 kHz 以上留出 2 kHz 过渡带供模拟抗混叠滤波器滚降,是较稳妥的选择。若信号含 15 kHz 的主动脉冲,则 fs 至少 40 kHz,工程上常取 48 kHz 或 50 kHz。需要强调:采样率不是越高越好,过高会成倍增加存储与计算量,应按最高关注频率加合理余量来确定。
三、用 NumPy 表示水声信号并做基本统计
实际处理中,一段水声数据通常以 NumPy 一维数组保存,配合采样率元信息。下面用合成示例演示:构造一个含 1 kHz 单频分量与高斯噪声的“类水声”信号,计算有效值声压、声压级和基本统计量。示例参数为教学假设,非实测数据。
import numpy as np
fs = 20000.0 # 采样率 20 kHz
T = 0.5 # 时长 0.5 s
t = np.arange(int(fs * T)) / fs
f0 = 1000.0 # 1 kHz 单频分量
p_rms_sig = 0.5 # 信号有效值声压,假设 0.5 Pa
x = p_rms_sig * np.sqrt(2) * np.sin(2 * np.pi * f0 * t)
x += np.random.normal(0, 0.05, x.size) # 叠加噪声
p_rms = np.sqrt(np.mean(x**2))
p_ref = 1e-6 # 水声参考声压 1 μPa
spl = 20 * np.log10(p_rms / p_ref)
print(f"采样点数 N = {x.size}")
print(f"有效值声压 = {p_rms:.4f} Pa")
print(f"声压级 = {spl:.1f} dB re 1 μPa")
print(f"均值 = {x.mean():.4f}, 标准差 = {x.std():.4f}")
print(f"峰值 = {np.max(np.abs(x)):.4f} Pa")
按上述参数,理论有效值约 0.5 Pa,对应声压级约 114 dB re 1 μPa;叠加小幅噪声后统计值会略有偏移,这正是实际数据处理的常态。峰值因子(峰值/有效值)对正弦约为 1.414,若明显偏离,往往提示存在脉冲干扰或削波。绘图时横轴用 t(秒),纵轴用 Pa,并标注采样率与时长,便于复现。
import matplotlib.pyplot as plt
plt.plot(t, x, lw=0.8)
plt.xlabel("时间 / s"); plt.ylabel("声压 / Pa")
plt.title(f"水声信号示例 fs={fs/1000:.0f} kHz")
plt.grid(alpha=0.3); plt.tight_layout(); plt.show()
四、容易踩的三个坑
- 参考声压用错:水声必须用 1 μPa,用 20 μPa 会使声压级整体偏低约 26 dB。
- 忽略抗混叠:只按 2fmax 取采样率而不留过渡带,模拟滤波器滚降不足会让高频噪声折叠进信号带。
- 单位与量纲混用:声强用 W/m²、声压用 Pa,二者换算需 ρc;直接对 dB 值做算术平均也不等于能量平均。
把物理量换算、采样率约束和 NumPy 数组表示这三件事打通后,后续的频谱分析、滤波与检测就有了统一的数值基础:所有算法输入都是带 fs 的数组,所有输出都能回溯到 Pa 与 dB re 1 μPa 的物理含义。