k-wave Chapter2:时变源问题

均质传播介质中的单极点声源

本例简单演示了如何使用 k-Wave 模拟和检测二维均质传播介质中的时变压力源。该示例以均质传播介质和记录粒子速度示例为基础。

定义时变压力源

在初值问题示例中,通过将源值分配到 source.p0 来定义初始压力分布。要定义时变压力源,必须分配源掩码(定义哪些网格点属于压力源)和时变源输入。在 source.p_mask 中分配二进制矩阵(即由 1 和 0 组成的矩阵,其尺寸与计算网格相同)来定义源掩码,其中 1 代表构成源一部分的网格点。然后,时变输入信号被分配到 source.p,其索引为 source.p(source_point_index,time_index)。信号源可以有任意数量的时间点(无需与 kgrid.Nt 匹配),可以定义为单个时间序列(在这种情况下,同一时间序列会应用于所有信号源点),也可以使用 MATLAB 的列式线性矩阵索引排序,定义为信号源点之后的时间序列矩阵。例如,如果 source.p_mask 定义为

source.p_mask =
     0 1 0
     1 0 1
     1 0 1
     0 1 0

source.p(source_point_index, time_index) 中的源点排序如下

 0 3 0
 1 0 5
 2 0 6
 0 4 0

在本例中,正弦输入被分配给单个声源元素,以创建一个单极声波。其余输入结构的定义方法与前面示例相同。

% 定义单个声源点
source.p_mask = zeros(Nx, Ny);
source.p_mask(end - Nx/4, Ny/2) = 1% 定义时变正弦信号源
source_freq = 0.25e6; % [Hz] (频率)
source_mag = 2; % [Pa]
source.p = source_mag * sin(2 * pi * source_freq * kgrid.t_array)

源滤波

输入和输出信号的时间采样频率由时间步长 kgrid.dt 决定。这意味着时变压力或速度输入信号的最高频率为奈奎斯特极限 1/(2kgrid.dt)。然而,空间网格上可表示的最高时间频率是介质声速/(2dx)或 CFL/(2*kgrid.dt)的奈奎斯特极限。对于大多数模拟,CFL 数值将小于 1(kWaveGrid 类的 makeTime 方法默认使用 0.3 的 CFL)。这意味着在定义时变压力或速度输入信号时,有可能包含网格无法表示的频率,因此必须 注意不要超过网格支持的最大频率。

网格支持的最大频率会在每次模拟开始时通过命令行报告。使用函数 filterTimeSeries 可以自动将输入信号限制在支持的频率范围内。该滤波器采用凯泽窗法设计的有限脉冲响应(FIR)滤波器。滤波器可根据需要设置为零相位或线性相位。

% 滤波源,以去除网格不支持的高频率
source.p = filterTimeSeries(kgrid, medium, source.p)

运行模拟

在记录粒子速度示例中,定义了 sensor.record 的输入,以记录 sensor.mask 所定义传感器点的压力场和速度场。在本示例中,通过将 sensor.record 设置为 {‘p’, ‘p_final’},还将返回计算域内的最终压力场。与压力和速度的输出不同,"p_final "和 "u_final "的输出是在整个计算网格上返回的。在二维网格中,它们的索引为 (nx, ny)。下图给出了驱动源点的输入时间序列、传感器点记录的声压以及最终压力场。

% define the acoustic parameters to record
sensor.record = {'p', 'p_final'};

% run the simulation
sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor);

在这里插入图片描述
在这里插入图片描述

均相传播介质中的偶极点声源

本例简单演示了如何使用 k-Wave 模拟和探测二维均质传播介质中的时变压力偶极子源。该示例以 "均质传播介质中的单极点声源 "示例为基础。

定义时变速度源

时变速度源的定义类似于上一示例中的时变压力源。二进制矩阵(即由 1 和 0 组成的矩阵,其尺寸与计算网格相同)被分配给 source.u_mask,其中 1 代表构成源的网格点。然后将时变输入信号分配给 source.ux 和 source.uy。这两个时间序列可以独立定义,可以是单个时间序列(在这种情况下,同一时间序列会应用于所有源点),也可以是使用 MATLAB 列式线性矩阵索引排序的源点之后的时间序列矩阵。
在这里插入图片描述

在本示例中,通过为单个源点分配正弦速度输入来创建偶极子。使用 filterTimeSeries 对输入进行过滤,以去除网格不支持的任何高频成分。

%定义单个源点
source.u_mask = zeros(Nx, Ny);
source.u_mask(end - Nx/4, Ny/2) = 1% 在 x 方向定义时变正弦速度源
source_freq = 0.25e6; % [Hz] (频率)
source_mag = 2 / (medium.sound_speed * medium.density);
source.ux = -source_mag * sin(2 * pi * source_freq * kgrid.t_array)%过滤声源以去除网格不支持的高频率
source.ux = filterTimeSeries(kgrid, medium, source.ux)

