Bellhop水声信道仿真完全指南:从射线追踪到工程实践
2026/9/17 13:01:56 网站建设 项目流程

1. 项目概述:为什么我选择Bellhop做水声信道仿真

水声信道仿真这个领域,Bellhop基本是绕不开的名字。无论你是做水声通信、被动声纳探测、水下定位,还是海洋声学环境评估,只要涉及声线在复杂海洋环境中的传播问题,Bellhop都是优先级最高的工具之一。它不是最精确的模型,但在大多数工程场景下,它是性价比最高的选择。

Bellhop是基于射线声学(Ray Theory)的水声信道仿真工具,由美国海军研究实验室的Michael Porter团队开发并开源。它通过追踪大量声线从声源到接收点之间的传播路径,计算每条声线的传播时延、到达角度、幅度衰减等信道参数,最终输出声线轨迹、传播损失、冲激响应等关键结果。这些结果可以直接用于通信系统的链路预算分析、信道均衡算法验证、定位算法的TOA(到达时间)估计等,甚至可以为OFDM水声通信、扩频水声通信等工程方案提供信道级的仿真输入。

我最早接触Bellhop是做一个浅海通信链路仿真项目,当时需要在声速剖面已知、海床地形起伏的条件下,快速获取信道冲激响应来评估不同调制方式的误码率表现。试过简正波模型(如KRAKEN)和抛物方程模型(如RAM),发现简正波在浅海低频段精度好,但高频段参数设置极其繁琐;抛物方程能处理复杂地形,但计算量大到离谱。Bellhop的优势在于它能在几百毫秒内完成一次完整的环境建模和射线追踪,而且对环境文件的格式要求非常清晰、调试直观,特别适合前期链路参数扫描和系统级仿真。这篇博文就把我从环境文件编写到后处理出图的完整流程拆开讲一遍,重点覆盖ray、arr、tl三种输出模式的用法,以及我实际调试中踩过的坑。

这篇文章适合谁看?正在做水声通信系统仿真、声纳性能评估、水声定位算法研究的学生和工程师,以及想用Bellhop生成信道数据来配合Simulink、Python信号处理框架做上层算法验证的开发者。我会尽量把每个关键参数的作用都写清楚,让新手能少走弯路。

2. 核心原理与整体设计思路拆解

2.1 射线声学模型的工作原理

在正式动手写环境文件之前,有必要把Bellhop背后的物理模型讲清楚。Bellhop的核心是射线声学近似,它的基本假设是声波在海洋中的传播可以类比为光线在非均匀介质中的传播。声线传播方向遵循Snell定律,在声速梯度作用下发生弯曲,声线轨迹取决于声速剖面沿深度的变化。

这个近似成立的前提是声波频率足够高,使得声波的波长远小于海洋环境的不均匀尺度。具体来说,需要满足:

[ \lambda \ll \min(\text{声道尺度}, \text{地形起伏尺度}, \text{声速梯度特征尺度}) ]

在绝大多数浅海通信场景(几kHz到几十kHz)下,这个条件是满足的。比如10kHz的声波在水中波长约0.15m,而水深变化、声道结构尺度往往是米到百米量级,射线声学的适用性没有问题。但在低频(几百Hz以下)深远距离传播场景中,散射和衍射效应突出,射线模型的误差会明显增大,那时我更倾向于用简正波或抛物方程模型。

Bellhop的射线追踪过程可以理解为:在声源处以一定角度间隔发射大量声线,每条声线按照声速剖面的梯度逐步弯曲前进,遇到海面和海底边界时发生反射,声线强度根据边界反射系数和介质吸收进行衰减。当声线经过接收点附近时,通过插值方式提取该点对应的到达结构参数。

2.2 三种核心输出模式:ray、arr与tl

Bellhop最核心、最常用的是三种输出模式,理解它们的区别是使用Bellhop的关键。

