2. 声呐原始回波的数据形态

要读懂瀑布图,先得读懂它背后的“原料”——原始回波。声呐接收机把换能器上的微弱电压放大、滤波、采样、量化,最终得到一串按时间排列的整数。这串数字本身没有“图像”含义,但它记录了每个采样时刻回波的有无与强弱。本节围绕四个关键概念展开:回波强度的时间序列、采样率、量程与增益,并说明原始回波文件的基本结构与读取方式。

一、回波强度的时间序列:一条“幅度—时刻”曲线

主动声呐发射一个脉冲后,接收机在接下来的时间窗内连续采样。设第 n 个采样点的量化值为 x[n],则一条波束、一次发射就对应一个离散序列 x[0], x[1], …, x[N-1]。横轴是采样序号(可换算为时间),纵轴是回波幅度。目标回波在序列上表现为一段幅度明显高于背景噪声的“包络鼓包”,其位置对应回波到达时间,其高度对应回波强度。

需要区分两个层次:原始采样序列是未经处理的幅度值,可能带有直流偏置、随距离衰减和噪声起伏;检波包络是对序列取绝对值并低通(或取希尔伯特变换模值)后得到的平滑曲线,瀑布图的一列像素通常就来自包络幅度。因此同一份原始数据,既可以画成原始波形,也可以画成包络,二者信息一致但可读性不同。

二、采样率:时间轴的分辨率

采样率 fs 决定每个采样点代表多长时间,即采样间隔 Δt = 1/fs。若 fs = 48 kHz,则 Δt ≈ 20.8 μs。结合水中声速 c(常取 1500 m/s,示例假设),单程距离分辨率约为 c·Δt/2 ≈ 1.56 cm。采样率越高,时间轴越细,但数据量与存储压力同步上升。

采样率还必须满足奈奎斯特条件:fs 至少为信号最高频率的两倍。若工作频带为 20~30 kHz,则 fs 不应低于 60 kHz。实际工程中常留有余量,例如取 96 kHz 或 100 kHz,以便后续滤波与插值。读取文件时若忽略采样率,只按“第几个点”看数据,就会把时间轴和距离轴全部读错。

三、量程与增益:把微弱回波“放进”量化区间

量程指一次发射后接收机记录的时间窗长度 T,对应最大探测距离 Rmax = c·T/2。例如 T = 0.2 s,则 Rmax ≈ 150 m。量程决定了序列长度 N = fs·T;48 kHz、0.2 s 对应 9600 个采样点。量程设小了,远处目标被截断;设大了,近处目标占用点数少、数据冗余多。

增益是接收链路的放大倍数,通常以 dB 表示。它把回波幅度映射到 ADC 的量化区间内。增益过低,弱回波淹没在量化噪声中;增益过高,强回波(如近距目标或海底反射)会削顶饱和,包络出现平顶,强度信息失真。很多系统采用时变增益(TVG),按距离分段提升放大倍数,以补偿球面扩展与吸收损失。读取原始文件时,必须同时拿到增益设置或 TVG 曲线,否则不同距离上的幅度不能直接横向比较。

判断增益是否合适的直观方法:观察原始序列的最大值是否接近但不超过 ADC 满量程(如 16 位有符号数的 32767)。若大量采样点贴着满量程,说明已饱和;若整段最大值只有满量程的百分之几,说明增益偏低、有效位数浪费。

四、原始回波文件的基本结构与读取方式

原始回波文件通常由“文件头 + 若干数据块”组成。文件头记录采样率、量程、通道数、量化位宽、字节序、增益或 TVG 表、发射时刻等元数据;数据块按“发射—波束—采样点”的顺序排列。常见布局有两种:按帧存储(每帧含一次发射的所有波束)和按通道存储(同一通道的连续采样)。读取时必须先解析头部,再按正确的步长和字节序解码,否则得到的是一串无意义的数值。

下面是一段示例性的读取逻辑(Python 伪代码,参数为教学假设值),演示如何把二进制文件还原为二维数组:

import numpy as np

# 示例头部参数(假设值,非实测)
fs = 48000          # 采样率 Hz
range_s = 0.2       # 量程 s
n_beams = 64        # 波束数
dtype = np.int16    # 16 位有符号
byte_order = '<'    # 小端

n_samples = int(fs * range_s)   # 9600
with open('raw_echo.bin', 'rb') as f:
    header = f.read(128)        # 假设头部 128 字节
    data = np.frombuffer(f.read(), dtype=byte_order + 'i2')
# 重塑为 [帧, 波束, 采样点]
frames = data.reshape(-1, n_beams, n_samples)
print(frames.shape, frames.max(), frames.min())

读取后先做三项检查:一是形状是否与“帧数×波束数×采样点数”吻合;二是最大值、最小值是否落在量化范围内,判断有无饱和或异常;三是抽取一条波束画包络,确认目标鼓包位置与量程、声速换算的距离是否自洽。只有这三项通过,数据才可用于后续瀑布图成像。

原始回波:从接收信号到文件与瀑布图 换能器接收 微弱模拟电压 放大 + 滤波 增益 / TVG ADC 采样量化 fs、位宽、字节序 原始回波文件 头部 + 数据块 包络 瀑布图 单波束回波时间序列(示意) 时间 / 采样序号(0 → N-1) 幅度 目标回波峰值 背景噪声 原始回波文件结构(示意) 文件头:fs、量程、通道数、位宽、字节序、增益/TVG (读取前必须先解析) 数据块 1:帧 1 · 波束 1…64 · 采样点 0…N-1 数据块 2:帧 2 · 波束 1…64 · 采样点 0…N-1 按 [帧, 波束, 采样点] 重塑后即可成像

五、把参数串起来:一次完整的识读示例

假设某次采集使用 fs = 48 kHz、量程 0.2 s、64 波束、16 位有符号、小端存储,声速按 1500 m/s 计。读取后得到形状为 [帧数, 64, 9600] 的数组。取第 1 帧第 10 波束,发现包络峰值出现在第 2400 个采样点,则回波到达时间约 2400/48000 = 0.05 s,对应单程距离约 1500×0.05/2 = 37.5 m。若该帧最大值达到 32700 以上,说明近距强反射已接近饱和,应检查 TVG 近段增益是否过高;若整帧最大值不足 3000,则增益偏低,弱目标可能被量化噪声掩盖。

把这些参数与检查结论记录在采集日志中,是后续瀑布图判读和问题复盘的依据。原始回波的价值不在于“好看”,而在于它保留了可回溯的幅度与时间信息——只要采样率、量程、增益和文件结构都清楚,任何一帧数据都能被重新还原、重新标定、重新解释。