请注意,还可以使用由两个相邻网格点组成的压力源创建声偶极子,其输入为非同相输入。同样,还可以使用压力源或速度源组合创建更高阶的声源模式。

运行模拟

驱动声源的输入时间序列图以及传感器点记录的声压图如下。速度输入的大小按介质阻抗缩放,因此传感器上记录的压力大小与上例相同。通过将 sensor.record 设置为 {‘p’, ‘p_final’},还可以返回计算域内的最终压力场。

模拟传感器场模式

模拟换能器场模式

本示例演示了如何使用 k-Wave 计算二维曲面单元素传感器产生的场型。该示例以《均质传播介质中的单极点源》、《记录粒子速度》和《通过对角定义传感器掩膜》示例为基础。

定义时变压力源

与前面的示例一样,通过向 source.p_mask 指定二进制源掩码(定义源点的位置)以及向 source.p 指定时变源输入来定义时变压力源。

% 定义曲线传感器元件
arc_pos = [20, 20]; % [网格点]  
radius = 60;                % [grid points]
diameter = 81;              % [grid points]
focus_pos = [Nx/2, Nx/2]; % [网格点]
source.p_mask = makeArc([Nx, Ny], arc_pos, radius, diameter, focus_pos)% 定义时变正弦波源
source_freq = 0.25e6; % [Hz] = 0.5
source_mag = 0.5; % [Pa] (帕)
source.p = source_mag * sin(2 * pi * source_freq * kgrid.t_array)% 过滤源,去除网格不支持的高频率
source.p = filterTimeSeries(kgrid, medium, source.p);

记录压力场的统计数据

为使曲面传感器产生的声束可视化,可使用矩形两个对角的网格坐标定义覆盖整个计算域的传感 器掩膜(均质传播介质示例中提供了不同传感器掩膜类型的列表)。如果只需要总体波束模式(而不是特定频率或时间的波束模式),则可以通过将 sensor.record 设置为 {‘p_final’、‘p_max’、‘p_rms’},而无需在每个传感器点存储完整的时间序列。使用该选项后,在每个时间步长内,k-Wave 只更新每个传感器点的压力最大值和均方根值。这可以大大减少存储传感器数据所需的内存,尤其是在使用传感器点数量较多的传感器掩膜时。

%创建一个覆盖整个计算域的传感器掩膜
%使用矩形的对角创建一个覆盖整个计算域的传感器掩码
sensor.mask = [1, 1, Nx, Ny].'.%设置记录模式,捕捉最终波场和每个传感器点的统计数据
%每个传感器点
sensor.record = {'p_final', 'p_max', 'p_rms'}

注意,如果要记录各处的最大或最小压力,也可以将 sensor.record 设置为 {‘p_max_all’, ‘p_min_all’}。这将返回各处的最大和最小压力,与传感器掩膜的形状或类型无关。因此,如果不需要其他输出,可以通过设置 sensor.mask = [] 将传感器掩膜留空。

运行模拟

通过调用 kspaceFirstOrder2D 再次调用模拟。为使网格内的源元素可视化,源掩码被分配给可选输入 “DisplayMask”。在模拟过程中,该掩码会被叠加到绘图上。PML 也会被设置在用户定义的计算网格之外,然后通过将可选输入 "PlotPML "和 "PMLInside "设置为 false 来隐藏显示。

% 创建显示掩码以显示换能器
display_mask = source.p_mask;

%分配输入选项
input_args = {'DisplayMask', display_mask, 'PMLInside', false, 'PlotPML', false}% 运行模拟
sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor, input_args{:})

如 "记录粒子速度示例 "中所述,如果定义了 sensor.record 的输入,则模拟返回的输出 sensor_data 将被定义为结构体,并将记录的声学变量作为结构体字段添加。在这种情况下,输出的 sensor_data 将作为结构体给出,其中包含 sensor_data.p_final、sensor_data.p_max 和 sensor_data.p_rms 字段。对于使用矩形对角网格坐标定义的传感器掩膜,p_rms 和 p_max 的索引为 (x_index,y_index),其中 x_index 和 y_index 与矩形内的网格索引相对应。最终的压力场以及最大值和均方根光束图案如下图所示。传感器焦点和侧叶都清晰可见。

引导线性阵列

斯涅耳定律和临界角反射 多普勒效应多普勒效应 多普勒效应 通过狭缝的衍射

三维模拟

使用声场传播器模拟

CW 场 利用角频谱法进行全息投影 等效源全息投影

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值