Hi Brad,
In the example "Modelling A Linear Array Transducer," when using an ultrasound imaging sound field map, the grid size is set to 250250250, with two layers of media: acrylic and aluminum. The number of elements is set to 32, the element pitch is 0.3 mm, and the element length is set to 10. Regardless of how deep the focal point is set, it consistently appears around 20 mm within the medium. If you could reply, I would greatly appreciate it. Best wishes.
k-Wave
A MATLAB toolbox for the time-domain
simulation of acoustic wave fields
Modelling A Linear Array Transducer
(3 posts) (2 voices)-
Posted 2 months ago #
-
代码发出来看下
Posted 1 week ago # -
Hello, I have resolved the issue mentioned in the post. Now I am encountering a new problem: I have set the array elements at the xoffset position, but I am receiving very weak echo signals. Why is this happening, and how should I consider resolving it? Here is the code. Thank you for your reply.% 引导线性阵列示例
clearvars;% =========================================================================
% 模拟
% ========================================================================
% 创建计算网格
Nx = 400; % x 方向的网格点数
Ny = Nx; % y 方向的网格点数
dx = 0.1e-3; % x 方向的网格点间距 [m]
dy = dx; % y 方向的网格点间距 [m]
kgrid = kWaveGrid(Nx, dx, Ny, dy);% 定义介质属性
sound_speed_water = 1500; % 水声速 [m/s]
density_water = 1000; % 水密度 [kg/m^3]
sound_speed_acrylic = 2700; % 亚克力声速 [m/s]
density_acrylic = 1190; % 亚克力密度 [kg/m^3]
sound_speed_aluminum = 6300; % 铝声速 [m/s]
density_aluminum = 2690; % 铝密度 [kg/m^3]% 创建时间数组
t_end = 45.5e-6; % [s]
kgrid.makeTime(sound_speed_acrylic, [], t_end); % acrylic% 定义线性换能器的参数
num_elements = 36; % [阵元数量]
x_offset = 20; % [网格点]
element_width = 1; % 定义阵元宽度为1个网格点
source_focus = 0.13; % 聚焦深度 [m]
element_pitch = 0.3e-3; % 每个阵元的间距 [m]
source.p_mask = zeros(Nx, Ny);% 计算发射阵元的起始位置
transducer_width = num_elements * (element_width + 2); % 发射阵元总宽度,包含间隔
start_index = round(Ny/2 - transducer_width/2); % y方向的起始位置% 计算每个阵元的时间延迟
ids = (0:num_elements - 1); % 阵元索引
time_delays = -(sqrt((ids .* element_pitch).^2 + source_focus.^2) - source_focus) ./ sound_speed_water;
time_delays = time_delays - min(time_delays); % 归一化时间延迟% 定义用于驱动换能器的音调脉冲属性
sampling_freq = 75e6; % [Hz]
tone_burst_freq = 7.5e6; % [Hz]
tone_burst_cycles = 1;% 定义回波数据存储三维矩阵
num_scans = 128 - 36 + 1; % 扫描次数
num_time_points = length(kgrid.t_array); % 修正时间点数为 kgrid.t_array 的长度
echo_data = zeros(num_scans, num_elements, num_time_points); % 初始化三维矩阵% 创建音调脉冲信号,为每个阵元生成时间序列
source.p = zeros(num_elements, length(kgrid.t_array)); % 初始化源信号矩阵
for i = 1:num_elements
pulse = toneBurst(sampling_freq, tone_burst_freq, tone_burst_cycles, ...
'SignalOffset', time_delays(i));
source.p(i, 1:length(pulse)) = 20 * pulse; %加了20倍更明显
end% 分配输入选项
input_args = {'DisplayMask', source.p_mask};% =========================================================================
% 定义传感器
% =========================================================================
sensor.mask = zeros(Nx, Ny); % 初始化传感器蒙版
sensor.record = {'p'}; % 记录声压% =========================================================================
% 定义三层介质,包含孔缺陷
% =========================================================================
% 创建声速和密度的映射
sound_speed_map = zeros(Nx, Ny); % 初始化为零矩阵
density_map = zeros(Nx, Ny); % 初始化为零矩阵% 设置水层的位置(上层)
water_height = round(10e-3 / dy); % 水层高度 10 mm
for i = 1:water_height
sound_speed_map(i, :) = sound_speed_water; % 水声速
density_map(i, :) = density_water; % 水密度
end% 设置亚克力层的位置(中层)
acrylic_height = round(10e-3 / dy); % 亚克力层高度 10 mm
for i = water_height + 1:water_height + acrylic_height
sound_speed_map(i, :) = sound_speed_acrylic; % 亚克力声速
density_map(i, :) = density_acrylic; % 亚克力密度
end% 设置铝层的位置(下层)
aluminum_height = round(20e-3 / dy); % 铝层高度 20 mm
for i = water_height + acrylic_height + 1:water_height + acrylic_height + aluminum_height
sound_speed_map(i, :) = sound_speed_aluminum; % 铝层声速
density_map(i, :) = density_aluminum; % 铝层密度
end% 定义缺陷位置(孔)
radius = 1e-3; % 孔的半径
x_center = 300; % 网格中心
y_center = 200; % 孔在亚克力层中间
defect_region = makeDisc(Nx, Ny, x_center, y_center, round(radius/dx), 2 * pi);
sound_speed_map(defect_region == 1) = sound_speed_water; % 孔区域设置为水的声速
density_map(defect_region == 1) = density_water; % 孔区域设置为水的密度% 更新介质属性
medium.sound_speed = sound_speed_map; % 使用有效字段
medium.density = density_map; % 使用有效字段% 从第128个网格点开始进行扫描
start_scan_index = 128; % 设置起始扫描位置
for scan_index = 0:2:(2 * (num_scans - 1)) % 每次跨越两个网格
% 当前发射阵元的起始位置
current_position = start_scan_index + scan_index; % 网格位置从 128 开始% 更新发射阵元的掩码
source.p_mask(:) = 0; % 清除之前的掩码
start_index = current_position - round(num_elements/2) * (element_width + 2); % 计算当前起始索引
for i = 0:num_elements - 1
% 仅在阵元位置设置掩码
source.p_mask(x_offset, start_index + i * (element_width + 2)) = 1;
end% 运行模拟
sensor.mask = zeros(Nx, Ny); % 初始化传感器蒙版
sensor.mask(x_offset, start_index:start_index + (num_elements - 1) * (element_width + 2)) = 0; % 清空传感器蒙版
for i = 0:num_elements - 1
% 仅在阵元位置设置传感器蒙版
sensor.mask(x_offset, start_index + i * (element_width + 2)) = 1; %原来是x_offset,改成的100
end
sensor.record = {'p'}; % 记录声压% 运行模拟
sensor_data = kspaceFirstOrder2D(kgrid, medium, source, sensor, input_args{:});% 存储回波数据,确保维度匹配
echo_data(scan_index / 2 + 1, :, :) = sensor_data.p; % 存储回波数据
end% =========================================================================
% 可视化
% =========================================================================
figure;
plot(sensor_data.p(21,:));
xlabel('时间点');
ylabel('声压 [Pa]');
title('最后一次扫描的声压信号');% 绘制特定扫描的接收到的信号(例如第5次扫描)
figure;
plot(squeeze(echo_data(5, :, :))); % 选择特定扫描和阵元的信号
xlabel('时间点');
ylabel('声压 [Pa]');
title('特定扫描的接收到的信号');% 绘制所有回波数据的示例
figure;
stackedPlot(kgrid.t_array, squeeze(echo_data(5, :, :)));
xlabel('时间 [s]');
ylabel('回波信号');
title('所有数据的示例');Posted 1 week ago #
Reply
You must log in to post.