Acoustics Toolbox水声建模工具箱使用教程

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.f90Matlab/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),功能已经很完整。

总结

想跑通所有模型的话,建议按这个顺序:

  1. tests/Munk/ 下的 BELLHOP 射线 (MunkB_ray)、相干 (MunkB_Coh)、到达 (MunkB_Arr) → 理解射线追踪
  2. 同目录下的 KRAKEN (MunkK + field) 和 SCOOTER (MunkS) → 对比三种方法
  3. tests/MunkLeaky/ 下的 KRAKENC → 理解泄漏模态
  4. tests/wedge/ → 经典基准问题
  5. tests/Bellhop3DTests/ 下的各个场景 → 3D 效果
  6. tests/MunkTS/ 下的 SPARC → 时域

总共约 200+ 个 .env 文件覆盖了水声传播建模的几乎所有经典场景。

相关推荐
千殇华来6 个月前
声学之水声学
笔记·学习·水声学