Acoustics Toolbox 总体概览
这个工具箱由水声学家 Michael B. Porter 开发,是水声传播建模领域最经典的开源工具包之一。它本质上是频域求解器 ------给定频率和环境参数,算出空间中每一点的复声压。所有模型共享统一的 .env 环境文件格式,输出统一格式的声场文件,方便交叉验证。
运行模式有两套:
- 纯 MATLAB 实现 (以
M结尾的函数,如bellhopM):不需要任何编译,直接用 - Fortran 可执行文件 (如
bellhop):需要先用gfortran + make编译
包含的模型(8个)
| 模型 | 物理方法 | 维度 | 适用频率 | 独特能力 |
|---|---|---|---|---|
| BELLHOP | 射线追踪 + 高斯波束 | 2D | 中高频 (>100Hz) | 最快最直观,物理图像清晰 |
| BELLHOP3D | 三维波束追踪 | 3D | 中高频 | 唯一能处理3D海底地形 |
| KRAKEN | 简正波(实数) | 2D | 低频 (<500Hz) | 物理意义最清晰,模态分解 |
| KRAKENC | 复简正波 | 2D | 低频+衰减 | 可处理泄漏模态和海底衰减 |
| KRAKEL | 弹性简正波 | 2D | 低频+弹性 | 唯一能处理海底剪切波(S波) |
| SCOOTER | 有限元FFP | 2D | 全频段 | 精度最高(距离无关环境) |
| SPARC | 时域FFP | 2D | 宽带脉冲 | 唯一能输出时间波形 |
| BOUNCE | 反射系数 | 1D | 辅助工具 | 为其他模型提供反射系数表 |
输入数据
全部是合成的理想化测试数据,不是实测数据。但它们是按照经典海洋声学场景构建的,具有物理代表性。具体情况如下:
- 声速剖面 :用的是经典的 Munk 剖面(一个深度相关的解析表达式,代表了中纬度深海典型的声道特征),在
.env文件里以离散采样点的形式给出。也有等声速、负梯度、表面声道等其它理想化剖面。 - 海底地形 :
.bty文件里是解析构造的几何形状------平坦底、楔形底、海山(用高斯函数/三角函数生成的)、抛物面海底等。3D 案例里的地形也是数学表达式生成的。 - 3D Atlantic 案例 :这个特殊,用了真实大西洋的水深数据和声速数据(文件名如
lanta36.env等),这是测试集中为数不多的真实数据案例。 - 海底参数:声速、密度、衰减系数等都是典型值(如底质声速 1600 m/s,密度 1.8 g/cm³),并非某个特定海域的实测。
- 声源:都是假想的单频点源或脉冲源,深度和频率可以任意指定。
总结:绝大部分是标准验证案例的合成数据,用于验证模型算法正确性和交叉比对。这在计算声学中是常规做法。
核心输入机制:.env 文件
所有模型的输入都是 .env 文本文件(文件名作为运行参数,不带扩展名)。这个文件定义了整个声传播环境------水深、声速剖面、海底参数、声源/接收器配置等。可选辅助文件(.bty 海底地形、.ssp 二维声速场、.trc/.brc 反射系数表、.sbp 声源指向性)通过相同根文件名自动关联。
以 MunkB_ray.env 为例,逐行看:
'Munk profile' ← (1) 标题
50.0 ← (2) 频率 50 Hz
1 ← (3) 介质层数(BELLHOP固定为1)
'PVF' ← (4) 选项码:P=PCHIP插值,V=真空海面,F=表格化反射系数
51 0.0 5000.0 ← (5) 声速剖面:51个点,水深0~5000m
0.0 1548.52 / ← 深度 声速(Munk剖面的离散采样)
200.0 1530.29 /
... ← '/' 表示等间隔自动生成中间值
5000.0 1551.91 /
'A' 0.0 ← (6) 海底类型 A=声学半空间,粗糙度0
5000.0 1600.00 0.0 1.0 / ← 海底深度 声速 密度 衰减
2 ← (7) 2个声源深度
1000.0 4000 / ← 25m 和 250m
51 ← (8) 51个接收器深度
0.0 5000.0 / ← 0~5000m 均匀分布
1001 ← (9) 1001个距离点
0.0 100.0 / ← 0~100 km
'R' ← (10) 运行类型:R=射线追踪
41 ← (11) 41条波束
-20.0 20.0 / ← 出射角 ±20°
0.0 5500.0 101.0 ← (12) 积分步长0m,深度盒子5500m,距离盒子101km
选项字符串含义(各模型略有不同):
| 位置 | 含义 | 常用值 |
|---|---|---|
| 第1位 | SSP插值 | C=C-线性, N=N²-线性, P=PCHIP, S=样条, A=解析 |
| 第2位 | 海面边界 | V=真空(压力释放), R=刚性 |
| 第3位 | 谱类型(KRAKEN/SCOOTER) | W=波数谱, I=相速度谱 |
| 第4位 | 底部边界 | F=表格化反射系数, B=半空间, E=弹性 |
各模型详细运行方式
1. BELLHOP --- 射线/高斯波束追踪
原理:把声波看成射线,按 Snell 定律在海水中弯曲传播。高斯波束法给每根射线附带一个能量分布(像手电筒光斑),解决经典射线在焦散处的奇异性。
运行类型 (.env 第10行):
R= 射线追踪(画出射线轨迹)C= 相干声场(相干叠加,彩色TL图)I= 非相干声场(能量相加,无干涉条纹)S= 半相干A= 到达结构(到达时间-幅度-角度)E= 本征射线(寻找连接声源-接收器的特定射线)
运行方式:
run('E:\水声项目\Acoustics-Toolbox-main\at_init_matlab.m')
cd('E:\水声项目\Acoustics-Toolbox-main\tests\Munk')
bellhopM('MunkB_ray') % 纯MATLAB,射线追踪 + 自动画图
bellhopM('MunkB_Coh') % 相干声场 + 自动画TL图
bellhopM('MunkB_Arr') % 到达结构
输出 :.shd.mat(声压场)、.arr.mat(到达结构)、.ray(射线轨迹)、.prt(打印输出)
关键源码:
- Fortran:
Bellhop/bellhop.f90(主程序) - MATLAB:
Matlab/Bellhop/bellhopM.m(主入口),Matlab/Bellhop/trace.m(射线追踪核心),Matlab/Bellhop/step.m(积分步进)
2. BELLHOP3D --- 三维波束追踪
原理:BELLHOP 的三维版本,声线在三个方向上弯曲,出射角变为两个维度(方位角 + 俯仰角)。Nx2D 模式是折中方案------沿多个方位角跑 2D 计算再拼接。
运行方式:
cd('E:\水声项目\Acoustics-Toolbox-main\tests\Bellhop3DTests\Seamount')
bellhop3d('Seamount3DHatcart') % 调用Fortran可执行文件
测试场景:海山 (Seamount)、双海山 (DoubleSeamount)、楔形波导 (Wedge)、台湾海域 (Taiwan)、Weymouth、Munk 3D 等。
3. KRAKEN --- 简正波模型
原理 :把声场分解为模态(深度方向的驻波 × 水平方向的行波)的叠加。低频时模态少(几个),高频时成百上千。两步工作流。
KRAKEN vs KRAKENC:KRAKEN 用实数运算,快但不能处理海底衰减;KRAKENC 用复数运算,能处理衰减和泄漏模态(声能向海底辐射出去的模式)。
输入 :.env 的格式与 BELLHOP 不同------SSP 数据多了剪切波速、密度、压缩衰减、剪切衰减列;底部多了相速度范围 CLOW, CHIGH(控制计算哪些模态)。
运行方式:
cd('E:\水声项目\Acoustics-Toolbox-main\tests\Munk')
krakenM('MunkK') % 步骤1:计算模态 → 生成 .mod 文件
field('MunkK') % 步骤2:模态叠加 → 生成 .shd.mat
plotshd('MunkK') % 可视化
% 泄漏模态
cd('E:\水声项目\Acoustics-Toolbox-main\tests\MunkLeaky')
krakencM('MunkKleaky')
field('MunkKleaky')
FIELD 的 .flp 文件 (如 MunkK.flp):
'RA' ← 选项:R=距离坐标,A=绝热近似
9999 ← 使用的模态数(9999=全部)
1 ← 模态剖面个数
0.0 100.0 / ← 剖面位置
1001 ← 距离点数
0.0 100.0 / ← 距离范围 (km)
1 ← 声源深度数
1000.0 / ← 声源深度
501 ← 接收器深度数
0.0 5000.0 / ← 深度范围 (m)
关键源码:
- Fortran:
Kraken/kraken.f90,Kraken/krakenc.f90 - MATLAB:
Matlab/Kraken/krakenM.m,Matlab/Kraken/field.m
4. KRAKEL --- 弹性简正波
原理:KRAKEN 的扩展,海底同时处理压缩波(P波)和剪切波(S波),能模拟 Scholte 波。输入格式和 KRAKEN 一样,但在 SSP 中需要非零剪切波速。
krakelM('MunkShear')
field('MunkShear')
5. SCOOTER --- 有限元 FFP
原理 :用有限元法直接计算波数积分(FFP=Fast Field Program)。物理上等价于把声源分解为无数平面波求和,每列平面波在深度方向用有限元解一次 Helmholtz 方程,再对波数积分。在同类型模型中精度最高。但假设环境只随深度变化(距离无关),不能处理海底地形变化。
cd('E:\水声项目\Acoustics-Toolbox-main\tests\Munk')
scooterM('MunkS') % 步骤1:计算Green's函数 → .grn 文件
fields('MunkS') % 步骤2:波数积分 → .shd.mat
plotshd('MunkS')
关键源码 :Scooter/scooter.f90,Matlab/Scooter/scooterM.m
6. SPARC --- 时域 FFP
原理 :SCOOTER 的时域版本。在每个时刻推进波数积分,得到时间-空间的声压场,可以模拟脉冲传播------看到信号分离为不同到达、波形展宽、色散等时域现象。需要额外的 .sts(声源时间序列)文件。
cd('E:\水声项目\Acoustics-Toolbox-main\tests\MunkTS')
sparc('MunkTS')
fields('MunkTS')
7. BOUNCE --- 反射系数计算
辅助工具,计算分层介质海底/海面的反射系数,输出 .brc/.trc 供其他模型用。
bounce('MyBottom')
测试用例目录结构
tests/ 下有 30+ 个测试场景,按物理场景分类:
| 目录 | 场景 | 推荐首试 |
|---|---|---|
tests/Munk/ |
经典 Munk 声道(最主要的测试集) | bellhopM('MunkB_ray') |
tests/free/ |
自由场(最简单,无限均匀介质) | bellhopM('freePointB') |
tests/PekerisRD/ |
Pekeris 波导(距离相关) | krakenM('pekerisK') |
tests/MunkLeaky/ |
泄漏模态 | krakencM('MunkKleaky') |
tests/arctic/ |
北极半声道环境 | bellhopM('arcticB') |
tests/BroadBand/ |
宽带(多频率) | |
tests/Noise/ |
环境噪声场 | |
tests/MunkTS/ |
时域 SPARC | |
tests/Bellhop3DTests/ |
3D 波束追踪(海山/楔形/台湾等) | |
tests/wedge/ |
楔形波导(经典基准问题) | |
tests/calib/ |
校准/基准对比 | |
tests/3DAtlantic/ |
真实大西洋数据(含真实水深和SSP) | |
tests/sduct/ |
表面声道 | |
tests/head/ |
头部波 | |
tests/Dickins/ |
Dickins 海山 | |
tests/Gulf/ |
墨西哥湾 |
运行通用流程
% 第1步:初始化路径(每次打开 MATLAB 跑一次)
run('E:\水声项目\Acoustics-Toolbox-main\at_init_matlab.m')
% 第2步:进入 .env 文件所在目录(关键!容易忘)
cd('E:\水声项目\Acoustics-Toolbox-main\tests\Munk')
% 第3步:运行模型
bellhopM('MunkB_ray') % BELLHOP 射线追踪
bellhopM('MunkB_Coh') % BELLHOP 相干声场 TL
krakenM('MunkK') % KRAKEN 模态计算
field('MunkK') % 模态叠加
scooterM('MunkS') % SCOOTER FEM波数积分
% 第4步:可视化
plotshd('MunkB_Coh') % 传播损失彩色图(距离×深度)
plotray('MunkB_ray') % 射线轨迹
plotssp('MunkB_ray') % 声速剖面
plottlr('MunkB_Coh') % 固定深度的 TL vs 距离曲线
plottld('MunkB_Coh') % 固定距离的 TL vs 深度曲线
两套实现的对比
| 特性 | xxxM() 纯MATLAB |
xxx() Fortran |
|---|---|---|
| 需要编译 | 不需要 | 需要 gfortran + make |
| 速度 | 较慢 | 快很多(10-100倍) |
| 调试 | 容易 | 困难 |
| 功能覆盖 | 主要功能都有 | 最完整 |
| 推荐 | 学习和小规模测试 | 生产级计算 |
目前 MATLAB 纯实现覆盖了 BELLHOP (bellhopM)、KRAKEN/KRAKENC (krakenM/krakencM)、KRAKEL (krakelM)、SCOOTER (scooterM) 和 FIELD (field),功能已经很完整。
总结
想跑通所有模型的话,建议按这个顺序:
tests/Munk/下的 BELLHOP 射线 (MunkB_ray)、相干 (MunkB_Coh)、到达 (MunkB_Arr) → 理解射线追踪- 同目录下的 KRAKEN (
MunkK+field) 和 SCOOTER (MunkS) → 对比三种方法 tests/MunkLeaky/下的 KRAKENC → 理解泄漏模态tests/wedge/→ 经典基准问题tests/Bellhop3DTests/下的各个场景 → 3D 效果tests/MunkTS/下的 SPARC → 时域
总共约 200+ 个 .env 文件覆盖了水声传播建模的几乎所有经典场景。