第一种是ray模式,即声线轨迹图。它输出的是所有声线在空间中实际走过的路径,用于直观观察声线如何随深度折射、如何在边界反射、是否存在会聚区等。这种模式对于理解传播物理过程、验证环境参数设置是否正确非常有用,但它不直接给出信道参数。

第二种是arr模式,即到达结构文件。它输出每一条本征声线(即真正从声源到达接收点的声线)的到达信息,包括传播时延、到达水平角、垂直角、幅值、相位等。这是水声通信仿真最常用的模式,因为冲激响应就是由这一系列离散到达路径构成的,每条本征声线对应冲激响应的一个抽头,时延差异决定了信道的频率选择性。

第三种是tl模式,即传播损失模式。它输出网格化的传播损失分布,可以看单频CW信号在空间中的衰减情况。这个模式偏向声纳性能预测、环境评估,对通信系统仿真来说更多是辅助作用。

三种模式可以在环境文件中通过运行类型设置同时或分别生成对应文件。我常用的做法是先跑ray模式确认环境设置合理,再跑arr模式提取信道参数,偶尔跑tl模式做整体链路的信噪比评估。

2.3 本征声线与分束算法的作用

本征声线是arr模式的核心概念。在水声环境中,从声源出发的声线经过多次海面海底反射和折射,能够精确到达接收点的那些声线就是本征声线。Bellhop的本征声线分束算法(Eigenray)会在角度上进行二分搜索,通过两个相邻发射角度的声线轨迹将接收点包含在内,再通过插值细化找到精确的到达路径。

这里有一个关键参数需要特别注意:NBD和NBE。NBD是本征声线搜索的初始射线条数(分束数),NBE是每条本征声线内部的细分射线条数。这两个参数直接影响本征声线搜索的精度和成功率。NBD设置过小,可能出现漏掉某些主要路径的情况;NBE设置过小,插值精度不够,到达时延和幅度的计算误差会变大。很多人在浅海场景下发现冲激响应缺少某些多径分量,排查到最后往往是NBD值太小导致问题。

在实操中,我建议NBD从500起调,NBE至少200。对于大深度、高声速梯度环境,可以适当提高这两个参数,代价是计算时间增加,但通常还是秒级以内,完全可接受。

3. Bellhop环境文件编写与参数深度解析

3.1 环境文件(.env)的整体结构与逐行解读

Bellhop的所有环境参数都写在一个自定义格式的文本文件中,后缀名为.env。这个文件的格式初看比较奇怪,但熟悉之后会发现它的设计非常紧凑、灵活。下面以一个实际我常用的浅海场景为例讲解环境文件的结构。

'SHALLOW_TEST' ! Title 50.0 ! SSP units: m/s (or km/s) 0 50 ! Nsd, depth of source (m) 0 10 20 30 40 50 ! SSP depths (m) 1500.0 1498.0 1495.0 1492.0 1489.0 1486.0 ! SSP sound speeds (m/s) 0 0.0 ! Nrd, receiver depths (m) 0 10 20 30 40 50 ! receiver depths (m) 1 ! Nr, number of ranges 10.0 ! receiver ranges (km) 'CVW' ! Top optics: vacuum 1 1500.0 0.0 1.0 ! Top halfspace: rho, c, alpha 1 0.0 ! Bottom halfspace: rho, alpha 100.0 ! bottom depth (m) 0.0 ! bottom slope (degrees) 1 0.0 1.0 ! bottom roughness parameters 0.0 ! bottom range dependence indicator 'B' ! volume attenuation type 0.0 ! frequency (kHz) 1 ! NBeams -90.0 90.0 ! beam fan angles (degrees) 0.0 0.0 ! box z limits 0.0 0.0 ! box range limits

这个文件每一块的顺序不能乱。但说实话,手工逐行写.env文件非常容易出错,尤其是空格和制表符混用会导致解析失败。我更推荐的方式是先复制一个现成的模板文件再修改关键参数,或者用Python写一个小脚本按格式生成.env内容。不过在理解阶段,逐行学习还是很有必要的。

