3. 信号预处理与分帧
声呐接收到的原始信号在进入时频分析之前,通常不能直接使用。水听器输出往往叠加了直流偏置、工频与机械干扰、宽带自噪声,以及不同距离目标造成的幅度差异。如果把这些成分原样送入短时傅里叶变换或小波变换,时频图上会出现横贯全频带的亮线、底噪抬高、弱目标被强目标掩盖等问题。本节按“去均值—滤波—归一化—分帧加窗”的处理链展开,重点说明每一步的实际做法,以及窗函数选择如何直接改变时频图的时间分辨率、频率分辨率和幅度读数。
去均值:先消除直流与慢漂移
去均值的目标是让每段信号围绕零值波动。最简单的做法是减去整段信号的算术平均:
import numpy as np
def remove_mean(x):
return x - np.mean(x)
# 若存在缓慢基线漂移,可先高通或减去滑动均值
def remove_slow_drift(x, fs, win_sec=1.0):
win = int(fs * win_sec)
kernel = np.ones(win) / win
baseline = np.convolve(x, kernel, mode='same')
return x - baseline
需要注意,滑动均值在两端会产生边界效应,工程上常配合 mode='reflect' 或对首尾做镜像延拓。去均值后应检查残余直流:若均值绝对值仍大于信号标准差的 1%,说明存在明显漂移,应改用高通滤波处理。去均值本身不改变信号的频率成分分布,但能避免 STFT 第 0 个频点出现异常大值,从而让后续归一化和动态范围显示更合理。
滤波:按分析带宽保留有效成分
声呐信号滤波不是“越干净越好”,而是要与分析目标匹配。被动听测关注目标辐射噪声的低频线谱,通常保留 20 Hz~2 kHz;主动探测关注发射脉冲的回波,带宽由发射信号决定,例如线性调频信号带宽 1 kHz,则接收链路通带应覆盖该带宽并留出余量。实际处理中常用零相位滤波避免波形时移:
from scipy.signal import butter, sosfiltfilt
def bandpass(x, fs, low, high, order=4):
sos = butter(order, [low, high], btype='bandpass', fs=fs, output='sos')
return sosfiltfilt(sos, x)
选择 sosfiltfilt 而非单次 lfilter,是因为前者正向、反向各滤一次,相位响应为零,不会让回波到达时刻发生偏移——这对后续时延估计和时频图上的到达时间判读很关键。阶数不宜盲目取高:4~6 阶巴特沃斯通常已足够,阶数过高会带来通带边缘振铃和数值不稳定。若存在 50 Hz 工频干扰,可单独加一个窄带陷波,但陷波带宽要窄(如 Q=30),否则会把附近的低频线谱一起削掉。
归一化:让不同段、不同通道可比
归一化的目的是统一幅度尺度,便于设定统一的色标和检测门限。常用两种方式:峰值归一化 x / max(abs(x)) 适合观察波形包络;RMS 归一化 x / sqrt(mean(x**2)) 更适合噪声背景下比较不同时段的能量。若做多通道波束形成前的通道均衡,应对每个通道分别做 RMS 归一化,否则灵敏度差异会破坏波束指向。归一化必须在滤波之后进行,因为滤波会改变信号能量;同时要记录归一化系数,便于把时频图幅度换算回原始声压级。
分帧加窗:分辨率与平滑度的折中
分帧把长信号切成短段,每段做 FFT 得到一列频谱,按时间排列即得时频图。两个参数最关键:帧长 N 和帧移 H。频率分辨率约为 fs/N,时间分辨率约为 N/fs。例如采样率 fs=8000 Hz,取 N=1024,则频率分辨率约 7.8 Hz,单帧时长 128 ms;若目标线谱间隔只有 5 Hz,这个帧长就不够,需要增大到 N=2048 甚至 4096。帧移 H 决定时频图的时间步进,H 越小图越平滑但计算量越大,工程上常取 H=N/4(75% 重叠)或 N/2(50% 重叠)。分帧前应保证信号长度是帧移的整数倍附近,不足部分补零或丢弃,补零会引入幅度下降,需在显示时补偿。
加窗的作用是抑制帧两端突变造成的频谱泄漏。矩形窗等效于没有加窗,主瓣最窄、频率分辨率最高,但旁瓣仅 -13 dB,强线谱的泄漏会淹没附近弱线谱。汉宁窗旁瓣 -31 dB,适合一般连续谱分析;汉明窗第一旁瓣 -41 dB,适合线谱检测;布莱克曼窗旁瓣 -58 dB,动态范围最大,但主瓣明显变宽,短脉冲在时频图上会被抹开。实际选择可遵循:关注“有没有这根线谱”用汉明或布莱克曼;关注“脉冲什么时候到”用矩形或汉宁;既要看时间又要看频率时,汉宁窗加 75% 重叠是稳妥的起点。
一个可复现的处理示例
假设一段 10 s、fs=8000 Hz 的被动声呐数据,目标线谱约 320 Hz,另含 50 Hz 工频和缓慢漂移。处理流程为:去均值并减去 1 s 滑动均值;4 阶巴特沃斯带通 100~1500 Hz;按帧长 2048、帧移 512 分帧,加汉明窗;对每帧做 FFT 并取幅度平方,得到 2048×157 的时频矩阵(约 157 帧)。观察时频图时,若 320 Hz 处出现连续亮线而 50 Hz 处已消失,说明滤波和去均值有效;若亮线在时间方向出现周期性明暗,通常是帧移过大或未做重叠补偿,可减小帧移或改用汉宁窗重试。幅度色标建议用 dB 显示并固定参考值,避免每帧自动归一化造成强弱目标对比失真。