从零构建CPWC超声仿真:Field II平面波相干合成全流程解析

张开发
2026/5/7 20:38:48 15 分钟阅读
从零构建CPWC超声仿真:Field II平面波相干合成全流程解析
1. 环境准备与Field II基础配置第一次接触Field II时我被它强大的超声仿真能力震撼到了。这个由丹麦理工大学开发的MATLAB工具箱能精准模拟从探头发射到回波接收的完整物理过程。建议先创建一个干净的工程目录我习惯用/projects/cpwc_simulation这样的路径避免与其他项目冲突。安装依赖时要注意MATLAB版本兼容性。实测R2020b以上版本运行最稳定需要确保Signal Processing Toolbox和Image Processing Toolbox已安装。初始化脚本开头一定要加这两行clear all; close all; addpath(genpath(path_to_fieldii));设置物理参数就像调音响系统声速c01540 m/s是超声在软组织中的标准速度采样频率fs100MHz相当于音频里的比特率。这里有个坑我踩过——时间步长dt必须满足dt ≤ 1/(2*fs)否则会出现数值不稳定。建议用c0 1540; fs 100e6; dt 1/(5*fs); % 五倍过采样初始化Field II核心引擎时field_init(0)的0表示不显示调试信息。如果是首次运行建议先设为1检查有无警告。探头建模要用uff.linear_array()就像组装乐高积木probe uff.linear_array(); probe.N 128; % 阵元数量 probe.pitch 0.2e-3; % 阵元间距 probe.element_width 0.18e-3;% 阵元宽度 probe.element_height 5e-3; % 阵元高度2. 探头与脉冲建模实战技巧L11-4v探头建模时中心频率f07.5MHz就像乐器的基准音高。我习惯用波长lambdac0/f0来验证参数合理性正常应该得到约0.2mm的数值。脉冲建模最考验耐心这里分享我的配方pulse_duration 2.5; % 周期数 t (-pulse_duration/2/f0):dt:(pulse_duration/2/f0); excitation sin(2*pi*f0*t); % 基础激励高斯脉冲的分数带宽fractional_bandwidth0.65决定了音色丰富度相当于音频中的高频延伸。有个细节容易被忽略脉冲要减去均值消除直流分量就像音频去噪impulse_response gauspuls(t,f0,0.65); impulse_response impulse_response - mean(impulse_response);发射孔径设置就像调整音响的相位阵列。xdc_linear_array()创建孔径后必须设置聚焦参数。我推荐用动态接收聚焦Th xdc_linear_array(probe.N, probe.element_width, probe.element_height,... probe.pitch, 1, 1, [0 0 Inf]); xdc_excitation(Th, excitation); xdc_impulse(Th, impulse_response);3. 平面波序列的黄金参数F-number是图像质量的命门相当于相机的光圈值。1.7是个甜点值既能保证分辨率又不损失太多穿透力。角度数量Na15时计算量和图像质量达到最佳平衡。角度范围计算公式F_number 1.7; alpha_max atan(1/(2*F_number)); % 最大偏转角度 alpha linspace(-alpha_max, alpha_max, Na);虚拟体模建模时散射点分布就像星空图。我常用随机分布强反射点组合point_position [linspace(-5e-3,5e-3,20); zeros(1,20); linspace(10e-3,15e-3,20)]; point_amplitudes randn(20,1) 2*(rand(20,1)0.9);数据预分配是性能关键。根据我的测试cropat3000能覆盖20mm深度回波cropat round(20e-3/c0*fs); CPW zeros(cropat, probe.N, Na);4. 核心数据采集循环详解发射延迟计算是平面波合成的精髓。probe.geometry(:,1)提取阵元坐标延迟公式x*sin(α)/c0就像调整合唱团的发声时序for n 1:Na delays probe.geometry(:,1)*sin(alpha(n))/c0; xdc_focus_times(Th, 0, delays); [v,t] calc_scat_multi(Th, Rh, point_position, point_amplitudes); CPW(1:size(v,1),:,n) v; end接收端处理有个坑要注意xdc_focus_times(Rh,0,zeros(1,probe.N))必须设为零延迟相当于保持麦克风阵列全开放接收。通道数据封装时时间基准校准很关键channel_data uff.channel_data(); channel_data.sampling_frequency fs; channel_data.sequence seq; channel_data.data permute(CPW,[1 3 2]);最后的成像管线就像照片后期处理。Tukey窗比汉明窗更适合保留细节pipe pipeline(); pipe.receive_apodization.window uff.window.tukey25; pipe.receive_apodization.f_number F_number; b_data pipe.go({midprocess.das() postprocess.coherent_compounding()});实测发现当角度数超过25时分辨率提升不再明显但计算量剧增。建议先用5个角度快速验证流程再逐步增加。最终图像的信噪比与散射点密度直接相关密度太低会出现伪影。

更多文章