3.2 声速剖面(SSP)的获取与插值处理

声速剖面是水声信道模型中最重要的输入参数。它描述了海水中声速随深度的变化关系,决定了声线的折射方向。中国近海典型的浅海声速剖面在夏季表现为负梯度,即表层声速高、深层声速低,这会导致声线向下弯曲;冬季或混匀期可能出现等温层,声速基本不随深度变化。

实际海洋中,我们很少能拿到密实连续的声速剖面数据,通常来自CTD仪器的离散观测点或历史数据平均。Bellhop本身只做线性插值,如果你提供的SSP数据点太少或层间距离过大,某些深度上的声速梯度可能被严重歪曲。我的经验是,在声速变化剧烈的区域(如温跃层附近),至少每隔2到5米取一个数据点;在声速变化平缓的深水区,可以放宽到几十米一个点。

SSP数据的单位也需要特别注意。Bellhop环境文件中有一个标志位控制声速单位是m/s还是km/s,0表示m/s,1表示km/s。设置错了,整个仿真结果都会离谱。我曾经见过有人把以km/s为单位的数据当成m/s输入,导致声线轨迹完全错误,程序却不会报错,需要靠ray模式的图形检查才能发现。

3.3 海面与海底边界条件的设置技巧

边界条件决定了声线在遇到海面和海底时的反射和损失行为。

海面在多数情况下可以近似为压力释放边界(即声压为零),声线遇到海面反射时相位反转。但对于海况较差、表面波浪明显的场景,粗糙海面的散射会增强,需要设置海面RMS波高参数来近似模拟粗糙度影响。实测下来,海面波高超过1米时对高频声线的影响非常显著,此时忽略粗糙度会导致传播损失计算结果偏低。

海底的建模更复杂,涉及沉积层的声速、密度和吸收系数。Bellhop支持半空间海底模型和分层海底模型。半空间模型参数最少,只需要设置海底声速、密度和吸收系数;分层模型可以描述多层沉积层结构,精度更高但参数需要更多实测或经验值支持。没有实测数据的情况下,我通常使用半空间模型,并参考Hamilton的表选取典型海底类型的声学参数。例如砂质海底:声速约1800m/s,密度约2.0g/cm³,吸收系数在1kHz频率下约0.5dB/λ;泥质海底:声速约1500m/s,密度约1.6g/cm³,吸收系数偏高。

3.4 频率选择与体积吸收系数的关系

水声信道仿真的频率设置不能随心所欲。频率直接影响吸收系数、声线追踪的精度要求以及后续通信系统仿真的子载波带宽设计。

Bellhop环境文件中的频率字段如果设置为0,表示不计算吸收损耗;设置为具体频率值(kHz)时,会按照内置的吸收系数模型自动计算体积吸收。Bellhop支持两种吸收模型:THORP模型和Francois-Garrison模型。THORP模型公式简单、计算快,但在低频段偏差较大;Francois-Garrison模型基于更细致的松弛化学吸收机制,精度更高。对于通信频段(1kHz到100kHz),两者差异不算特别大,但严谨起见、尤其是做定量分析时,我会选择Francois-Garrison模型。

这里有个经验:在低频浅海仿真中,有人发现传播损失随距离的变化曲线过于陡峭,排查半天发现是吸收系数设置异常。多数情况下,这是频率单位搞错了。还有一次我把信号频率设置为50kHz,仿真的吸收损耗在10km距离上达到近30dB,当时觉得不可思议,后来确认是频率设置没错,这个频段的声波在海水中的吸收确实这么夸张——这也侧面说明水声信道频率选择的约束有多大。

4. 从零开始:完整仿真实操流程

4.1 编译与运行环境准备

Bellhop官方代码在Acoustics Toolbox的GitHub仓库中,包含Fortran源码。虽然也提供编译好的Windows可执行文件,但我更建议自己编译一次,因为可以直接调整一些数组维度上限和编译优化选项。

