运动声源的到达结构仿真@[toc]
概要
运动声源的到达结构仿真中,由于声传播速度远高于声源运动速度,而且声源辐射出声波后,介质的振子传递声波几乎不受声源影响,因此可以将根据每个时间帧的声源位置,使用bellhop计算到达结构,数字离散采样近似运动声源的到达结构。
整体架构流程
- 根据声源运动模型,得到声源在时间点上的位置
- 根据声场互易理论,将接收器放在射线模型的Source位置,而声源放在Receiver上,即在.env的Rz和Rr,写声源位置序列
- 使用bellhop计算到达结构
- 画图
.env环境文件写法
下面展示一些 代码片。
'Munk profile' ! TITLE
100.0 ! FREQ (Hz)
1 ! NMEDIA
'NVW' ! SSPOPT (Analytic or C-linear interpolation)
0 0.0 5000.0 ! DEPTH of bottom (m)
0.0 1548.52 /
200.0 1530.29 /
250.0 1526.69 /
400.0 1517.78 /
600.0 1509.49 /
800.0 1504.30 /
1000.0 1501.38 /
1200.0 1500.14 /
1400.0 1500.12 /
1600.0 1501.02 /
1800.0 1502.57 /
2000.0 1504.62 /
2200.0 1507.02 /
2400.0 1509.69 /
2600.0 1512.55 /
2800.0 1515.56 /
3000.0 1518.67 /
3200.0 1521.85 /
3400.0 1525.10 /
3600.0 1528.38 /
3800.0 1531.70 /
4000.0 1535.04 /
4200.0 1538.39 /
4400.0 1541.76 /
4600.0 1545.14 /
4800.0 1548.52 /
5000.0 1551.91 /
'A' 0.0
5000.0 1600.00 0.0 1.0 /
1 ! NSD
1000.0 / ! SD(1:NSD) (m)
101 ! NRD
1000.0 1000.0 / ! RD(1:NRD) (m)
101 ! NR
10 20 / ! R(1:NR ) (km)
'AB I' ! 'R/C/I/S' 注意这里第五个位置使用了I,即Irregular的网格布局,可以布放任意位置的Receivers列表
0 ! NBeams
-85.0 85.0 / ! ALPHA1,2 (degrees)
0.0 5500.0 101.0 ! STEP (m), ZBOX (m), RBOX (km)
代码
项目链接 运动声源到达结构仿真
clc;
filename = 'MunkB_Arr_f';
bellhop(filename);
ARRFIL = [filename '.arr'];
% [ Arr, Pos ] = read_arrivals_bin( ARRFIL );
[ Arr, Pos ] = read_arrivals_asc( ARRFIL );
% plotarr
figure;
hold("on");
for isd = 1: size(Arr,1)
Arr1 = Arr( isd, 1 );
Narr = Arr1.Narr;
indexTNC0BNC0 = Arr1.NumTopBnc==0 &Arr1.NumBotBnc==0; % 直达
indexTNC1BNC0 = Arr1.NumTopBnc~=0 &Arr1.NumBotBnc==0; % 海面反射
indexTNC0BNC1 = Arr1.NumTopBnc==0 &Arr1.NumBotBnc~=0; % 海底反射
indexTNC1BNC1 = Arr1.NumTopBnc~=0 &Arr1.NumBotBnc~=0; % 海面、海底反射
stem(real( Arr1.delay( indexTNC1BNC1 ) ), abs( Arr1.A( indexTNC1BNC1 ) ) , 'k' )
stem(real( Arr1.delay( indexTNC0BNC1 ) ), abs( Arr1.A( indexTNC0BNC1 ) ) , 'b' )
stem(real( Arr1.delay( indexTNC1BNC0 ) ), abs( Arr1.A( indexTNC1BNC0 ) ) , 'g' )
stem(real( Arr1.delay( indexTNC0BNC0 ) ), abs( Arr1.A( indexTNC0BNC0 ) ) , 'r' )
% 以上的时延delay可以再加上声源运动到该点上所需要的时间,我这里只是示例,所以没加
pause(0.5);
end
hold("off")
xlabel('Time (s)' )
ylabel('Amplitude' )
% title([ 'Src_z=', num2str( Pos.s.z( 1 ) ), ...
% ' m Rcvr_z=', num2str( Pos.r.z( 1 ) ), ...
% ' m Rcvr_r=', num2str( Pos.r.r( 1 )/1e3 ), ' km' ] )
注意,上面画图中时延delay可以再加上声源运动到该点上所需要的时间,即根据声源当前的位置,得到当前帧对应的仿真时间。举例,如果声源速度10m/s,当前是循环为第二点,且距离第一个点100m,则delay需要加上。
小结
使用分帧的手段,对不同时间点运动声源的到达结构进行仿真,并画图,可视化运动声源的到达结构随时间的变化。