【学习记录】射线补偿原理与实现:从物理模型到MATLAB代码

【学习记录】射线补偿原理与实现:从物理模型到MATLAB代码

在经颅超声聚焦中,颅骨会引入严重的相位畸变和幅度衰减。射线补偿(Ray Compensation)是一种快速预补偿方法,通过沿直线积分介质参数,计算每个通道的额外延时和衰减,然后反向补偿。本文从原理、数学公式、离散实现、补偿逻辑到完整实现链条,系统梳理射线补偿的全部知识点,并对照实际脚本说明其局限。


📌 目录

  1. 原理:一句话
  2. 物理模型
  3. 数学公式
  4. 离散实现:梯形积分
  5. 补偿逻辑
  6. 完整实现链条
  7. 对应脚本
  8. 局限
  9. 总结

一、原理:一句话

把声波从阵元到焦点的路径近似成一条直线,沿这条线积分介质的慢度和衰减,得到每通道的额外延时和额外衰减,然后反向补偿。


二、物理模型

2.1 声波走直线

真实声波在骨-水界面会折射,路径弯曲。射线法忽略折射,假设波沿直线从阵元走到焦点。

⚠️ 这是一个近似,但计算极快,适合快速预检。

2.2 沿直线积分

对每个阵元,画一条到焦点的直线。直线上每一点的介质参数(声速、衰减)从 k-Wave 的介质网格里插值得到。

沿这条线积分:

  • 慢度积分 → 总传播时间
  • 衰减积分 → 总衰减

2.3 减去纯水参考

得到"额外延时"和"额外衰减":

💡 这两个差值才是颅骨引入的畸变,需要补偿。


三、数学公式

3.1 额外延时

总传播时间:

纯水参考时间:

额外延时:

3.2 额外衰减

幂律衰减模型:

沿直线积分:

额外衰减:

相对幅度:


四、离散实现:梯形积分

连续积分在代码里用梯形法离散:

matlab 复制代码
% 1. 把直线分成 nIntervals 段
nIntervals = ceil(L / sampleStepMm);   % 采样间隔 = 网格步长的一半
t = linspace(0, 1, nIntervals+1);

% 2. 计算每个采样点的坐标
pointsMm = elementMm + t * (focusMm - elementMm);

% 3. 插值查介质参数
soundSpeed = interpolants.soundSpeed(pointsMm);
alphaCoeff = interpolants.alphaCoeff(pointsMm);

% 4. 梯形权重
weights = ones(nSamples, 1);
weights(1) = 0.5; weights(end) = 0.5;

% 5. 积分
dsMm = L / nIntervals;
travelTimeSec = (dsMm * 1e-3) * sum(weights .* (1 ./ soundSpeed));
alphaIntegral = (dsMm / 10) * sum(weights .* alphaCoeff);

💡 梯形法:把积分区间分成小段,每段用梯形面积近似,再求和。


五、补偿逻辑

5.1 延时补偿

extraDelayUs 是绝对延时------穿骨越厚越大。

补偿:

matlab 复制代码
ref = max(extraDelayUs);
compDelay = ref - extraDelayUs;

物理直觉:

  • 穿骨最厚的通道延时最大 → 补偿量 = 0(它已经最晚)
  • 穿骨最薄的通道延时最小 → 补偿量最大(它需要等)

💡 这样所有通道同时到达焦点。

5.2 幅度补偿

relativeAmplitudeScale 是接收幅度比。

补偿:

matlab 复制代码
gain = relativeAmplitudeScale .^ (-gamma);   % gamma 控制强度
gain = gain / mean(gain);                     % 归一化
gain = (1-blend) + blend * gain;              % 与均匀混合
gain = max(minGain, min(maxGain, gain));      % 限幅

gamma:

gamma值 含义
gamma = 0 不补幅度
gamma = 0.5 半补(ray_compensated)
gamma = 1 全补

⚠️ 限幅:防止把噪声放大。


六、完整实现链条

复制代码
1. 读探头坐标 + 颅骨介质
        ↓
2. 对每个有效阵元:
   a. 画直线到焦点
   b. 沿直线采样介质参数
   c. 梯形积分得时间和衰减
   d. 减去纯水参考
        ↓
3. 输出 focus_channel_attenuation.csv:
   extra_delay_us, relative_amplitude_scale
        ↓
4. 补偿:
   compDelay = max(extraDelay) - extraDelay
   gain = relativeAmplitudeScale .^ (-gamma)
        ↓
5. 构造发射信号:
   source.p(k,:) = gain(k) * circshift(pulse, compDelay(k)/dt)
        ↓
6. 跑 k-Wave,记录焦平面,算指标

七、对应脚本

脚本 职责
simulate_skull_attenuation 画直线、积分、输出补偿表
skull_focus_ray_phase_compensated_export 只补延时,幅度均匀
skull_focus_ray_compensated_export 延时 + 轻度幅度
skull_focus_simulation_export 构造发射信号、跑仿真、算指标

八、局限

假设 真实 后果
直线传播 骨-水界面强折射 相位残差几十度
无多次散射 颅骨内反射、模式转换 能量预测偏差
点源阵元 有限尺寸 2.5 mm 高估焦点锐度
静态介质 颅骨不均匀 个体差异

⚠️ 折射是最大误差源。这就是为什么射线补偿只能到 20--30%,而全波时反能到 50--80%。


九、总结

射线补偿 = 沿直线积分介质参数,得额外延时和衰减,反向补偿。

维度 内容
原理 直线近似 + 数值积分
实现 griddedInterpolant 查参数 + 梯形法积分
补偿 延时取 max - 当前,幅度取 scale^(-gamma)
局限 忽略折射,精度有限
定位 快速预检,不是最终方案

一句话总结:射线补偿是经颅超声聚焦的快速预补偿方法,沿直线积分介质慢度和衰减,得到每通道的额外延时和衰减,反向补偿后让所有通道同时到达焦点。但它忽略了折射这一最大误差源,精度有限,只适合快速预检。

相关推荐
zhanghaha13144 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain4 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕5 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
Z21-X5 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
zhanghaha13145 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#
Rabitebla13 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
麦麦麦当劳大王13 小时前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript
starzy199013 小时前
深入理解Scala Map:从实现原理到工程实践
开发语言·后端·scala
只睡四小时14 小时前
Three.js Sub-tick:漏判 60.7%→0
开发语言·javascript·性能优化·ecmascript·游戏开发·three.js·碰撞检测
码农小河6614 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库