在Linux系统上的编译过程很简单,只需要确保系统安装了gfortran和make工具:

git clone https://github.com/Backus/at.git cd at/Bellhop make clean make

编译完成后,会生成bellhop.exe可执行文件。注意这个文件在Linux下没有.bat扩展名,直接运行即可。

macOS下建议安装gfortran后同样方式编译。Windows下可以用MinGW或WSL环境,也可以在Acoustics Toolbox官网直接下载预编译的Windows版本。我个人更推荐在WSL或Linux环境下工作,因为后续的Python绘图和批处理脚本在Linux下执行更方便。

4.2 短浅海10km信道的完整仿真实例

这里我给出一个完整可复现的浅海通信信道仿真案例:水深约100米,声源深度20米,接收机深度40米,覆盖距离0到10公里,信号频率8kHz,夏季负梯度声速剖面。

先创建环境文件test.env

'SHALLOW_10KM' ! Title 50.0 ! SSP units: m/s 0 20 ! NSD, source depth (m) 0 10 20 30 40 50 60 70 80 90 100 ! SSP depths (m) 1502.0 1500.0 1498.0 1495.0 1491.0 1487.0 1484.0 1483.0 1482.5 1482.0 1482.0 ! SSP sound speeds (m/s) 1 40.0 ! NRD, receiver depths (m) 0 0.0 ! NRR, receiver ranges (km) 10 0.5 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 10.0 ! receive ranges (km) 'CVW' ! top optics 1 1500.0 0.0 1.0 ! top halfspace 'A' 0.0 ! bottom optics and sigma 1 1700.0 0.8 ! bottom halfspace: rho, alpha (dB/wavelength) 100.0 ! bottom depth (m) 0.0 ! bottom slope (degrees) 0.0 0.0 ! bottom roughness 1 0.0 1.0 ! top roughness 0.0 ! range dependence 'Q' 0.0 ! attenuation type and frequency (kHz) 0 0.0 ! options 500 200 ! NBD, NBE -30.0 30.0 ! beam fan angles (degrees)

在写这个文件时,我需要注意几点:

SSP的声速数据,我是按照表层高、深层低来设置的,模拟夏季浅海负梯度环境。这种环境下声线向下弯曲,海底反射路径必然是主要多径分量。

海面设置为压力释放边界(CVW),对应'CVW'标记;海底设置为半空间吸收性海底,声速1700m/s、密度0.8g/cm³、吸收系数0.8dB/波长,这是典型的砂质沉积层参数。

发射波束角度范围设置的是正负30度。这个范围需要根据具体环境判断,如果声道倾角太大或反射太多,超出这个角度的声线经过多次反射后衰减严重,对接收点的贡献基本可以忽略。设置过大的角度范围会增加无效射线的数量,稍微拖慢搜索速度,但在现代处理器上影响不大。

4.3 运行Bellhop并解读三类输出文件

执行仿真:

./bellhop.exe test.env

运行结束后,同目录下会生成多个文件:test.raytest.arrtest.tl等,具体生成哪些取决于环境文件的运行类型配置。通过修改'A'选项可以控制输出类型,常用的是ray和arr。

如果没有arr文件或arr文件为空,多半是本征声线搜索失败或接收点附近没有声线通过。这时候可以先检查ray模式下的声线分布图,看看接收深度附近是否确实有声线覆盖。如果声线密集但arr仍为空,需要增大NBD、NBE或者检查接收点的深度设置。

4.4 用Python读取并可视化结果

官方Acoustics Toolbox仓库中有MATLAB绘图脚本,但日常工作中我更习惯用Python。推荐使用acoustics工具包,也可以自己写解析函数。核心是读取.arr文件,它包含每本征声线的到达信息。

下面是一个读取arr数据的示例:

import matplotlib.pyplot as plt def read_arr(filename): with open(filename, 'r') as f: lines = f.readlines() arrivals = [] nlines = len(lines) i = 0 while i < nlines: line = lines[i].strip() if 'NArr' in line or 'Rho' in line: i += 1 continue if line == '': i += 1 continue parts = line.split() if len(parts) >= 6: try: amp = float(parts[0]) delay = float(parts[1]) arrival = { 'amp': amp, 'delay': delay, 'angle': float(parts[2]), 'sx': float(parts[3]), 'sz': float(parts[4]), 'rx': float(parts[5]), 'rz': float(parts[6]) } arrivals.append(arrival) except ValueError: pass i += 1 return arrivals arrs = read_arr('test.arr')

读取之后可以画冲激响应。将每条本征声线的到达时延作为横坐标,幅度的绝对值转换为dB作为纵坐标,就能画出水声信道典型的梳状冲激响应。浅海10km、8kHz信号的典型结果是:3到6条主要路径,时延扩展约5到15毫秒,相邻路径间隔与海深和声速梯度直接相关。

如果做通信系统仿真,还需要把这些离散路径转换为等效的基带等效信道模型,或者直接生成信道脉冲响应文件给Simulink的卷积模块使用。这里有个技巧:可以通过np.interp把离散到达结构重采样到固定的采样率格点上,避免直接把原始数据扔给通信系统造成采样率不匹配。

5. 常见问题排查与调试经验分享

5.1 本征声线搜索失败或结果为空

这是arr模式最常遇到的问题。几种可能原因:

接收点位于声影区,即所有声线都绕开了这个区域。在浅海强负梯度环境下,声源附近的某个深度范围可能存在声影区,声线无法到达。解决办法是检查ray模式的声线图,确认覆盖情况;如果确实在影区,考虑换声源深度或接受深度。

NBD取值太小,声线束数量不足以在接收点附近形成足够的密度。简单粗暴地提高NBD到1000到2000,通常能解决一半以上的空结果问题。

发射角度范围设置不当。如果发射波束角度范围过窄,所有声线都朝一个方向跑,接收点位于波束覆盖范围之外。我的习惯是把波束范围先放宽到正负89度,等确认主要路径大致角度后,再收缩范围以提高计算效率。

5.2 传播损失曲线出现奇异值或不连续

这通常出现在近场和远场的过渡区域,或者是声影区边界处。射线模型本身在焦散线(声线汇聚)附近会出现无穷大场强的伪影,这是物理模型的固有缺陷,不是程序bug。

实际处理时,我会把关注区段限制在不再受影响的距离上,或者改用tl模式然后做空间平滑。如果是声影区边界不连续,通常真实的声场在边界位置强度变化也很剧烈,所以不必过于纠结曲线是否完全光滑。关键看整体变化趋势是否合理。

5.3 高频仿真计算量过大

提高频率后,如果需要观察精细的干涉结构,往往需要提高声线数量,计算量翻倍。这不是Bellhop特有,所有射线模型高频都会遇到。我的建议是:

先降低频率跑通流程、调好环境文件,再逐步提高频率到目标值。开发调试阶段使用较少的NBD(比如200到500),最后正式出数据时再拉满到2000以上。不要一上来就用4000根射线在大范围波束角下调试,那只会浪费时间。

如果确实需要很快出结果,可以考虑将仿真距离分段执行,每段使用不同的环境文件和射线数量配置,最后结果拼接。但要注意跨段边界处的相位和幅度连续性,处理起来比较麻烦,除非必要,不建议常用。

5.4 Bellhop与Simulink通信仿真联动的正确姿势

很多做水声通信的人最终目的是把Bellhop的仿真结果接入Simulink或Python信号处理链路。这里面有个容易踩的坑:Bellhop给出的每条路径是一个样本点(时延、幅度、相位),而Simulink的离散信道模型通常需要连续时间的抽头系数或CIR向量。

正确做法是先将到达结构转为连续时间冲激响应,再按通信仿真采样率重采样。具体流程是:

  1. 从arr文件提取所有路径的时延和复幅度;
  2. 在时间轴上以仿真采样率建立格点;
  3. 对每条路径,在格点位置上找到对应时延附近的采样点,按脉冲响应原理累加;
  4. 可选地,对每个路径加一定的延迟扩展,以近似模拟海面波动导致的到达时间抖动。

这样做出来的CIR才可以直接输入到RLS均衡器、OFDM解调器等模块中做端到端仿真。

5.5 常见问题速查表

现象可能原因处理方法
运行报错Fortran runtime errorenv文件格式错误、空格和制表符混用、数据行数不匹配从头逐行检查文件,不要用Word编辑env文件
arr文件为空接收点位于声影区、NBD太小、发射角范围不当检查ray图,增大NBD,放宽波束角
传播损失趋于无限大焦散线伪影、近场奇异平滑处理,或者避开该区段分析
声线轨迹明显异常弯曲SSP数据错误、单位标志错误核对SSP数据曲线,确认单位
高频计算极慢NBD设置过大、距离网格过密分步调试,降低初始射线数,缩小区间
冲激响应路径数量远少于预期NBD/NBE不足、边界反射损失过大增大NBD,降低海底吸收系数试试

5.6 我常用的几个调试技巧

调试Bellhop时,我的习惯是先把环境文件里的声速剖面单独画出来看看,确认SSP形态符合预期。这一步可以过滤掉80%离奇结果。然后再跑ray模式,用图形方式观察声线走向,确认声线在海面和海底之间来回反射的路径基本符合物理直觉。最后再跑arr模式提取量化数据。这三步走下来,基本不会出现解释不了的仿真结果。

另一个技巧是,在环境文件中把SSP和海底参数的注释行写清楚,尤其是哪些参数来自实测、哪些是经验估计。很多时候你会改一个参数然后忘记之前为什么是另外一个值,良好的注释习惯能省下大量返工时间。

还有一个小提醒:Bellhop对路径分隔符和文件名很敏感。尽量不要在路径中包含中文、空格和特殊符号,不然某些环境变量和文件接口会报找不到文件的错误。这个坑看似简单,但在团队协作场景中我见过不止一次因为代码克隆到带中文的用户目录导致全部路径异常。

6. 从仿真到论文与项目的进一步思考

跑通Bellhop只是第一步。实际项目中,我一般会把Bellhop作为信道数据生成器嵌入到更大的仿真流程中。典型的结构是:Bellhop生成不同季节声速剖面下的CIR库,然后Python脚本批量提取信道的RMS时延扩展、多普勒扩展、信道相干带宽等统计量,再把这些统计量作为水声通信系统参数选择的依据。

例如,在某次浅海通信实验前,我们用实测声速剖面做了全链路的Bellhop仿真,发现该海区在8kHz频率下信道相干带宽约500Hz,RMS时延扩展约8ms。基于这个结论,我们把OFDM子载波间隔设计为1kHz,超出了相干带宽,从而保证了各子载波间的近独立性。实验结果与仿真预测吻合度非常高。这个案例说明,虽然Bellhop是简化模型,但选对适用范围、选对参数,它提供的结果完全具有工程参考价值。

如果你打算在论文中使用Bellhop,建议补充环境文件的核心参数表和本征声线数量的敏感性分析,这是审稿人比较关注的点。展现你查过参数并讨论过结果的合理性,比贴一张中规中矩的传播损失图更有说服力。

从我的实际使用体验来看,Bellhop最大的价值一是快,二是灵活。环境文件把物理参数完全解耦,改一个变量就能观察其对信道的影响,非常适合做系统性参数扫描。虽然更高精度的模型确实存在,但绝大多数工程决策并不需要打到每分贝级别的精度,Bellhop给出的相对趋势和关键信道特征,已经足够支撑你做出靠谱的设计判断。记得一定要结合实海数据做校验,仿真工具只是辅助,海洋现场永远是最终的裁判。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询